about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorThibaut Girka <thib@sitedethib.com>2019-11-20 15:36:09 +0100
committerThibaut Girka <thib@sitedethib.com>2019-11-20 15:36:09 +0100
commitff67385cfbfd6f5403b2f8b58407dc730dc7e694 (patch)
treea8a0df2129a863a739dda6399352d64af811110e /app
parent707c4918b21d19dd53b64120dbc7263f45fc5ecd (diff)
parent8dfc45f757ed8995be0d16e88a1f1d6514dae677 (diff)
Merge branch 'master' into glitch-soc/merge-upstream
Conflicts:
- README.md
  discarded upstream changes
- app/controllers/api/v1/bookmarks_controller.rb
  finally merged upstream, some code style fixes
  and slightly changed pagination code
- app/controllers/application_controller.rb
  changed upstream to always return HTML error pages
  slight conflict caused by theming code
- app/models/bookmark.rb
  finally merged upstream, no real conflict
- spec/controllers/api/v1/bookmarks_controller_spec.rb
  finally merged upstream, slightly changed pagination code
Diffstat (limited to 'app')
-rw-r--r--app/controllers/api/v1/accounts/credentials_controller.rb2
-rw-r--r--app/controllers/api/v1/bookmarks_controller.rb13
-rw-r--r--app/controllers/application_controller.rb10
-rw-r--r--app/helpers/admin/action_logs_helper.rb6
-rw-r--r--app/helpers/settings_helper.rb3
-rw-r--r--app/javascript/mastodon/actions/bookmarks.js90
-rw-r--r--app/javascript/mastodon/actions/interactions.js80
-rw-r--r--app/javascript/mastodon/components/status_action_bar.js96
-rw-r--r--app/javascript/mastodon/containers/dropdown_menu_container.js6
-rw-r--r--app/javascript/mastodon/containers/status_container.js42
-rw-r--r--app/javascript/mastodon/features/bookmarked_statuses/index.js104
-rw-r--r--app/javascript/mastodon/features/community_timeline/index.js7
-rw-r--r--app/javascript/mastodon/features/getting_started/index.js4
-rw-r--r--app/javascript/mastodon/features/public_timeline/index.js8
-rw-r--r--app/javascript/mastodon/features/status/components/action_bar.js97
-rw-r--r--app/javascript/mastodon/features/status/index.js47
-rw-r--r--app/javascript/mastodon/features/ui/components/columns_area.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/navigation_panel.js1
-rw-r--r--app/javascript/mastodon/features/ui/index.js2
-rw-r--r--app/javascript/mastodon/features/ui/util/async-components.js4
-rw-r--r--app/javascript/mastodon/locales/ar.json18
-rw-r--r--app/javascript/mastodon/locales/bg.json10
-rw-r--r--app/javascript/mastodon/locales/bn.json148
-rw-r--r--app/javascript/mastodon/locales/cy.json16
-rw-r--r--app/javascript/mastodon/locales/da.json18
-rw-r--r--app/javascript/mastodon/locales/de.json2
-rw-r--r--app/javascript/mastodon/locales/es-AR.json6
-rw-r--r--app/javascript/mastodon/locales/et.json72
-rw-r--r--app/javascript/mastodon/locales/eu.json14
-rw-r--r--app/javascript/mastodon/locales/fi.json22
-rw-r--r--app/javascript/mastodon/locales/fr.json74
-rw-r--r--app/javascript/mastodon/locales/hi.json508
-rw-r--r--app/javascript/mastodon/locales/hu.json98
-rw-r--r--app/javascript/mastodon/locales/hy.json4
-rw-r--r--app/javascript/mastodon/locales/id.json156
-rw-r--r--app/javascript/mastodon/locales/it.json20
-rw-r--r--app/javascript/mastodon/locales/kk.json92
-rw-r--r--app/javascript/mastodon/locales/kn.json423
-rw-r--r--app/javascript/mastodon/locales/ko.json8
-rw-r--r--app/javascript/mastodon/locales/mk.json350
-rw-r--r--app/javascript/mastodon/locales/ml.json423
-rw-r--r--app/javascript/mastodon/locales/mr.json423
-rw-r--r--app/javascript/mastodon/locales/nl.json12
-rw-r--r--app/javascript/mastodon/locales/nn.json354
-rw-r--r--app/javascript/mastodon/locales/no.json74
-rw-r--r--app/javascript/mastodon/locales/oc.json10
-rw-r--r--app/javascript/mastodon/locales/pl.json4
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json72
-rw-r--r--app/javascript/mastodon/locales/ru.json52
-rw-r--r--app/javascript/mastodon/locales/sk.json26
-rw-r--r--app/javascript/mastodon/locales/sl.json2
-rw-r--r--app/javascript/mastodon/locales/sv.json124
-rw-r--r--app/javascript/mastodon/locales/ta.json204
-rw-r--r--app/javascript/mastodon/locales/th.json42
-rw-r--r--app/javascript/mastodon/locales/tr.json42
-rw-r--r--app/javascript/mastodon/locales/uk.json26
-rw-r--r--app/javascript/mastodon/locales/ur.json423
-rw-r--r--app/javascript/mastodon/locales/whitelist_kn.json2
-rw-r--r--app/javascript/mastodon/locales/whitelist_ml.json2
-rw-r--r--app/javascript/mastodon/locales/whitelist_mr.json2
-rw-r--r--app/javascript/mastodon/locales/whitelist_ur.json2
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json76
-rw-r--r--app/javascript/mastodon/reducers/status_lists.js29
-rw-r--r--app/javascript/mastodon/reducers/statuses.js6
-rw-r--r--app/javascript/styles/mastodon/components.scss4
-rw-r--r--app/javascript/styles/mastodon/variables.scss2
-rw-r--r--app/lib/feed_manager.rb2
-rw-r--r--app/models/bookmark.rb6
-rw-r--r--app/services/fetch_link_card_service.rb23
-rw-r--r--app/services/fetch_oembed_service.rb31
-rw-r--r--app/services/resolve_url_service.rb6
71 files changed, 3749 insertions, 1440 deletions
diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb
index e77f57910..64b5cb747 100644
--- a/app/controllers/api/v1/accounts/credentials_controller.rb
+++ b/app/controllers/api/v1/accounts/credentials_controller.rb
@@ -25,7 +25,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
   end
 
   def user_settings_params
-    return nil unless params.key?(:source)
+    return nil if params[:source].blank?
 
     source_params = params.require(:source)
 
diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb
index 1cab3c372..e1b244e76 100644
--- a/app/controllers/api/v1/bookmarks_controller.rb
+++ b/app/controllers/api/v1/bookmarks_controller.rb
@@ -26,10 +26,9 @@ class Api::V1::BookmarksController < Api::BaseController
   end
 
   def results
-    @_results ||= account_bookmarks.paginate_by_max_id(
+    @_results ||= account_bookmarks.paginate_by_id(
       limit_param(DEFAULT_STATUSES_LIMIT),
-      params[:max_id],
-      params[:since_id]
+      params_slice(:max_id, :since_id, :min_id)
     )
   end
 
@@ -42,15 +41,11 @@ class Api::V1::BookmarksController < Api::BaseController
   end
 
   def next_path
-    if records_continue?
-      api_v1_bookmarks_url pagination_params(max_id: pagination_max_id)
-    end
+    api_v1_bookmarks_url pagination_params(max_id: pagination_max_id) if records_continue?
   end
 
   def prev_path
-    unless results.empty?
-      api_v1_bookmarks_url pagination_params(since_id: pagination_since_id)
-    end
+    api_v1_bookmarks_url pagination_params(min_id: pagination_since_id) unless results.empty?
   end
 
   def pagination_max_id
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 92339ce2f..599c64062 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -211,13 +211,7 @@ class ApplicationController < ActionController::Base
   end
 
   def respond_with_error(code)
-    respond_to do |format|
-      format.any  { head code }
-
-      format.html do
-        use_pack 'error'
-        render "errors/#{code}", layout: 'error', status: code
-      end
-    end
+    use_pack 'error'
+    render "errors/#{code}", layout: 'error', status: code
   end
 end
diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb
index 1daa60774..608a99dd5 100644
--- a/app/helpers/admin/action_logs_helper.rb
+++ b/app/helpers/admin/action_logs_helper.rb
@@ -44,6 +44,8 @@ module Admin::ActionLogsHelper
       'flag'
     when 'DomainBlock'
       'lock'
+    when 'DomainAllow'
+      'plus-circle'
     when 'EmailDomainBlock'
       'envelope'
     when 'Status'
@@ -86,7 +88,7 @@ module Admin::ActionLogsHelper
       record.shortcode
     when 'Report'
       link_to "##{record.id}", admin_report_path(record)
-    when 'DomainBlock', 'EmailDomainBlock'
+    when 'DomainBlock', 'DomainAllow', 'EmailDomainBlock'
       link_to record.domain, "https://#{record.domain}"
     when 'Status'
       link_to record.account.acct, ActivityPub::TagManager.instance.url_for(record)
@@ -99,7 +101,7 @@ module Admin::ActionLogsHelper
     case type
     when 'CustomEmoji'
       attributes['shortcode']
-    when 'DomainBlock', 'EmailDomainBlock'
+    when 'DomainBlock', 'DomainAllow', 'EmailDomainBlock'
       link_to attributes['domain'], "https://#{attributes['domain']}"
     when 'Status'
       tmp_status = Status.new(attributes.except('reblogs_count', 'favourites_count'))
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index aa0a4d467..39eb4180e 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -36,11 +36,13 @@ module SettingsHelper
     ja: '日本語',
     ka: 'ქართული',
     kk: 'Қазақша',
+    kn: 'ಕನ್ನಡ',
     ko: '한국어',
     lt: 'Lietuvių',
     lv: 'Latviešu',
     mk: 'Македонски',
     ml: 'മലയാളം',
+    mr: 'मराठी',
     ms: 'Bahasa Melayu',
     nl: 'Nederlands',
     nn: 'Nynorsk',
@@ -63,6 +65,7 @@ module SettingsHelper
     th: 'ไทย',
     tr: 'Türkçe',
     uk: 'Українська',
+    ur: 'اُردُو',
     'zh-CN': '简体中文',
     'zh-HK': '繁體中文(香港)',
     'zh-TW': '繁體中文(臺灣)',
diff --git a/app/javascript/mastodon/actions/bookmarks.js b/app/javascript/mastodon/actions/bookmarks.js
new file mode 100644
index 000000000..544ed2ff2
--- /dev/null
+++ b/app/javascript/mastodon/actions/bookmarks.js
@@ -0,0 +1,90 @@
+import api, { getLinks } from '../api';
+import { importFetchedStatuses } from './importer';
+
+export const BOOKMARKED_STATUSES_FETCH_REQUEST = 'BOOKMARKED_STATUSES_FETCH_REQUEST';
+export const BOOKMARKED_STATUSES_FETCH_SUCCESS = 'BOOKMARKED_STATUSES_FETCH_SUCCESS';
+export const BOOKMARKED_STATUSES_FETCH_FAIL    = 'BOOKMARKED_STATUSES_FETCH_FAIL';
+
+export const BOOKMARKED_STATUSES_EXPAND_REQUEST = 'BOOKMARKED_STATUSES_EXPAND_REQUEST';
+export const BOOKMARKED_STATUSES_EXPAND_SUCCESS = 'BOOKMARKED_STATUSES_EXPAND_SUCCESS';
+export const BOOKMARKED_STATUSES_EXPAND_FAIL    = 'BOOKMARKED_STATUSES_EXPAND_FAIL';
+
+export function fetchBookmarkedStatuses() {
+  return (dispatch, getState) => {
+    if (getState().getIn(['status_lists', 'bookmarks', 'isLoading'])) {
+      return;
+    }
+
+    dispatch(fetchBookmarkedStatusesRequest());
+
+    api(getState).get('/api/v1/bookmarks').then(response => {
+      const next = getLinks(response).refs.find(link => link.rel === 'next');
+      dispatch(importFetchedStatuses(response.data));
+      dispatch(fetchBookmarkedStatusesSuccess(response.data, next ? next.uri : null));
+    }).catch(error => {
+      dispatch(fetchBookmarkedStatusesFail(error));
+    });
+  };
+};
+
+export function fetchBookmarkedStatusesRequest() {
+  return {
+    type: BOOKMARKED_STATUSES_FETCH_REQUEST,
+  };
+};
+
+export function fetchBookmarkedStatusesSuccess(statuses, next) {
+  return {
+    type: BOOKMARKED_STATUSES_FETCH_SUCCESS,
+    statuses,
+    next,
+  };
+};
+
+export function fetchBookmarkedStatusesFail(error) {
+  return {
+    type: BOOKMARKED_STATUSES_FETCH_FAIL,
+    error,
+  };
+};
+
+export function expandBookmarkedStatuses() {
+  return (dispatch, getState) => {
+    const url = getState().getIn(['status_lists', 'bookmarks', 'next'], null);
+
+    if (url === null || getState().getIn(['status_lists', 'bookmarks', 'isLoading'])) {
+      return;
+    }
+
+    dispatch(expandBookmarkedStatusesRequest());
+
+    api(getState).get(url).then(response => {
+      const next = getLinks(response).refs.find(link => link.rel === 'next');
+      dispatch(importFetchedStatuses(response.data));
+      dispatch(expandBookmarkedStatusesSuccess(response.data, next ? next.uri : null));
+    }).catch(error => {
+      dispatch(expandBookmarkedStatusesFail(error));
+    });
+  };
+};
+
+export function expandBookmarkedStatusesRequest() {
+  return {
+    type: BOOKMARKED_STATUSES_EXPAND_REQUEST,
+  };
+};
+
+export function expandBookmarkedStatusesSuccess(statuses, next) {
+  return {
+    type: BOOKMARKED_STATUSES_EXPAND_SUCCESS,
+    statuses,
+    next,
+  };
+};
+
+export function expandBookmarkedStatusesFail(error) {
+  return {
+    type: BOOKMARKED_STATUSES_EXPAND_FAIL,
+    error,
+  };
+};
diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js
index 2dc4c574c..28c6b1a62 100644
--- a/app/javascript/mastodon/actions/interactions.js
+++ b/app/javascript/mastodon/actions/interactions.js
@@ -33,6 +33,14 @@ export const UNPIN_REQUEST = 'UNPIN_REQUEST';
 export const UNPIN_SUCCESS = 'UNPIN_SUCCESS';
 export const UNPIN_FAIL    = 'UNPIN_FAIL';
 
+export const BOOKMARK_REQUEST = 'BOOKMARK_REQUEST';
+export const BOOKMARK_SUCCESS = 'BOOKMARKED_SUCCESS';
+export const BOOKMARK_FAIL    = 'BOOKMARKED_FAIL';
+
+export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST';
+export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS';
+export const UNBOOKMARK_FAIL    = 'UNBOOKMARKED_FAIL';
+
 export function reblog(status) {
   return function (dispatch, getState) {
     dispatch(reblogRequest(status));
@@ -187,6 +195,78 @@ export function unfavouriteFail(status, error) {
   };
 };
 
+export function bookmark(status) {
+  return function (dispatch, getState) {
+    dispatch(bookmarkRequest(status));
+
+    api(getState).post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function (response) {
+      dispatch(importFetchedStatus(response.data));
+      dispatch(bookmarkSuccess(status, response.data));
+    }).catch(function (error) {
+      dispatch(bookmarkFail(status, error));
+    });
+  };
+};
+
+export function unbookmark(status) {
+  return (dispatch, getState) => {
+    dispatch(unbookmarkRequest(status));
+
+    api(getState).post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => {
+      dispatch(importFetchedStatus(response.data));
+      dispatch(unbookmarkSuccess(status, response.data));
+    }).catch(error => {
+      dispatch(unbookmarkFail(status, error));
+    });
+  };
+};
+
+export function bookmarkRequest(status) {
+  return {
+    type: BOOKMARK_REQUEST,
+    status: status,
+  };
+};
+
+export function bookmarkSuccess(status, response) {
+  return {
+    type: BOOKMARK_SUCCESS,
+    status: status,
+    response: response,
+  };
+};
+
+export function bookmarkFail(status, error) {
+  return {
+    type: BOOKMARK_FAIL,
+    status: status,
+    error: error,
+  };
+};
+
+export function unbookmarkRequest(status) {
+  return {
+    type: UNBOOKMARK_REQUEST,
+    status: status,
+  };
+};
+
+export function unbookmarkSuccess(status, response) {
+  return {
+    type: UNBOOKMARK_SUCCESS,
+    status: status,
+    response: response,
+  };
+};
+
+export function unbookmarkFail(status, error) {
+  return {
+    type: UNBOOKMARK_FAIL,
+    status: status,
+    error: error,
+  };
+};
+
 export function fetchReblogs(id) {
   return (dispatch, getState) => {
     dispatch(fetchReblogsRequest(id));
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 0bfbd8879..bd3bb16bb 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -1,5 +1,6 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import IconButton from './icon_button';
 import DropdownMenuContainer from '../containers/dropdown_menu_container';
@@ -23,6 +24,8 @@ const messages = defineMessages({
   cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
   cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
   favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
+  bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
+  removeBookmark: { id: 'status.remove_bookmark', defaultMessage: 'Remove bookmark' },
   open: { id: 'status.open', defaultMessage: 'Expand this status' },
   report: { id: 'status.report', defaultMessage: 'Report @{name}' },
   muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
@@ -33,6 +36,10 @@ const messages = defineMessages({
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
   copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
+  blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
+  unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
+  unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
+  unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
 });
 
 const obfuscatedCount = count => {
@@ -45,7 +52,12 @@ const obfuscatedCount = count => {
   }
 };
 
-export default @injectIntl
+const mapStateToProps = (state, { status }) => ({
+  relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),
+});
+
+export default @connect(mapStateToProps)
+@injectIntl
 class StatusActionBar extends ImmutablePureComponent {
 
   static contextTypes = {
@@ -54,6 +66,7 @@ class StatusActionBar extends ImmutablePureComponent {
 
   static propTypes = {
     status: ImmutablePropTypes.map.isRequired,
+    relationship: ImmutablePropTypes.map,
     onReply: PropTypes.func,
     onFavourite: PropTypes.func,
     onReblog: PropTypes.func,
@@ -61,11 +74,16 @@ class StatusActionBar extends ImmutablePureComponent {
     onDirect: PropTypes.func,
     onMention: PropTypes.func,
     onMute: PropTypes.func,
+    onUnmute: PropTypes.func,
     onBlock: PropTypes.func,
+    onUnblock: PropTypes.func,
+    onBlockDomain: PropTypes.func,
+    onUnblockDomain: PropTypes.func,
     onReport: PropTypes.func,
     onEmbed: PropTypes.func,
     onMuteConversation: PropTypes.func,
     onPin: PropTypes.func,
+    onBookmark: PropTypes.func,
     withDismiss: PropTypes.bool,
     intl: PropTypes.object.isRequired,
   };
@@ -74,6 +92,7 @@ class StatusActionBar extends ImmutablePureComponent {
   // evaluate to false. See react-immutable-pure-component for usage.
   updateOnProps = [
     'status',
+    'relationship',
     'withDismiss',
   ]
 
@@ -114,6 +133,10 @@ class StatusActionBar extends ImmutablePureComponent {
     window.open(`/interact/${this.props.status.get('id')}?type=${type}`, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');
   }
 
+  handleBookmarkClick = () => {
+    this.props.onBookmark(this.props.status);
+  }
+
   handleDeleteClick = () => {
     this.props.onDelete(this.props.status, this.context.router.history);
   }
@@ -135,11 +158,39 @@ class StatusActionBar extends ImmutablePureComponent {
   }
 
   handleMuteClick = () => {
-    this.props.onMute(this.props.status.get('account'));
+    const { status, relationship, onMute, onUnmute } = this.props;
+    const account = status.get('account');
+
+    if (relationship && relationship.get('muting')) {
+      onUnmute(account);
+    } else {
+      onMute(account);
+    }
   }
 
   handleBlockClick = () => {
-    this.props.onBlock(this.props.status);
+    const { status, relationship, onBlock, onUnblock } = this.props;
+    const account = status.get('account');
+
+    if (relationship && relationship.get('blocking')) {
+      onBlock(status);
+    } else {
+      onUnblock(account);
+    }
+  }
+
+  handleBlockDomain = () => {
+    const { status, onBlockDomain } = this.props;
+    const account = status.get('account');
+
+    onBlockDomain(account.get('acct').split('@')[1]);
+  }
+
+  handleUnblockDomain = () => {
+    const { status, onUnblockDomain } = this.props;
+    const account = status.get('account');
+
+    onUnblockDomain(account.get('acct').split('@')[1]);
   }
 
   handleOpen = () => {
@@ -178,11 +229,12 @@ class StatusActionBar extends ImmutablePureComponent {
   }
 
   render () {
-    const { status, intl, withDismiss } = this.props;
+    const { status, relationship, intl, withDismiss } = this.props;
 
     const mutingConversation = status.get('muted');
     const anonymousAccess    = !me;
     const publicStatus       = ['public', 'unlisted'].includes(status.get('visibility'));
+    const account            = status.get('account');
 
     let menu = [];
     let reblogIcon = 'retweet';
@@ -196,6 +248,7 @@ class StatusActionBar extends ImmutablePureComponent {
       menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
     }
 
+    menu.push({ text: intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark), action: this.handleBookmarkClick });
     menu.push(null);
 
     if (status.getIn(['account', 'id']) === me || withDismiss) {
@@ -215,16 +268,39 @@ class StatusActionBar extends ImmutablePureComponent {
       menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
       menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });
     } else {
-      menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
-      menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });
+      menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.handleMentionClick });
+      menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.handleDirectClick });
       menu.push(null);
-      menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
-      menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
-      menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
+
+      if (relationship && relationship.get('muting')) {
+        menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.handleMuteClick });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.handleMuteClick });
+      }
+
+      if (relationship && relationship.get('blocking')) {
+        menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.handleBlockClick });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.handleBlockClick });
+      }
+
+      menu.push({ text: intl.formatMessage(messages.report, { name: account.get('username') }), action: this.handleReport });
+
+      if (account.get('acct') !== account.get('username')) {
+        const domain = account.get('acct').split('@')[1];
+
+        menu.push(null);
+
+        if (relationship && relationship.get('domain_blocking')) {
+          menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.handleUnblockDomain });
+        } else {
+          menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.handleBlockDomain });
+        }
+      }
 
       if (isStaff) {
         menu.push(null);
-        menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
+        menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
         menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });
       }
     }
diff --git a/app/javascript/mastodon/containers/dropdown_menu_container.js b/app/javascript/mastodon/containers/dropdown_menu_container.js
index f79b19202..ab1823194 100644
--- a/app/javascript/mastodon/containers/dropdown_menu_container.js
+++ b/app/javascript/mastodon/containers/dropdown_menu_container.js
@@ -1,4 +1,5 @@
 import { openDropdownMenu, closeDropdownMenu } from '../actions/dropdown_menu';
+import { fetchRelationships } from 'mastodon/actions/accounts';
 import { openModal, closeModal } from '../actions/modal';
 import { connect } from 'react-redux';
 import DropdownMenu from '../components/dropdown_menu';
@@ -13,12 +14,17 @@ const mapStateToProps = state => ({
 
 const mapDispatchToProps = (dispatch, { status, items }) => ({
   onOpen(id, onItemClick, dropdownPlacement, keyboard) {
+    if (status) {
+      dispatch(fetchRelationships([status.getIn(['account', 'id'])]));
+    }
+
     dispatch(isUserTouching() ? openModal('ACTIONS', {
       status,
       actions: items,
       onClick: onItemClick,
     }) : openDropdownMenu(id, dropdownPlacement, keyboard));
   },
+
   onClose(id) {
     dispatch(closeModal('ACTIONS'));
     dispatch(closeDropdownMenu(id));
diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js
index fb22676e0..35c16a20c 100644
--- a/app/javascript/mastodon/containers/status_container.js
+++ b/app/javascript/mastodon/containers/status_container.js
@@ -1,3 +1,4 @@
+import React from 'react';
 import { connect } from 'react-redux';
 import Status from '../components/status';
 import { makeGetStatus } from '../selectors';
@@ -9,8 +10,10 @@ import {
 import {
   reblog,
   favourite,
+  bookmark,
   unreblog,
   unfavourite,
+  unbookmark,
   pin,
   unpin,
 } from '../actions/interactions';
@@ -21,11 +24,19 @@ import {
   hideStatus,
   revealStatus,
 } from '../actions/statuses';
+import {
+  unmuteAccount,
+  unblockAccount,
+} from '../actions/accounts';
+import {
+  blockDomain,
+  unblockDomain,
+} from '../actions/domain_blocks';
 import { initMuteModal } from '../actions/mutes';
 import { initBlockModal } from '../actions/blocks';
 import { initReport } from '../actions/reports';
 import { openModal } from '../actions/modal';
-import { defineMessages, injectIntl } from 'react-intl';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { boostModal, deleteModal } from '../initial_state';
 import { showAlertForError } from '../actions/alerts';
 
@@ -36,6 +47,7 @@ const messages = defineMessages({
   redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' },
   replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
   replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
+  blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },
 });
 
 const makeMapStateToProps = () => {
@@ -90,6 +102,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     }
   },
 
+  onBookmark (status) {
+    if (status.get('bookmarked')) {
+      dispatch(unbookmark(status));
+    } else {
+      dispatch(bookmark(status));
+    }
+  },
+
   onPin (status) {
     if (status.get('pinned')) {
       dispatch(unpin(status));
@@ -138,6 +158,10 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     dispatch(initBlockModal(account));
   },
 
+  onUnblock (account) {
+    dispatch(unblockAccount(account.get('id')));
+  },
+
   onReport (status) {
     dispatch(initReport(status.get('account'), status));
   },
@@ -146,6 +170,10 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     dispatch(initMuteModal(account));
   },
 
+  onUnmute (account) {
+    dispatch(unmuteAccount(account.get('id')));
+  },
+
   onMuteConversation (status) {
     if (status.get('muted')) {
       dispatch(unmuteStatus(status.get('id')));
@@ -162,6 +190,18 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     }
   },
 
+  onBlockDomain (domain) {
+    dispatch(openModal('CONFIRM', {
+      message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.' values={{ domain: <strong>{domain}</strong> }} />,
+      confirm: intl.formatMessage(messages.blockDomainConfirm),
+      onConfirm: () => dispatch(blockDomain(domain)),
+    }));
+  },
+
+  onUnblockDomain (domain) {
+    dispatch(unblockDomain(domain));
+  },
+
 });
 
 export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status));
diff --git a/app/javascript/mastodon/features/bookmarked_statuses/index.js b/app/javascript/mastodon/features/bookmarked_statuses/index.js
new file mode 100644
index 000000000..c37cb9176
--- /dev/null
+++ b/app/javascript/mastodon/features/bookmarked_statuses/index.js
@@ -0,0 +1,104 @@
+import React from 'react';
+import { connect } from 'react-redux';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { fetchBookmarkedStatuses, expandBookmarkedStatuses } from '../../actions/bookmarks';
+import Column from '../ui/components/column';
+import ColumnHeader from '../../components/column_header';
+import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
+import StatusList from '../../components/status_list';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import { debounce } from 'lodash';
+
+const messages = defineMessages({
+  heading: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' },
+});
+
+const mapStateToProps = state => ({
+  statusIds: state.getIn(['status_lists', 'bookmarks', 'items']),
+  isLoading: state.getIn(['status_lists', 'bookmarks', 'isLoading'], true),
+  hasMore: !!state.getIn(['status_lists', 'bookmarks', 'next']),
+});
+
+export default @connect(mapStateToProps)
+@injectIntl
+class Bookmarks extends ImmutablePureComponent {
+
+  static propTypes = {
+    dispatch: PropTypes.func.isRequired,
+    shouldUpdateScroll: PropTypes.func,
+    statusIds: ImmutablePropTypes.list.isRequired,
+    intl: PropTypes.object.isRequired,
+    columnId: PropTypes.string,
+    multiColumn: PropTypes.bool,
+    hasMore: PropTypes.bool,
+    isLoading: PropTypes.bool,
+  };
+
+  componentWillMount () {
+    this.props.dispatch(fetchBookmarkedStatuses());
+  }
+
+  handlePin = () => {
+    const { columnId, dispatch } = this.props;
+
+    if (columnId) {
+      dispatch(removeColumn(columnId));
+    } else {
+      dispatch(addColumn('BOOKMARKS', {}));
+    }
+  }
+
+  handleMove = (dir) => {
+    const { columnId, dispatch } = this.props;
+    dispatch(moveColumn(columnId, dir));
+  }
+
+  handleHeaderClick = () => {
+    this.column.scrollTop();
+  }
+
+  setRef = c => {
+    this.column = c;
+  }
+
+  handleLoadMore = debounce(() => {
+    this.props.dispatch(expandBookmarkedStatuses());
+  }, 300, { leading: true })
+
+  render () {
+    const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props;
+    const pinned = !!columnId;
+
+    const emptyMessage = <FormattedMessage id='empty_column.bookmarked_statuses' defaultMessage="You don't have any bookmarked toots yet. When you bookmark one, it will show up here." />;
+
+    return (
+      <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.heading)}>
+        <ColumnHeader
+          icon='bookmark'
+          title={intl.formatMessage(messages.heading)}
+          onPin={this.handlePin}
+          onMove={this.handleMove}
+          onClick={this.handleHeaderClick}
+          pinned={pinned}
+          multiColumn={multiColumn}
+          showBackButton
+        />
+
+        <StatusList
+          trackScroll={!pinned}
+          statusIds={statusIds}
+          scrollKey={`bookmarked_statuses-${columnId}`}
+          hasMore={hasMore}
+          isLoading={isLoading}
+          onLoadMore={this.handleLoadMore}
+          shouldUpdateScroll={shouldUpdateScroll}
+          emptyMessage={emptyMessage}
+          bindToDocument={!multiColumn}
+        />
+      </Column>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/community_timeline/index.js b/app/javascript/mastodon/features/community_timeline/index.js
index 30153cc15..b3cd39685 100644
--- a/app/javascript/mastodon/features/community_timeline/index.js
+++ b/app/javascript/mastodon/features/community_timeline/index.js
@@ -14,15 +14,16 @@ const messages = defineMessages({
   title: { id: 'column.community', defaultMessage: 'Local timeline' },
 });
 
-const mapStateToProps = (state, { onlyMedia, columnId }) => {
+const mapStateToProps = (state, { columnId }) => {
   const uuid = columnId;
   const columns = state.getIn(['settings', 'columns']);
   const index = columns.findIndex(c => c.get('uuid') === uuid);
+  const onlyMedia = (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']);
   const timelineState = state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`]);
 
   return {
-    hasUnread: !!timelineState && (timelineState.get('unread') > 0 || timelineState.get('pendingItems').size > 0),
-    onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']),
+    hasUnread: !!timelineState && timelineState.get('unread') > 0,
+    onlyMedia,
   };
 };
 
diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index 67ec7665b..adbc147d1 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -22,6 +22,7 @@ const messages = defineMessages({
   settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },
   community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },
   direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' },
+  bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },
   preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
   follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
   favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
@@ -126,11 +127,12 @@ class GettingStarted extends ImmutablePureComponent {
 
     navItems.push(
       <ColumnLink key={i++} icon='envelope' text={intl.formatMessage(messages.direct)} to='/timelines/direct' />,
+      <ColumnLink key={i++} icon='bookmark' text={intl.formatMessage(messages.bookmarks)} to='/bookmarks' />,
       <ColumnLink key={i++} icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />,
       <ColumnLink key={i++} icon='list-ul' text={intl.formatMessage(messages.lists)} to='/lists' />
     );
 
-    height += 48*3;
+    height += 48*4;
 
     if (myAccount.get('locked') || unreadFollowRequests > 0) {
       navItems.push(<ColumnLink key={i++} icon='user-plus' text={intl.formatMessage(messages.follow_requests)} badge={badgeDisplay(unreadFollowRequests, 40)} to='/follow_requests' />);
diff --git a/app/javascript/mastodon/features/public_timeline/index.js b/app/javascript/mastodon/features/public_timeline/index.js
index e7825e236..7aabd7f6e 100644
--- a/app/javascript/mastodon/features/public_timeline/index.js
+++ b/app/javascript/mastodon/features/public_timeline/index.js
@@ -14,14 +14,16 @@ const messages = defineMessages({
   title: { id: 'column.public', defaultMessage: 'Federated timeline' },
 });
 
-const mapStateToProps = (state, { onlyMedia, columnId }) => {
+const mapStateToProps = (state, { columnId }) => {
   const uuid = columnId;
   const columns = state.getIn(['settings', 'columns']);
   const index = columns.findIndex(c => c.get('uuid') === uuid);
+  const onlyMedia = (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'public', 'other', 'onlyMedia']);
+  const timelineState = state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`]);
 
   return {
-    hasUnread: state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`, 'unread']) > 0,
-    onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'public', 'other', 'onlyMedia']),
+    hasUnread: !!timelineState && timelineState.get('unread') > 0,
+    onlyMedia,
   };
 };
 
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index 3e511b7a6..76334de69 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -1,5 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
+import { connect } from 'react-redux';
 import IconButton from '../../../components/icon_button';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import DropdownMenuContainer from '../../../containers/dropdown_menu_container';
@@ -17,6 +18,7 @@ const messages = defineMessages({
   cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
   cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
   favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
+  bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
   mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },
   muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
   unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
@@ -29,9 +31,18 @@ const messages = defineMessages({
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
   copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
+  blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
+  unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
+  unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
+  unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
 });
 
-export default @injectIntl
+const mapStateToProps = (state, { status }) => ({
+  relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),
+});
+
+export default @connect(mapStateToProps)
+@injectIntl
 class ActionBar extends React.PureComponent {
 
   static contextTypes = {
@@ -40,15 +51,21 @@ class ActionBar extends React.PureComponent {
 
   static propTypes = {
     status: ImmutablePropTypes.map.isRequired,
+    relationship: ImmutablePropTypes.map,
     onReply: PropTypes.func.isRequired,
     onReblog: PropTypes.func.isRequired,
     onFavourite: PropTypes.func.isRequired,
+    onBookmark: PropTypes.func.isRequired,
     onDelete: PropTypes.func.isRequired,
     onDirect: PropTypes.func.isRequired,
     onMention: PropTypes.func.isRequired,
     onMute: PropTypes.func,
-    onMuteConversation: PropTypes.func,
+    onUnmute: PropTypes.func,
     onBlock: PropTypes.func,
+    onUnblock: PropTypes.func,
+    onBlockDomain: PropTypes.func,
+    onUnblockDomain: PropTypes.func,
+    onMuteConversation: PropTypes.func,
     onReport: PropTypes.func,
     onPin: PropTypes.func,
     onEmbed: PropTypes.func,
@@ -67,6 +84,10 @@ class ActionBar extends React.PureComponent {
     this.props.onFavourite(this.props.status);
   }
 
+  handleBookmarkClick = (e) => {
+    this.props.onBookmark(this.props.status, e);
+  }
+
   handleDeleteClick = () => {
     this.props.onDelete(this.props.status, this.context.router.history);
   }
@@ -84,15 +105,43 @@ class ActionBar extends React.PureComponent {
   }
 
   handleMuteClick = () => {
-    this.props.onMute(this.props.status.get('account'));
-  }
+    const { status, relationship, onMute, onUnmute } = this.props;
+    const account = status.get('account');
 
-  handleConversationMuteClick = () => {
-    this.props.onMuteConversation(this.props.status);
+    if (relationship && relationship.get('muting')) {
+      onUnmute(account);
+    } else {
+      onMute(account);
+    }
   }
 
   handleBlockClick = () => {
-    this.props.onBlock(this.props.status);
+    const { status, relationship, onBlock, onUnblock } = this.props;
+    const account = status.get('account');
+
+    if (relationship && relationship.get('blocking')) {
+      onBlock(status);
+    } else {
+      onUnblock(account);
+    }
+  }
+
+  handleBlockDomain = () => {
+    const { status, onBlockDomain } = this.props;
+    const account = status.get('account');
+
+    onBlockDomain(account.get('acct').split('@')[1]);
+  }
+
+  handleUnblockDomain = () => {
+    const { status, onUnblockDomain } = this.props;
+    const account = status.get('account');
+
+    onUnblockDomain(account.get('acct').split('@')[1]);
+  }
+
+  handleConversationMuteClick = () => {
+    this.props.onMuteConversation(this.props.status);
   }
 
   handleReport = () => {
@@ -134,10 +183,11 @@ class ActionBar extends React.PureComponent {
   }
 
   render () {
-    const { status, intl } = this.props;
+    const { status, relationship, intl } = this.props;
 
     const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
     const mutingConversation = status.get('muted');
+    const account            = status.get('account');
 
     let menu = [];
 
@@ -165,9 +215,33 @@ class ActionBar extends React.PureComponent {
       menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
       menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });
       menu.push(null);
-      menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
-      menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
+
+      if (relationship && relationship.get('muting')) {
+        menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.handleMuteClick });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.handleMuteClick });
+      }
+
+      if (relationship && relationship.get('blocking')) {
+        menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.handleBlockClick });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.handleBlockClick });
+      }
+
       menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
+
+      if (account.get('acct') !== account.get('username')) {
+        const domain = account.get('acct').split('@')[1];
+
+        menu.push(null);
+
+        if (relationship && relationship.get('domain_blocking')) {
+          menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.handleUnblockDomain });
+        } else {
+          menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.handleBlockDomain });
+        }
+      }
+
       if (isStaff) {
         menu.push(null);
         menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
@@ -198,9 +272,10 @@ class ActionBar extends React.PureComponent {
         <div className='detailed-status__button'><IconButton disabled={reblog_disabled} active={status.get('reblogged')} title={reblog_disabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>
         <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>
         {shareButton}
+        <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>
 
         <div className='detailed-status__action-bar-dropdown'>
-          <DropdownMenuContainer size={18} icon='ellipsis-h' items={menu} direction='left' title='More' />
+          <DropdownMenuContainer size={18} icon='ellipsis-h' status={status} items={menu} direction='left' title='More' />
         </div>
       </div>
     );
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index 029057d40..55bd99886 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -13,6 +13,8 @@ import Column from '../ui/components/column';
 import {
   favourite,
   unfavourite,
+  bookmark,
+  unbookmark,
   reblog,
   unreblog,
   pin,
@@ -30,6 +32,14 @@ import {
   hideStatus,
   revealStatus,
 } from '../../actions/statuses';
+import {
+  unblockAccount,
+  unmuteAccount,
+} from '../../actions/accounts';
+import {
+  blockDomain,
+  unblockDomain,
+} from '../../actions/domain_blocks';
 import { initMuteModal } from '../../actions/mutes';
 import { initBlockModal } from '../../actions/blocks';
 import { initReport } from '../../actions/reports';
@@ -39,7 +49,7 @@ import ColumnBackButton from '../../components/column_back_button';
 import ColumnHeader from '../../components/column_header';
 import StatusContainer from '../../containers/status_container';
 import { openModal } from '../../actions/modal';
-import { defineMessages, injectIntl } from 'react-intl';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { HotKeys } from 'react-hotkeys';
 import { boostModal, deleteModal } from '../../initial_state';
@@ -57,6 +67,7 @@ const messages = defineMessages({
   detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },
   replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
   replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
+  blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },
 });
 
 const makeMapStateToProps = () => {
@@ -232,6 +243,14 @@ class Status extends ImmutablePureComponent {
     }
   }
 
+  handleBookmarkClick = (status) => {
+    if (status.get('bookmarked')) {
+      this.props.dispatch(unbookmark(status));
+    } else {
+      this.props.dispatch(bookmark(status));
+    }
+  }
+
   handleDeleteClick = (status, history, withRedraft = false) => {
     const { dispatch, intl } = this.props;
 
@@ -307,6 +326,27 @@ class Status extends ImmutablePureComponent {
     this.props.dispatch(openModal('EMBED', { url: status.get('url') }));
   }
 
+  handleUnmuteClick = account => {
+    this.props.dispatch(unmuteAccount(account.get('id')));
+  }
+
+  handleUnblockClick = account => {
+    this.props.dispatch(unblockAccount(account.get('id')));
+  }
+
+  handleBlockDomainClick = domain => {
+    this.props.dispatch(openModal('CONFIRM', {
+      message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.' values={{ domain: <strong>{domain}</strong> }} />,
+      confirm: this.props.intl.formatMessage(messages.blockDomainConfirm),
+      onConfirm: () => this.props.dispatch(blockDomain(domain)),
+    }));
+  }
+
+  handleUnblockDomainClick = domain => {
+    this.props.dispatch(unblockDomain(domain));
+  }
+
+
   handleHotkeyMoveUp = () => {
     this.handleMoveUp(this.props.status.get('id'));
   }
@@ -499,12 +539,17 @@ class Status extends ImmutablePureComponent {
                   onReply={this.handleReplyClick}
                   onFavourite={this.handleFavouriteClick}
                   onReblog={this.handleReblogClick}
+                  onBookmark={this.handleBookmarkClick}
                   onDelete={this.handleDeleteClick}
                   onDirect={this.handleDirectClick}
                   onMention={this.handleMentionClick}
                   onMute={this.handleMuteClick}
+                  onUnmute={this.handleUnmuteClick}
                   onMuteConversation={this.handleConversationMuteClick}
                   onBlock={this.handleBlockClick}
+                  onUnblock={this.handleUnblockClick}
+                  onBlockDomain={this.handleBlockDomainClick}
+                  onUnblockDomain={this.handleUnblockDomainClick}
                   onReport={this.handleReport}
                   onPin={this.handlePin}
                   onEmbed={this.handleEmbed}
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index f31425c70..8bc4bfc0e 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -21,6 +21,7 @@ import {
   HashtagTimeline,
   DirectTimeline,
   FavouritedStatuses,
+  BookmarkedStatuses,
   ListTimeline,
   Directory,
 } from '../../ui/util/async-components';
@@ -40,6 +41,7 @@ const componentMap = {
   'HASHTAG': HashtagTimeline,
   'DIRECT': DirectTimeline,
   'FAVOURITES': FavouritedStatuses,
+  'BOOKMARKS': BookmarkedStatuses,
   'LIST': ListTimeline,
   'DIRECTORY': Directory,
 };
diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js
index 51e3ec037..0c12852f5 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.js
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js
@@ -17,6 +17,7 @@ const NavigationPanel = () => (
     <NavLink className='column-link column-link--transparent' exact to='/timelines/public' data-preview-title-id='column.public' data-preview-icon='globe' ><Icon className='column-link__icon' id='globe' fixedWidth /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>
     <NavLink className='column-link column-link--transparent' to='/timelines/direct'><Icon className='column-link__icon' id='envelope' fixedWidth /><FormattedMessage id='navigation_bar.direct' defaultMessage='Direct messages' /></NavLink>
     <NavLink className='column-link column-link--transparent' to='/favourites'><Icon className='column-link__icon' id='star' fixedWidth /><FormattedMessage id='navigation_bar.favourites' defaultMessage='Favourites' /></NavLink>
+    <NavLink className='column-link column-link--transparent' to='/bookmarks'><Icon className='column-link__icon' id='bookmark' fixedWidth /><FormattedMessage id='navigation_bar.bookmarks' defaultMessage='Bookmarks' /></NavLink>
     <NavLink className='column-link column-link--transparent' to='/lists'><Icon className='column-link__icon' id='list-ul' fixedWidth /><FormattedMessage id='navigation_bar.lists' defaultMessage='Lists' /></NavLink>
     {profile_directory && <NavLink className='column-link column-link--transparent' to='/directory'><Icon className='column-link__icon' id='address-book-o' fixedWidth /><FormattedMessage id='getting_started.directory' defaultMessage='Profile directory' /></NavLink>}
 
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index a45ba91eb..b0e38c5cb 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -41,6 +41,7 @@ import {
   FollowRequests,
   GenericNotFound,
   FavouritedStatuses,
+  BookmarkedStatuses,
   ListTimeline,
   Blocks,
   DomainBlocks,
@@ -190,6 +191,7 @@ class SwitchingColumnsArea extends React.PureComponent {
 
           <WrappedRoute path='/notifications' component={Notifications} content={children} componentParams={{ shouldUpdateScroll: this.shouldUpdateScroll }} />
           <WrappedRoute path='/favourites' component={FavouritedStatuses} content={children} componentParams={{ shouldUpdateScroll: this.shouldUpdateScroll }} />
+          <WrappedRoute path='/bookmarks' component={BookmarkedStatuses} content={children} />
           <WrappedRoute path='/pinned' component={PinnedStatuses} content={children} componentParams={{ shouldUpdateScroll: this.shouldUpdateScroll }} />
 
           <WrappedRoute path='/search' component={Search} content={children} />
diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js
index bb0fcb859..986efda1e 100644
--- a/app/javascript/mastodon/features/ui/util/async-components.js
+++ b/app/javascript/mastodon/features/ui/util/async-components.js
@@ -90,6 +90,10 @@ export function FavouritedStatuses () {
   return import(/* webpackChunkName: "features/favourited_statuses" */'../../favourited_statuses');
 }
 
+export function BookmarkedStatuses () {
+  return import(/* webpackChunkName: "features/bookmarked_statuses" */'../../bookmarked_statuses');
+}
+
 export function Blocks () {
   return import(/* webpackChunkName: "features/blocks" */'../../blocks');
 }
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 1b560b964..e65c81e64 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -10,7 +10,7 @@
   "account.edit_profile": "تعديل الملف التعريفي",
   "account.endorse": "أوصِ به على صفحتك",
   "account.follow": "تابِع",
-  "account.followers": "متابعون",
+  "account.followers": "مُتابِعون",
   "account.followers.empty": "لا أحد يتبع هذا الحساب بعد.",
   "account.follows": "يتبع",
   "account.follows.empty": "هذا الحساب لا يتبع أحدًا بعد.",
@@ -27,7 +27,7 @@
   "account.muted": "مكتوم",
   "account.never_active": "أبدا",
   "account.posts": "تبويقات",
-  "account.posts_with_replies": "التبويقات و الردود",
+  "account.posts_with_replies": "التبويقات والردود",
   "account.report": "ابلِغ عن @{name}",
   "account.requested": "في انتظار الموافقة. اضْغَطْ/ي لإلغاء طلب المتابعة",
   "account.share": "شارك ملف تعريف @{name}",
@@ -53,7 +53,7 @@
   "column.blocks": "الحسابات المحجوبة",
   "column.community": "الخيط العام المحلي",
   "column.direct": "الرسائل المباشرة",
-  "column.directory": "استعرض الملفات التعريفية",
+  "column.directory": "استعراض الملفات التعريفية",
   "column.domain_blocks": "النطاقات المخفية",
   "column.favourites": "المفضلة",
   "column.follow_requests": "طلبات المتابعة",
@@ -106,7 +106,7 @@
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
   "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟",
   "confirmations.redraft.confirm": "إزالة و إعادة الصياغة",
-  "confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته ؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.",
+  "confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.",
   "confirmations.reply.confirm": "رد",
   "confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟",
   "confirmations.unfollow.confirm": "إلغاء المتابعة",
@@ -176,7 +176,7 @@
   "hashtag.column_settings.tag_mode.none": "لا شيء مِن هذه",
   "hashtag.column_settings.tag_toggle": "إدراج الوسوم الإضافية لهذا العمود",
   "home.column_settings.basic": "الأساسية",
-  "home.column_settings.show_reblogs": "عرض الترقيات",
+  "home.column_settings.show_reblogs": "اعرض الترقيات",
   "home.column_settings.show_replies": "اعرض الردود",
   "intervals.full.days": "{number, plural, one {# يوم} other {# أيام}}",
   "intervals.full.hours": "{number, plural, one {# ساعة} other {# ساعات}}",
@@ -282,7 +282,7 @@
   "notifications.column_settings.favourite": "المُفَضَّلة:",
   "notifications.column_settings.filter_bar.advanced": "اعرض كافة الفئات",
   "notifications.column_settings.filter_bar.category": "شريط الفلترة السريعة",
-  "notifications.column_settings.filter_bar.show": "اعرض",
+  "notifications.column_settings.filter_bar.show": "اظهِره",
   "notifications.column_settings.follow": "متابعُون جُدُد:",
   "notifications.column_settings.mention": "الإشارات:",
   "notifications.column_settings.poll": "نتائج استطلاع الرأي:",
@@ -299,7 +299,7 @@
   "notifications.group": "{count} إشعارات",
   "poll.closed": "انتهى",
   "poll.refresh": "تحديث",
-  "poll.total_people": "{count, plural, one {# شخص} other {# أشخاص}}",
+  "poll.total_people": "{count, plural, one {# شخص} two {# شخصين} few {# أشخاص} many {# أشخاص} other {# أشخاص}}",
   "poll.total_votes": "{count, plural, one {# صوت} other {# أصوات}}",
   "poll.vote": "صَوّت",
   "poll.voted": "لقد صوّتت على هذه الإجابة",
@@ -340,7 +340,7 @@
   "search_results.hashtags": "الوُسوم",
   "search_results.statuses": "التبويقات",
   "search_results.statuses_fts_disabled": "البحث في التبويقات عن طريق المحتوى ليس مفعل في خادم ماستدون هذا.",
-  "search_results.total": "{count, number} {count, plural, one {result} و {results}}",
+  "search_results.total": "{count, number} {count, plural, zero {} one {نتيجة} two {نتيجتين} few {نتائج} many {نتائج} other {نتائج}}",
   "status.admin_account": "افتح الواجهة الإدارية لـ @{name}",
   "status.admin_status": "افتح هذا المنشور على واجهة الإشراف",
   "status.block": "احجب @{name}",
@@ -393,7 +393,7 @@
   "time_remaining.minutes": "{number, plural, one {# دقيقة} other {# دقائق}} متبقية",
   "time_remaining.moments": "لحظات متبقية",
   "time_remaining.seconds": "{number, plural, one {# ثانية} other {# ثوانٍ}} متبقية",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} آخرون {people}} يتحدثون",
+  "trends.count_by_accounts": "{count} {rawCount, plural, zero {} one {شخص واحد} two {شخصين} few {أشخاص} many {أشخاص} other {أشخاص}} تتحدّث",
   "trends.trending_now": "المتداولة الآن",
   "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.",
   "upload_area.title": "اسحب ثم أفلت للرفع",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index a4afe2adb..2ec155362 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -4,19 +4,19 @@
   "account.block": "Блокирай",
   "account.block_domain": "скрий всичко от (домейн)",
   "account.blocked": "Блокирани",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.cancel_follow_request": "Откажи искането за следване",
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "Скрит домейн",
   "account.edit_profile": "Редактирай профила си",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Характеристика на профила",
   "account.follow": "Последвай",
   "account.followers": "Последователи",
-  "account.followers.empty": "No one follows this user yet.",
+  "account.followers.empty": "Все още никой не следва този потребител.",
   "account.follows": "Следвам",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows.empty": "Този потребител все още не следва никого.",
   "account.follows_you": "Твой последовател",
   "account.hide_reblogs": "Hide boosts from @{name}",
-  "account.last_status": "Last active",
+  "account.last_status": "Последно активен/а",
   "account.link_verified_on": "Ownership of this link was checked on {date}",
   "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
   "account.media": "Media",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 6c4f0def6..5cf5f7a76 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -1,31 +1,31 @@
 {
-  "account.add_or_remove_from_list": "তালিকাতে আরো যুক্ত বা মুছে ফেলুন",
-  "account.badges.bot": "রোবট",
-  "account.block": "@{name} কে বন্ধ করুন",
-  "account.block_domain": "{domain} থেকে সব সরিয়ে ফেলুন",
-  "account.blocked": "বন্ধ করা হয়েছে",
-  "account.cancel_follow_request": "Cancel follow request",
-  "account.direct": "@{name} এর কাছে সরকারি লেখা পাঠাতে",
-  "account.domain_blocked": "ওয়েবসাইট সরিয়ে ফেলা হয়েছে",
-  "account.edit_profile": "নিজের পাতা সম্পাদনা করতে",
-  "account.endorse": "আপনার নিজের পাতায় দেখাতে",
+  "account.add_or_remove_from_list": "তালিকা হতে মুছুন অথবা যুক্ত করুন",
+  "account.badges.bot": "বট",
+  "account.block": "@{name} কে ব্লক করুন",
+  "account.block_domain": "{domain} থেকে সব লুকান",
+  "account.blocked": "ব্লককৃত",
+  "account.cancel_follow_request": "অসুসারণ অনুরোধ বাতিল করুন",
+  "account.direct": "@{name} কে সরাসরি বার্তা",
+  "account.domain_blocked": "ডোমেন লুকানো আছে",
+  "account.edit_profile": "প্রোফাইল সম্পাদন করুন",
+  "account.endorse": "নিজের পাতায় দেখান",
   "account.follow": "অনুসরণ করুন",
   "account.followers": "অনুসরণকারক",
   "account.followers.empty": "এই ব্যবহারকারীকে কেও এখনো অনুসরণ করে না।",
   "account.follows": "যাদেরকে অনুসরণ করেন",
   "account.follows.empty": "এই ব্যবহারকারী কাওকে এখনো অনুসরণ করেন না।",
   "account.follows_you": "আপনাকে অনুসরণ করে",
-  "account.hide_reblogs": "@{name}র সমর্থনগুলি সরিয়ে ফেলুন",
-  "account.last_status": "Last active",
+  "account.hide_reblogs": "@{name}'র সমর্থনগুলি লুকিয়ে ফেলুন",
+  "account.last_status": "শেষ সক্রিয় ছিল",
   "account.link_verified_on": "এই লিংকের মালিকানা চেক করা হয়েছে {date} তারিকে",
   "account.locked_info": "এই নিবন্ধনের গোপনীয়তার ক্ষেত্র তালা দেওয়া আছে। নিবন্ধনকারী অনুসরণ করার অনুমতি যাদেরকে দেবেন, শুধু তারাই অনুসরণ করতে পারবেন।",
-  "account.media": "ছবি বা ভিডিও",
-  "account.mention": "@{name} কে উল্লেখ করতে",
-  "account.moved_to": "{name} চলে গেছে এখানে:",
-  "account.mute": "@{name} সব কার্যক্রম আপনার সময়রেখা থেকে সরিয়ে ফেলতে",
+  "account.media": "মিডিয়া",
+  "account.mention": "@{name} কে উল্লেখ করুন",
+  "account.moved_to": "{name} কে এখানে সরানো হয়েছে:",
+  "account.mute": "@{name} কে নিঃশব্দ করুন",
   "account.mute_notifications": "@{name}র প্রজ্ঞাপন আপনার কাছ থেকে সরিয়ে ফেলুন",
   "account.muted": "সরানো আছে",
-  "account.never_active": "Never",
+  "account.never_active": "কখনও নয়",
   "account.posts": "টুট",
   "account.posts_with_replies": "টুট এবং মতামত",
   "account.report": "@{name} কে রিপোর্ট করতে",
@@ -33,16 +33,16 @@
   "account.share": "@{name}র পাতা অন্যদের দেখান",
   "account.show_reblogs": "@{name}র সমর্থনগুলো দেখুন",
   "account.unblock": "@{name}র কার্যকলাপ আবার দেখুন",
-  "account.unblock_domain": "{domain}থেকে আবার দেখুন",
+  "account.unblock_domain": "{domain} থেকে আবার দেখুন",
   "account.unendorse": "আপনার নিজের পাতায় এটা না দেখাতে",
   "account.unfollow": "অনুসরণ না করতে",
   "account.unmute": "@{name}র কার্যকলাপ আবার দেখুন",
   "account.unmute_notifications": "@{name}র প্রজ্ঞাপন দেওয়ার অনুমতি দিন",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
+  "alert.rate_limited.title": "হার সীমিত",
   "alert.unexpected.message": "অপ্রত্যাশিত একটি সমস্যা হয়েছে।",
   "alert.unexpected.title": "ওহো!",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "autosuggest_hashtag.per_week": "প্রতি সপ্তাহে {count}",
   "boost_modal.combo": "পরেরবার আপনি {combo} চাপ দিলে এটার শেষে চলে যেতে পারবেন",
   "bundle_column_error.body": "এই অংশটি দেখতে যেয়ে কোনো সমস্যা হয়েছে।",
   "bundle_column_error.retry": "আবার চেষ্টা করুন",
@@ -50,11 +50,11 @@
   "bundle_modal_error.close": "বন্ধ করুন",
   "bundle_modal_error.message": "এই অংশটি দেখাতে যেয়ে কোনো সমস্যা হয়েছে।",
   "bundle_modal_error.retry": "আবার চেষ্টা করুন",
-  "column.blocks": "যাদের বন্ধ করে রাখা হয়েছে",
+  "column.blocks": "যাদের ব্লক করে রাখা হয়েছে",
   "column.community": "স্থানীয় সময়সারি",
   "column.direct": "সরাসরি লেখা",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "সরিয়ে ফেলা ওয়েবসাইট",
+  "column.directory": "প্রোফাইল ব্রাউজ করুন",
+  "column.domain_blocks": "লুকোনো ডোমেনগুলি",
   "column.favourites": "পছন্দের গুলো",
   "column.follow_requests": "অনুসরণের অনুমতি চেয়েছে যারা",
   "column.home": "বাড়ি",
@@ -87,23 +87,23 @@
   "compose_form.sensitive.hide": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করতে",
   "compose_form.sensitive.marked": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করা হয়েছে",
   "compose_form.sensitive.unmarked": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করা হয়নি",
-  "compose_form.spoiler.marked": "লেখাটি সাবধানতার পেছনে লুকানো আছে",
+  "compose_form.spoiler.marked": "সতর্কতার পিছনে লেখানটি লুকানো আছে",
   "compose_form.spoiler.unmarked": "লেখাটি লুকানো নেই",
   "compose_form.spoiler_placeholder": "আপনার লেখা দেখার সাবধানবাণী লিখুন",
   "confirmation_modal.cancel": "বাতিল করুন",
-  "confirmations.block.block_and_report": "বন্ধ করুন এবং রিপোর্ট করুন",
-  "confirmations.block.confirm": "বন্ধ করুন",
-  "confirmations.block.message": "আপনি কি নিশ্চিত {name} কে বন্ধ করতে চান ?",
+  "confirmations.block.block_and_report": "ব্লক করুন এবং রিপোর্ট করুন",
+  "confirmations.block.confirm": "ব্লক করুন",
+  "confirmations.block.message": "আপনি কি নিশ্চিত {name} কে ব্লক করতে চান?",
   "confirmations.delete.confirm": "মুছে ফেলুন",
   "confirmations.delete.message": "আপনি কি নিশ্চিত যে এই লেখাটি মুছে ফেলতে চান ?",
   "confirmations.delete_list.confirm": "মুছে ফেলুন",
   "confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?",
-  "confirmations.domain_block.confirm": "এই ওয়েবসাইট থেকে সব সরান",
-  "confirmations.domain_block.message": "আপনি কি সত্যি সত্যি নিশ্চিত যে {domain} ওয়েবসাইট থেকে সব সরাতে চান ? সাধারণত কিছু লক্ষ্যবস্তু বন্ধ এবং সরানোযা যথেষ্ট। নিশ্চিত করলে ওই ওয়েবসাইট থেকে কোনোকিছু কোনখানে দেখবেন না। যারা আপনাকে অনুসরণ করে ওই ওয়েবসাইট থেকে তাদেরকেও মুছে ফেলা হবে।",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.domain_block.confirm": "এই ডোমেন থেকে সব লুকান",
+  "confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।",
+  "confirmations.logout.confirm": "প্রস্থান",
+  "confirmations.logout.message": "আপনি লগ আউট করতে চান?",
   "confirmations.mute.confirm": "সরিয়ে ফেলুন",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "এটি তাদের কাছ থেকে পোস্ট এবং তাদেরকে মেনশন করা পোস্টগুলি হাইড করবে, তবুও তাদেরকে এটি আপনার পোস্ট গুলো দেখতে দিবে ও তারা আপনাকে অনুসরন করতে পারবে।.",
   "confirmations.mute.message": "আপনি কি নিশ্চিত {name} সরিয়ে ফেলতে চান ?",
   "confirmations.redraft.confirm": "মুছে ফেলুন এবং আবার সম্পাদন করুন",
   "confirmations.redraft.message": "আপনি কি নিশ্চিত এটি মুছে ফেলে  এবং আবার সম্পাদন করতে চান ? এটাতে যা পছন্দিত, সমর্থন বা মতামত আছে সেগুলো নতুন লেখার সাথে যুক্ত থাকবে না।",
@@ -111,14 +111,14 @@
   "confirmations.reply.message": "এখন মতামত লিখতে গেলে আপনার এখন যেটা লিখছেন সেটা মুছে যাবে। আপনি নি নিশ্চিত এটা করতে চান ?",
   "confirmations.unfollow.confirm": "অনুসরণ করা বাতিল করতে",
   "confirmations.unfollow.message": "আপনি কি নিশ্চিত {name} কে আর অনুসরণ করতে চান না ?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "conversation.delete": "কথোপকথন মুছে ফেলুন",
+  "conversation.mark_as_read": "পঠিত হিসেবে চিহ্নিত করুন",
+  "conversation.open": "কথপোকথন দেখান",
+  "conversation.with": "{names} এর সঙ্গে",
+  "directory.federated": "পরিচিত ফেডিভারসের থেকে",
+  "directory.local": "শুধু {domain} থেকে",
+  "directory.new_arrivals": "নতুন আগত",
+  "directory.recently_active": "সম্প্রতি সক্রিয়",
   "embed.instructions": "এই লেখাটি আপনার ওয়েবসাইটে যুক্ত করতে নিচের কোডটি বেবহার করুন।",
   "embed.preview": "সেটা দেখতে এরকম হবে:",
   "emoji_button.activity": "কার্যকলাপ",
@@ -137,25 +137,25 @@
   "emoji_button.travel": "ভ্রমণ এবং স্থান",
   "empty_column.account_timeline": "এখানে কোনো টুট নেই!",
   "empty_column.account_unavailable": "নিজস্ব পাতা নেই",
-  "empty_column.blocks": "আপনি কোনো ব্যবহারকারীদের বন্ধ করেন নি।",
+  "empty_column.blocks": "আপনি কোনো ব্যবহারকারীদের ব্লক করেন নি।",
   "empty_column.community": "স্থানীয় সময়রেখাতে কিছু নেই। প্রকাশ্যভাবে কিছু লিখে লেখালেখির উদ্বোধন করে ফেলুন!",
   "empty_column.direct": "আপনার কাছে সরাসরি পাঠানো কোনো লেখা নেই। যদি কেও পাঠায়, সেটা এখানে দেখা যাবে।",
-  "empty_column.domain_blocks": "এখনো কোনো সরানো ওয়েবসাইট নেই।",
+  "empty_column.domain_blocks": "এখনও কোনও লুকানো ডোমেন নেই।",
   "empty_column.favourited_statuses": "আপনার পছন্দের কোনো টুট এখনো নেই। আপনি কোনো লেখা পছন্দের হিসেবে চিহ্নিত করলে এখানে পাওয়া যাবে।",
   "empty_column.favourites": "কেও এখনো এটাকে পছন্দের টুট হিসেবে চিহ্নিত করেনি। যদি করে, তখন তাদের এখানে পাওয়া যাবে।",
   "empty_column.follow_requests": "আপনার এখনো কোনো অনুসরণের আবেদন পাঠানো নেই। যদি পাঠায়, এখানে পাওয়া যাবে।",
   "empty_column.hashtag": "এই হেসটাগে এখনো কিছু নেই।",
-  "empty_column.home": "আপনার বাড়ির সময়রেখা এখনো খালি!  {public}এ ঘুরে আসুন অথবা অনুসন্ধান বেবহার করে শুরু করতে পারেন এবং অন্য ব্যবহারকারীদের সাথে সাক্ষাৎ করতে পারেন।",
+  "empty_column.home": "আপনার বাড়ির সময়রেখা এখনো খালি!  {public} এ ঘুরে আসুন অথবা অনুসন্ধান বেবহার করে শুরু করতে পারেন এবং অন্য ব্যবহারকারীদের সাথে সাক্ষাৎ করতে পারেন।",
   "empty_column.home.public_timeline": "প্রকাশ্য সময়রেখা",
   "empty_column.list": "এই তালিকাতে এখনো কিছু নেই. যখন এই তালিকায় থাকা ব্যবহারকারী নতুন কিছু লিখবে, সেগুলো এখানে পাওয়া যাবে।",
   "empty_column.lists": "আপনার এখনো কোনো তালিকা তৈরী নেই। যদি বা যখন তৈরী করেন, সেগুলো এখানে পাওয়া যাবে।",
-  "empty_column.mutes": "আপনি এখনো কোনো ব্যবহারকারীকে সরাননি।",
+  "empty_column.mutes": "আপনি এখনো কোনো ব্যবহারকারীকে নিঃশব্দ করেননি।",
   "empty_column.notifications": "আপনার এখনো কোনো প্রজ্ঞাপন নেই। কথোপকথন শুরু করতে,  অন্যদের সাথে মেলামেশা করতে পারেন।",
   "empty_column.public": "এখানে এখনো কিছু নেই! প্রকাশ্য ভাবে কিছু লিখুন বা অন্য সার্ভার থেকে কাওকে অনুসরণ করে এই জায়গা ভরে ফেলুন",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "আমাদের কোড বা ব্রাউজারের সামঞ্জস্য ইস্যুতে একটি বাগের কারণে এই পৃষ্ঠাটি সঠিকভাবে প্রদর্শিত করা যায় নি।",
+  "error.unexpected_crash.next_steps": "পাতাটি রিফ্রেশ করে চেষ্টা করুন। তবুও যদি না হয়, তবে আপনি অন্য একটি ব্রাউজার অথবা আপনার ডিভাইসের জন্যে এপের মাধ্যমে মাস্টডন ব্যাবহার করতে পারবেন।.",
+  "errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন",
+  "errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন",
   "follow_request.authorize": "অনুমতি দিন",
   "follow_request.reject": "প্রত্যাখ্যান করুন",
   "getting_started.developers": "তৈরিকারকদের জন্য",
@@ -180,7 +180,7 @@
   "home.column_settings.show_replies": "মতামত দেখান",
   "intervals.full.days": "{number, plural, one {# day} other {# days}}",
   "intervals.full.hours": "{number, plural, one {# ঘটা} other {# ঘটা}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "intervals.full.minutes": "{number, plural, one {# মিনিট} other {# মিনিট}}",
   "introduction.federation.action": "পরবর্তী",
   "introduction.federation.federated.headline": "যুক্তবিশ্ব",
   "introduction.federation.federated.text": "অন্যান্য যুক্তবিশ্বের সার্ভারের লেখাগুলি যুক্তবিশ্বের সময়রেখাতে আসবে ।",
@@ -199,7 +199,7 @@
   "introduction.welcome.headline": "প্রথম ধাপ",
   "introduction.welcome.text": "যুক্তবিশ্বে স্বাগতম! কিছুক্ষনের মধ্যেই আপনি আপনার লেখা বিভিন্ন সার্ভারে সম্প্রচার করতে পারবেন। কিন্তু মনে রাখবে যে এটা একটা বিশেষ সার্ভার, {domain} কারণ এখানে আপনার নিজেস্ব পাতা রাখা হচ্ছে।",
   "keyboard_shortcuts.back": "পেছনে যেতে",
-  "keyboard_shortcuts.blocked": "বন্ধ করা ব্যবহারকারীদের তালিকা দেখতে",
+  "keyboard_shortcuts.blocked": "ব্লক করা ব্যবহারকারীদের তালিকা খুলতে",
   "keyboard_shortcuts.boost": "সমর্থন করতে",
   "keyboard_shortcuts.column": "কোনো কলামএ কোনো লেখা ফোকাস করতে",
   "keyboard_shortcuts.compose": "লেখা সম্পদনার জায়গায় ফোকাস করতে",
@@ -243,7 +243,7 @@
   "lists.new.title_placeholder": "তালিকার নতুন শিরোনাম দিতে",
   "lists.search": "যাদের অনুসরণ করেন তাদের ভেতরে খুঁজুন",
   "lists.subheading": "আপনার তালিকা",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural, one {# নতুন জিনিস} other {# নতুন জিনিস}}",
   "loading_indicator.label": "আসছে...",
   "media_gallery.toggle_visible": "দৃশ্যতার অবস্থা বদলান",
   "missing_indicator.label": "খুঁজে পাওয়া যায়নি",
@@ -255,17 +255,17 @@
   "navigation_bar.compose": "নতুন টুট লিখুন",
   "navigation_bar.direct": "সরাসরি লেখাগুলি",
   "navigation_bar.discover": "ঘুরে দেখুন",
-  "navigation_bar.domain_blocks": "বন্ধ করা ওয়েবসাইট",
+  "navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি",
   "navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে",
   "navigation_bar.favourites": "পছন্দের",
   "navigation_bar.filters": "বন্ধ করা শব্দ",
   "navigation_bar.follow_requests": "অনুসরণের অনুরোধগুলি",
-  "navigation_bar.follows_and_followers": "যাদেরকে অনুসরণ করেন এবং যারা তাকে অনুসরণ করে",
+  "navigation_bar.follows_and_followers": "অনুসরণ এবং অনুসরণকারী",
   "navigation_bar.info": "এই সার্ভার সম্পর্কে",
   "navigation_bar.keyboard_shortcuts": "হটকীগুলি",
   "navigation_bar.lists": "তালিকাগুলো",
   "navigation_bar.logout": "বাইরে যান",
-  "navigation_bar.mutes": "যেসব বেভহারকারীদের কার্যক্রম বন্ধ করা আছে",
+  "navigation_bar.mutes": "যাদের কার্যক্রম দেখা বন্ধ আছে",
   "navigation_bar.personal": "নিজস্ব",
   "navigation_bar.pins": "পিন দেওয়া টুট",
   "navigation_bar.preferences": "পছন্দসমূহ",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} প্রজ্ঞাপন",
   "poll.closed": "বন্ধ",
   "poll.refresh": "বদলেছে কিনা দেখতে",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# ব্যক্তি} other {# ব্যক্তি}}",
   "poll.total_votes": "{count, plural, one {# ভোট} other {# ভোট}}",
   "poll.vote": "ভোট",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "আপনি এই উত্তরের পক্ষে ভোট দিয়েছেন",
   "poll_button.add_poll": "একটা নির্বাচন যোগ করতে",
   "poll_button.remove_poll": "নির্বাচন বাদ দিতে",
   "privacy.change": "লেখার গোপনীয়তা অবস্থা ঠিক করতে",
@@ -314,13 +314,13 @@
   "privacy.public.short": "সর্বজনীন প্রকাশ্য",
   "privacy.unlisted.long": "সর্বজনীন প্রকাশ্য সময়রেখাতে না দেখাতে",
   "privacy.unlisted.short": "প্রকাশ্য নয়",
-  "refresh": "Refresh",
+  "refresh": "সতেজ করা",
   "regeneration_indicator.label": "আসছে…",
   "regeneration_indicator.sublabel": "আপনার বাড়ির-সময়রেখা প্রস্তূত করা হচ্ছে!",
   "relative_time.days": "{number} দিন",
   "relative_time.hours": "{number} ঘন্টা",
   "relative_time.just_now": "এখন",
-  "relative_time.minutes": "{number}ম",
+  "relative_time.minutes": "{number}মিঃ",
   "relative_time.seconds": "{number} সেকেন্ড",
   "reply_indicator.cancel": "বাতিল করতে",
   "report.forward": "এটা আরো পাঠান {target} তে",
@@ -329,7 +329,7 @@
   "report.placeholder": "অন্য কোনো মন্তব্য",
   "report.submit": "জমা দিন",
   "report.target": "{target} রিপোর্ট করুন",
-  "search.placeholder": "খুঁজতে",
+  "search.placeholder": "অনুসন্ধান",
   "search_popout.search_format": "বিস্তারিতভাবে খোঁজার পদ্ধতি",
   "search_popout.tips.full_text": "সাধারণ লেখা দিয়ে খুঁজলে বের হবে সেরকম আপনার লেখা, পছন্দের লেখা, সমর্থন করা লেখা, আপনাকে উল্লেখকরা কোনো লেখা,  যা খুঁজছেন সেরকম কোনো ব্যবহারকারীর নাম বা কোনো হ্যাশট্যাগগুলো।",
   "search_popout.tips.hashtag": "হ্যাশট্যাগ",
@@ -339,11 +339,11 @@
   "search_results.accounts": "মানুষ",
   "search_results.hashtags": "হ্যাশট্যাগগুলি",
   "search_results.statuses": "টুট",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.statuses_fts_disabled": "তাদের সামগ্রী দ্বারা টুটগুলি অনুসন্ধান এই মস্তোডন সার্ভারে সক্ষম নয়।",
   "search_results.total": "{count, number} {count, plural, one {ফলাফল} other {ফলাফল}}",
   "status.admin_account": "@{name} র জন্য পরিচালনার ইন্টারফেসে ঢুকুন",
   "status.admin_status": "যায় লেখাটি পরিচালনার ইন্টারফেসে খুলুন",
-  "status.block": "@{name}কে বন্ধ করুন",
+  "status.block": "@{name} কে ব্লক করুন",
   "status.cancel_reblog_private": "সমর্থন বাতিল করতে",
   "status.cannot_reblog": "এটিতে সমর্থন দেওয়া যাবেনা",
   "status.copy": "লেখাটির লিংক কপি করতে",
@@ -354,7 +354,7 @@
   "status.favourite": "পছন্দের করতে",
   "status.filtered": "ছাঁকনিদিত",
   "status.load_more": "আরো দেখুন",
-  "status.media_hidden": "ছবি বা ভিডিও পেছনে",
+  "status.media_hidden": "মিডিয়া লুকানো আছে",
   "status.mention": "@{name}কে উল্লেখ করতে",
   "status.more": "আরো",
   "status.mute": "@{name}র কার্যক্রম সরিয়ে ফেলতে",
@@ -378,7 +378,7 @@
   "status.show_more": "আরো দেখাতে",
   "status.show_more_all": "সবগুলোতে আরো দেখতে",
   "status.show_thread": "আলোচনা দেখতে",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "পাওয়া যাচ্ছে না",
   "status.unmute_conversation": "আলোচনার প্রজ্ঞাপন চালু করতে",
   "status.unpin": "নিজের পাতা থেকে পিন করে রাখাটির পিন খুলতে",
   "suggestions.dismiss": "সাহায্যের পরামর্শগুলো সরাতে",
@@ -387,29 +387,29 @@
   "tabs_bar.home": "বাড়ি",
   "tabs_bar.local_timeline": "স্থানীয়",
   "tabs_bar.notifications": "প্রজ্ঞাপনগুলো",
-  "tabs_bar.search": "খুঁজতে",
+  "tabs_bar.search": "অনুসন্ধান",
   "time_remaining.days": "{number, plural, one {# day} other {# days}} বাকি আছে",
   "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} বাকি আছে",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} বাকি আছে",
+  "time_remaining.minutes": "{number, plural, one {# মিনিট} other {# মিনিট}} বাকি আছে",
   "time_remaining.moments": "সময় বাকি আছে",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} বাকি আছে",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} কথা বলছে",
-  "trends.trending_now": "Trending now",
+  "trends.trending_now": "বর্তমানে জনপ্রিয়",
   "ui.beforeunload": "যে পর্যন্ত এটা লেখা হয়েছে, মাস্টাডন থেকে চলে গেলে এটা মুছে যাবে।",
   "upload_area.title": "টেনে এখানে ছেড়ে দিলে এখানে যুক্ত করা যাবে",
   "upload_button.label": "ছবি বা ভিডিও যুক্ত করতে (এসব ধরণের: JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "যা যুক্ত করতে চাচ্ছেন সেটি বেশি বড়, এখানকার সর্বাধিকের মেমোরির উপরে চলে গেছে।",
   "upload_error.poll": "নির্বাচনক্ষেত্রে কোনো ফাইল যুক্ত করা যাবেনা।",
   "upload_form.description": "যারা দেখতে পায়না তাদের জন্য এটা বর্ণনা করতে",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "সম্পাদন",
   "upload_form.undo": "মুছে ফেলতে",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
+  "upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…",
+  "upload_modal.apply": "প্রয়োগ করুন",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.detect_text": "ছবি থেকে পাঠ্য সনাক্ত করুন",
+  "upload_modal.edit_media": "মিডিয়া সম্পাদনা করুন",
+  "upload_modal.hint": "একটি দৃশ্যমান পয়েন্ট নির্বাচন করুন ক্লিক অথবা টানার মাধ্যমে যেটি সবময় সব থাম্বনেলে দেখা যাবে।",
+  "upload_modal.preview_label": "পূর্বরূপ({ratio})",
   "upload_progress.label": "যুক্ত করতে পাঠানো হচ্ছে...",
   "video.close": "ভিডিওটি বন্ধ করতে",
   "video.exit_fullscreen": "পূর্ণ পর্দা থেকে বাইরে বের হতে",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 8c2e08bb3..a8a952798 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Allgofnodi",
   "confirmations.logout.message": "Ydych chi'n siŵr eich bod am allgofnodi?",
   "confirmations.mute.confirm": "Tawelu",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Bydd hyn yn cuddio pyst oddi wrthynt a physt sydd yn sôn amdanynt, ond bydd hyn dal yn gadael iddyn nhw gweld eich pyst a'ch dilyn.",
   "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?",
   "confirmations.redraft.confirm": "Dileu & ailddrafftio",
   "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y tŵt hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r tŵt gwreiddiol yn cael eu hamddifadu.",
@@ -152,10 +152,10 @@
   "empty_column.mutes": "Nid ydych wedi tawelu unrhyw ddefnyddwyr eto.",
   "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.",
   "empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o achosion eraill i'w lenwi",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "Oherwydd gwall yn ein cod neu oherwydd problem cysondeb porwr, nid oedd y dudalen hon gallu cael ei dangos yn gywir.",
+  "error.unexpected_crash.next_steps": "Ceisiwch ail-lwytho y dudalen. Os nad yw hyn yn eich helpu, efallai gallech defnyddio Mastodon trwy borwr neu ap brodorol gwahanol.",
+  "errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd",
+  "errors.unexpected_crash.report_issue": "Rhoi gwybod am broblem",
   "follow_request.authorize": "Caniatau",
   "follow_request.reject": "Gwrthod",
   "getting_started.developers": "Datblygwyr",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} o hysbysiadau",
   "poll.closed": "Ar gau",
   "poll.refresh": "Adnewyddu",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# berson} other {# o bobl}}",
   "poll.total_votes": "{count, plural, one {# bleidlais} other {# o bleidleisiau}}",
   "poll.vote": "Pleidleisio",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Pleidleisioch chi am yr ateb hon",
   "poll_button.add_poll": "Ychwanegu pleidlais",
   "poll_button.remove_poll": "Tynnu pleidlais",
   "privacy.change": "Addasu preifatrwdd y tŵt",
@@ -314,7 +314,7 @@
   "privacy.public.short": "Cyhoeddus",
   "privacy.unlisted.long": "Peidio a chyhoeddi i ffrydiau cyhoeddus",
   "privacy.unlisted.short": "Heb ei restru",
-  "refresh": "Refresh",
+  "refresh": "Adnewyddu",
   "regeneration_indicator.label": "Llwytho…",
   "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!",
   "relative_time.days": "{number}dydd",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 95e4fe503..4719d5ca5 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -39,7 +39,7 @@
   "account.unmute": "Fjern dæmpningen af @{name}",
   "account.unmute_notifications": "Fjern dæmpningen af notifikationer fra @{name}",
   "alert.rate_limited.message": "Prøv venligst igen efter {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.title": "Gradsbegrænset",
   "alert.unexpected.message": "Der opstod en uventet fejl.",
   "alert.unexpected.title": "Ups!",
   "autosuggest_hashtag.per_week": "{count} per uge",
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Log ud",
   "confirmations.logout.message": "Er du sikker på du vil logge ud?",
   "confirmations.mute.confirm": "Dæmp",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Dette vil skjule indlæg fra dem, samt andre indlæg der omtaler dem, men de vil stadig være i stand til at se dine indlæg og følge dig.",
   "confirmations.mute.message": "Er du sikker på, du vil dæmpe {name}?",
   "confirmations.redraft.confirm": "Slet & omskriv",
   "confirmations.redraft.message": "Er du sikker på, du vil slette denne status og omskrive den? Favoritter og fremhævelser vil gå tabt og svar til det oprindelige opslag vil blive forældreløse.",
@@ -152,10 +152,10 @@
   "empty_column.mutes": "Du har endnu ikke dæmpet nogen som helst bruger.",
   "empty_column.notifications": "Du har endnu ingen notifikationer. Tag ud og bland dig med folkemængden for at starte samtalen.",
   "empty_column.public": "Der er ikke noget at se her! Skriv noget offentligt eller start ud med manuelt at følge brugere fra andre server for at udfylde tomrummet",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "På grund af en fejl i vores kode, eller en browser kompatibilitetsfejl, så kunne siden ikke vises korrekt.",
+  "error.unexpected_crash.next_steps": "Prøv at genindlæs siden. Hvis dette ikke hjælper, så forsøg venligst, at tilgå Mastodon via en anden browser eller app.",
+  "errors.unexpected_crash.copy_stacktrace": "Kopiér stack trace til udklipsholderen",
+  "errors.unexpected_crash.report_issue": "Rapportér problem",
   "follow_request.authorize": "Godkend",
   "follow_request.reject": "Afvis",
   "getting_started.developers": "Udviklere",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} notifikationer",
   "poll.closed": "Lukket",
   "poll.refresh": "Opdatér",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# person} other {# personer}}",
   "poll.total_votes": "{count, plural, one {# stemme} other {# stemmer}}",
   "poll.vote": "Stem",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Du stemte for denne valgmulighed",
   "poll_button.add_poll": "Tilføj en afstemning",
   "poll_button.remove_poll": "Fjern afstemning",
   "privacy.change": "Skift status visningsindstillinger",
@@ -314,7 +314,7 @@
   "privacy.public.short": "Offentligt",
   "privacy.unlisted.long": "Udgiv ikke på offentlige tidslinjer",
   "privacy.unlisted.short": "Ikke listet",
-  "refresh": "Refresh",
+  "refresh": "Opdatér",
   "regeneration_indicator.label": "Indlæser…",
   "regeneration_indicator.sublabel": "Din startside er ved at blive forberedt!",
   "relative_time.days": "{number}d",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 401e3fc15..c916028be 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -405,7 +405,7 @@
   "upload_form.undo": "Löschen",
   "upload_modal.analyzing_picture": "Analysiere Bild…",
   "upload_modal.apply": "Übernehmen",
-  "upload_modal.description_placeholder": "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern",
+  "upload_modal.description_placeholder": "Die heiße Zypernsonne quälte Max und Victoria ja böse auf dem Weg bis zur Küste.",
   "upload_modal.detect_text": "Text aus Bild erkennen",
   "upload_modal.edit_media": "Medien bearbeiten",
   "upload_modal.hint": "Klicke oder ziehe den Kreis auf die Vorschau, um den Brennpunkt auszuwählen, der immer auf allen Vorschaubilder angezeigt wird.",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index d46063b18..56f8781a1 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -40,7 +40,7 @@
   "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
   "alert.rate_limited.message": "Por favor, reintentá después de las {retry_time, time, medium}.",
   "alert.rate_limited.title": "Tarifa limitada",
-  "alert.unexpected.message": "Ocurrió un error inesperado.",
+  "alert.unexpected.message": "Ocurrió un error.",
   "alert.unexpected.title": "¡Epa!",
   "autosuggest_hashtag.per_week": "{count} por semana",
   "boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez",
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Cerrar sesión",
   "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?",
   "confirmations.mute.confirm": "Silenciar",
-  "confirmations.mute.explanation": "Esto ocultará mensajes de ellos y mensajes que los mencionen, pero todavía les permitirá ver tus mensajes o seguirte.",
+  "confirmations.mute.explanation": "Se ocultarán los mensajes de esta cuenta y los mensajes de otras cuentas que mencionen a ésta, pero todavía esta cuenta podrá ver tus mensajes o seguirte.",
   "confirmations.mute.message": "¿Estás seguro que querés silenciar a {name}?",
   "confirmations.redraft.confirm": "Eliminar toot original y editarlo",
   "confirmations.redraft.message": "¿Estás seguro que querés eliminar este estado y volver a editarlo? Se perderán las veces marcadas como favoritos y los retoots, y las respuestas a la publicación original quedarán huérfanas.",
@@ -365,7 +365,7 @@
   "status.read_more": "Leer más",
   "status.reblog": "Retootear",
   "status.reblog_private": "Retootear a la audiencia original",
-  "status.reblogged_by": "Retooteado por {name}",
+  "status.reblogged_by": "{name} retooteó",
   "status.reblogs.empty": "Todavía nadie retooteó este toot. Cuando alguien lo haga, se mostrará acá.",
   "status.redraft": "Eliminar toot original y editarlo",
   "status.reply": "Responder",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index db60dab54..6b97393d2 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -4,7 +4,7 @@
   "account.block": "Blokeeri @{name}",
   "account.block_domain": "Peida kõik domeenist {domain}",
   "account.blocked": "Blokeeritud",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.cancel_follow_request": "Tühista jälgimistaotlus",
   "account.direct": "Otsesõnum @{name}",
   "account.domain_blocked": "Domeen peidetud",
   "account.edit_profile": "Muuda profiili",
@@ -16,16 +16,16 @@
   "account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
   "account.follows_you": "Jälgib sind",
   "account.hide_reblogs": "Peida upitused kasutajalt @{name}",
-  "account.last_status": "Last active",
+  "account.last_status": "Viimati aktiivne",
   "account.link_verified_on": "Selle lingi autorsust kontrolliti {date}",
-  "account.locked_info": "Selle konto privaatsus on lukustatud. Omanik vaatab manuaalselt üle, kes teda jägida saab.",
+  "account.locked_info": "Selle konto privaatsussätteks on lukustatud. Omanik vaatab manuaalselt üle, kes teda jägida saab.",
   "account.media": "Meedia",
   "account.mention": "Maini @{name}",
   "account.moved_to": "{name} on kolinud:",
   "account.mute": "Vaigista @{name}",
   "account.mute_notifications": "Vaigista teated kasutajalt @{name}",
   "account.muted": "Vaigistatud",
-  "account.never_active": "Never",
+  "account.never_active": "Mitte kunagi",
   "account.posts": "Tuututused",
   "account.posts_with_replies": "Tuututused ja vastused",
   "account.report": "Raporteeri @{name}",
@@ -38,11 +38,11 @@
   "account.unfollow": "Ära jälgi",
   "account.unmute": "Ära vaigista @{name}",
   "account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.message": "Palun proovi uuesti pärast {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Piiratud",
   "alert.unexpected.message": "Tekkis ootamatu viga.",
   "alert.unexpected.title": "Oih!",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "autosuggest_hashtag.per_week": "{count} nädalas",
   "boost_modal.combo": "Saad vajutada {combo}, et see järgmine kord vahele jätta",
   "bundle_column_error.body": "Mindagi läks valesti selle komponendi laadimisel.",
   "bundle_column_error.retry": "Proovi uuesti",
@@ -53,7 +53,7 @@
   "column.blocks": "Blokeeritud kasutajad",
   "column.community": "Kohalik ajajoon",
   "column.direct": "Otsesõnumid",
-  "column.directory": "Browse profiles",
+  "column.directory": "Sirvi profiile",
   "column.domain_blocks": "Peidetud domeenid",
   "column.favourites": "Lemmikud",
   "column.follow_requests": "Jälgimistaotlused",
@@ -100,10 +100,10 @@
   "confirmations.delete_list.message": "Oled kindel, et soovid selle nimekirja püsivalt kustutada?",
   "confirmations.domain_block.confirm": "Peida terve domeen",
   "confirmations.domain_block.message": "Oled ikka päris kindel, et soovid blokeerida terve  {domain}? Enamikul juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatav. Sa ei näe selle domeeni sisu üheski avalikus ajajoones või teadetes. Sinu jälgijad sellest domeenist eemaldatakse.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.logout.confirm": "Välju",
+  "confirmations.logout.message": "Kas oled kindel, et soovid välja logida?",
   "confirmations.mute.confirm": "Vaigista",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "See peidab postitusi temalt ning postitusi, kus mainitakse neid, kuid see lubab neil ikka näha Teie postitusi ning Teid jälgida.",
   "confirmations.mute.message": "Oled kindel, et soovid {name} vaigistada?",
   "confirmations.redraft.confirm": "Kustuta & taasalusta",
   "confirmations.redraft.message": "Oled kindel, et soovid selle staatuse kustutada ja alustada uuesti? Lemmikud ja upitused lähevad kaotsi ja vastused originaaalpostitusele jäävad orvuks.",
@@ -111,14 +111,14 @@
   "confirmations.reply.message": "Kohene vastamine kirjutab üle sõnumi, mida hetkel koostad. Oled kindel, et soovid jätkata?",
   "confirmations.unfollow.confirm": "Ära jälgi",
   "confirmations.unfollow.message": "Oled kindel, et ei soovi jälgida {name}?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "conversation.delete": "Kustuta vestlus",
+  "conversation.mark_as_read": "Märgi loetuks",
+  "conversation.open": "Vaata vestlust",
+  "conversation.with": "Koos {names}",
+  "directory.federated": "Teatud fediversumist",
+  "directory.local": "Ainult domeenilt {domain}",
+  "directory.new_arrivals": "Uustulijad",
+  "directory.recently_active": "Hiljuti aktiivne",
   "embed.instructions": "Manusta see staatus oma veebilehele, kopeerides alloleva koodi.",
   "embed.preview": "Nii näeb see välja:",
   "emoji_button.activity": "Tegevus",
@@ -152,10 +152,10 @@
   "empty_column.mutes": "Sa pole veel ühtegi kasutajat vaigistanud.",
   "empty_column.notifications": "Sul ei ole veel teateid. Suhtle teistega alustamaks vestlust.",
   "empty_column.public": "Siin pole midagi! Kirjuta midagi avalikut või jälgi ise kasutajaid täitmaks seda ruumi",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "Meie poolse probleemi või veebilehitseja ühilduvus probleemi tõttu ei suutnud me Teile seda lehekülge korrektselt näidata.",
+  "error.unexpected_crash.next_steps": "Proovige lehekülge uuesti avada. Kui see ei aita, võite proovida kasutada Mastodoni mõne muu veebilehitseja või äppi kaudu.",
+  "errors.unexpected_crash.copy_stacktrace": "Kopeeri stacktrace lõikelauale",
+  "errors.unexpected_crash.report_issue": "Teavita veast",
   "follow_request.authorize": "Autoriseeri",
   "follow_request.reject": "Hülga",
   "getting_started.developers": "Arendajad",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} teated",
   "poll.closed": "Suletud",
   "poll.refresh": "Värskenda",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural,one {# inimene} other {# inimest}}",
   "poll.total_votes": "{count, plural, one {# hääl} other {# hääli}}",
   "poll.vote": "Hääleta",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Teie hääletasite selle poolt",
   "poll_button.add_poll": "Lisa küsitlus",
   "poll_button.remove_poll": "Eemalda küsitlus",
   "privacy.change": "Muuda staatuse privaatsust",
@@ -314,7 +314,7 @@
   "privacy.public.short": "Avalik",
   "privacy.unlisted.long": "Ära postita avalikele ajajoontele",
   "privacy.unlisted.short": "Määramata",
-  "refresh": "Refresh",
+  "refresh": "Värskenda",
   "regeneration_indicator.label": "Laeb…",
   "regeneration_indicator.sublabel": "Sinu kodu voog on ettevalmistamisel!",
   "relative_time.days": "{number}p",
@@ -378,7 +378,7 @@
   "status.show_more": "Näita veel",
   "status.show_more_all": "Näita enam kõigile",
   "status.show_thread": "Kuva lõim",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "Pole saadaval",
   "status.unmute_conversation": "Ära vaigista vestlust",
   "status.unpin": "Kinnita profiililt lahti",
   "suggestions.dismiss": "Eira soovitust",
@@ -394,22 +394,22 @@
   "time_remaining.moments": "Hetked jäänud",
   "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {inimene} other {inimesed}} talking",
-  "trends.trending_now": "Trending now",
+  "trends.trending_now": "Praegu populaarne",
   "ui.beforeunload": "Sinu mustand läheb kaotsi, kui lahkud Mastodonist.",
   "upload_area.title": "Lohista & aseta üleslaadimiseks",
   "upload_button.label": "Lisa meedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Faili üleslaadimise limiit ületatud.",
   "upload_error.poll": "Küsitlustes pole faili üleslaadimine lubatud.",
   "upload_form.description": "Kirjelda vaegnägijatele",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "Redigeeri",
   "upload_form.undo": "Kustuta",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.analyzing_picture": "Analüüsime pilti…",
+  "upload_modal.apply": "Rakenda",
+  "upload_modal.description_placeholder": "Kiire pruun rebane hüppab üle laisa koera",
+  "upload_modal.detect_text": "Tuvasta teksti pildilt",
+  "upload_modal.edit_media": "Muuda meediat",
+  "upload_modal.hint": "Vajuta või tõmba ringi eelvaatel, et valida fookuspunkti, mis on alati nähtaval kõikidel eelvaadetel.",
+  "upload_modal.preview_label": "Eelvaade ({ratio})",
   "upload_progress.label": "Laeb üles....",
   "video.close": "Sulge video",
   "video.exit_fullscreen": "Välju täisekraanist",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index f89901ab0..9e383e85a 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Gehitu edo kendu zerrendetatik",
+  "account.add_or_remove_from_list": "Gehitu edo Kendu zerrendetatik",
   "account.badges.bot": "Bot-a",
   "account.block": "Blokeatu @{name}",
   "account.block_domain": "Ezkutatu {domain} domeinuko guztia",
@@ -39,7 +39,7 @@
   "account.unmute": "Desmututu @{name}",
   "account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak",
   "alert.rate_limited.message": "Saiatu {retry_time, time, medium} barru.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.title": "Abiadura mugatua",
   "alert.unexpected.message": "Ustekabeko errore bat gertatu da.",
   "alert.unexpected.title": "Ene!",
   "autosuggest_hashtag.per_week": "{count} asteko",
@@ -154,7 +154,7 @@
   "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste zerbitzari batzuetako erabiltzaileak hau betetzen joateko",
   "error.unexpected_crash.explanation": "Gure kodean arazoren bat dela eta, edo nabigatzailearekin bateragarritasun arazoren bat dela eta, orri hau ezin izan da ongi bistaratu.",
   "error.unexpected_crash.next_steps": "Saiatu orria berritzen. Horrek ez badu laguntzen, agian Mastodon erabiltzeko aukera duzu oraindik ere beste nabigatzaile bat edo aplikazio natibo bat erabilita.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.copy_stacktrace": "Kopiatu irteera arbelera",
   "errors.unexpected_crash.report_issue": "Eman arazoaren berri",
   "follow_request.authorize": "Baimendu",
   "follow_request.reject": "Ukatu",
@@ -405,11 +405,11 @@
   "upload_form.undo": "Ezabatu",
   "upload_modal.analyzing_picture": "Irudia aztertzen…",
   "upload_modal.apply": "Aplikatu",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Antzeman irudiko testua",
-  "upload_modal.edit_media": "Editatu multimedia",
+  "upload_modal.description_placeholder": "Azeri marroi azkar batek txakur alferraren gainetik salto egiten du",
+  "upload_modal.detect_text": "Antzeman testua iruditik",
+  "upload_modal.edit_media": "Editatu media",
   "upload_modal.hint": "Sakatu eta jaregin aurrebistako zirkulua iruditxoetan beti ikusgai egongo den puntu fokala hautatzeko.",
-  "upload_modal.preview_label": "Aurreikusi({ratio})",
+  "upload_modal.preview_label": "Aurreikusi ({ratio})",
   "upload_progress.label": "Igotzen...",
   "video.close": "Itxi bideoa",
   "video.exit_fullscreen": "Irten pantaila osotik",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 2e71e6e18..60fa0c296 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -7,7 +7,7 @@
   "account.cancel_follow_request": "Peruuta seurauspyyntö",
   "account.direct": "Viesti käyttäjälle @{name}",
   "account.domain_blocked": "Verkko-osoite piilotettu",
-  "account.edit_profile": "Muokkaa",
+  "account.edit_profile": "Muokkaa profiilia",
   "account.endorse": "Suosittele profiilissasi",
   "account.follow": "Seuraa",
   "account.followers": "Seuraajaa",
@@ -39,7 +39,7 @@
   "account.unmute": "Poista käyttäjän @{name} mykistys",
   "account.unmute_notifications": "Poista mykistys käyttäjän @{name} ilmoituksilta",
   "alert.rate_limited.message": "Yritä uudestaan {retry_time, time, medium} jälkeen.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.title": "Määrää rajoitettu",
   "alert.unexpected.message": "Tapahtui odottamaton virhe.",
   "alert.unexpected.title": "Hups!",
   "autosuggest_hashtag.per_week": "{count} viikossa",
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Kirjaudu ulos",
   "confirmations.logout.message": "Oletko varma, että haluat kirjautua ulos?",
   "confirmations.mute.confirm": "Mykistä",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Tämä piilottaa päivitykset heiltä ja päivitykset, joissa hänet mainitaan, mutta sallii silti heidän nähdä sinun päivityksesi ja seurata sinua.",
   "confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?",
   "confirmations.redraft.confirm": "Poista & palauta muokattavaksi",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
@@ -197,7 +197,7 @@
   "introduction.interactions.reply.text": "TOOT IS NOT A WORD",
   "introduction.welcome.action": "Mennään!",
   "introduction.welcome.headline": "Ensimmäiset askeleet",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.welcome.text": "Tervetuloa fediverseen! Muutaman hetken kuluttua voit lähettää viestejä ja jutella ystävillesi useiden palvelinten halki. Mutta tämä palvelin {domain}, on erityinen — sinun profiilisi sijaitsee sillä, joten muista sen nimi.",
   "keyboard_shortcuts.back": "liiku taaksepäin",
   "keyboard_shortcuts.blocked": "avaa lista estetyistä käyttäjistä",
   "keyboard_shortcuts.boost": "buustaa",
@@ -238,7 +238,7 @@
   "lists.account.remove": "Poista listasta",
   "lists.delete": "Poista lista",
   "lists.edit": "Muokkaa listaa",
-  "lists.edit.submit": "Change title",
+  "lists.edit.submit": "Vaihda otsikko",
   "lists.new.create": "Lisää lista",
   "lists.new.title_placeholder": "Uuden listan nimi",
   "lists.search": "Etsi seuraamistasi henkilöistä",
@@ -249,7 +249,7 @@
   "missing_indicator.label": "Ei löytynyt",
   "missing_indicator.sublabel": "Tätä resurssia ei löytynyt",
   "mute_modal.hide_notifications": "Piilota tältä käyttäjältä tulevat ilmoitukset?",
-  "navigation_bar.apps": "Mobiiliapplikaatiot",
+  "navigation_bar.apps": "Mobiilisovellukset",
   "navigation_bar.blocks": "Estetyt käyttäjät",
   "navigation_bar.community_timeline": "Paikallinen aikajana",
   "navigation_bar.compose": "Kirjoita uusi tuuttaus",
@@ -381,7 +381,7 @@
   "status.uncached_media_warning": "Ei saatavilla",
   "status.unmute_conversation": "Poista keskustelun mykistys",
   "status.unpin": "Irrota profiilista",
-  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.dismiss": "Hylkää ehdotus",
   "suggestions.header": "Saatat olla kiinnostunut myös…",
   "tabs_bar.federated_timeline": "Yleinen",
   "tabs_bar.home": "Koti",
@@ -406,10 +406,10 @@
   "upload_modal.analyzing_picture": "Analysoidaan kuvaa…",
   "upload_modal.apply": "Käytä",
   "upload_modal.description_placeholder": "Eräänä jäätävänä ja pimeänä yönä gorilla ratkaisi sudokun kahdessa minuutissa",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.detect_text": "Tunnista teksti kuvasta",
+  "upload_modal.edit_media": "Muokkaa mediaa",
+  "upload_modal.hint": "Klikkaa tai vedä ympyrä esikatselussa valitaksesi keskipiste, joka näkyy aina pienoiskuvissa.",
+  "upload_modal.preview_label": "Esikatselu ({ratio})",
   "upload_progress.label": "Ladataan...",
   "video.close": "Sulje video",
   "video.exit_fullscreen": "Poistu koko näytön tilasta",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 38f20b619..a92f23415 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -3,7 +3,7 @@
   "account.badges.bot": "Robot",
   "account.block": "Bloquer @{name}",
   "account.block_domain": "Tout masquer venant de {domain}",
-  "account.blocked": "Bloqué",
+  "account.blocked": "Bloqué·e",
   "account.cancel_follow_request": "Annuler la demande de suivi",
   "account.direct": "Envoyer un message direct à @{name}",
   "account.domain_blocked": "Domaine caché",
@@ -24,7 +24,7 @@
   "account.moved_to": "{name} a déménagé vers :",
   "account.mute": "Masquer @{name}",
   "account.mute_notifications": "Ignorer les notifications de @{name}",
-  "account.muted": "Silencé",
+  "account.muted": "Silencé·e",
   "account.never_active": "Jamais",
   "account.posts": "Pouets",
   "account.posts_with_replies": "Pouets et réponses",
@@ -56,7 +56,7 @@
   "column.directory": "Parcourir les profils",
   "column.domain_blocks": "Domaines cachés",
   "column.favourites": "Favoris",
-  "column.follow_requests": "Demandes de suivi",
+  "column.follow_requests": "Demandes d'abonnement",
   "column.home": "Accueil",
   "column.lists": "Listes",
   "column.mutes": "Comptes masqués",
@@ -73,8 +73,8 @@
   "column_subheading.settings": "Paramètres",
   "community.column_settings.media_only": "Média uniquement",
   "compose_form.direct_message_warning": "Ce pouet sera uniquement envoyé aux personnes mentionnées. Cependant, l’administration de votre instance et des instances réceptrices pourront inspecter ce message.",
-  "compose_form.direct_message_warning_learn_more": "Plus d’informations",
-  "compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur \"non listé\". Seuls les pouets avec une visibilité \"publique\" peuvent être recherchés par hashtag.",
+  "compose_form.direct_message_warning_learn_more": "En savoir plus",
+  "compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur « non listé ». Seuls les pouets avec une visibilité « publique » peuvent être recherchés par hashtag.",
   "compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos pouets privés.",
   "compose_form.lock_disclaimer.lock": "verrouillé",
   "compose_form.placeholder": "Qu’avez-vous en tête ?",
@@ -101,28 +101,28 @@
   "confirmations.domain_block.confirm": "Masquer le domaine entier",
   "confirmations.domain_block.message": "Êtes-vous vraiment, vraiment sûr⋅e de vouloir bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.",
   "confirmations.logout.confirm": "Déconnexion",
-  "confirmations.logout.message": "Êtes-vous sûr de vouloir vous déconnecter ?",
+  "confirmations.logout.message": "Êtes-vous sûr·e de vouloir vous déconnecter ?",
   "confirmations.mute.confirm": "Masquer",
-  "confirmations.mute.explanation": "Cela masquera leurs messages et les messages les mentionnant, mais cela leur permettra quand même de voir vos messages et vous suivre.",
+  "confirmations.mute.explanation": "Cela masquera ses messages et les messages le ou la mentionnant, mais cela lui permettra quand même de voir vos messages et de vous suivre.",
   "confirmations.mute.message": "Êtes-vous sûr·e de vouloir masquer {name} ?",
   "confirmations.redraft.confirm": "Effacer et ré-écrire",
   "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer ce statut pour le ré-écrire ? Ses partages ainsi que ses mises en favori seront perdu·e·s et ses réponses seront orphelines.",
   "confirmations.reply.confirm": "Répondre",
-  "confirmations.reply.message": "Répondre maintenant écrasera le message que vous composez actuellement. Êtes-vous sûr de vouloir continuer ?",
+  "confirmations.reply.message": "Répondre maintenant écrasera le message que vous composez actuellement. Êtes-vous sûr·e de vouloir continuer ?",
   "confirmations.unfollow.confirm": "Ne plus suivre",
-  "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?",
+  "confirmations.unfollow.message": "Êtes-vous sûr·e de vouloir arrêter de suivre {name} ?",
   "conversation.delete": "Supprimer la conversation",
   "conversation.mark_as_read": "Marquer comme lu",
   "conversation.open": "Afficher la conversation",
   "conversation.with": "Avec {names}",
   "directory.federated": "Du fédiverse connu",
   "directory.local": "De {domain} seulement",
-  "directory.new_arrivals": "Nouveaux arrivants",
-  "directory.recently_active": "Récemment actif",
+  "directory.new_arrivals": "Nouveaux·elles arrivant·e·s",
+  "directory.recently_active": "Récemment actif·ve·s",
   "embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.",
   "embed.preview": "Il apparaîtra comme cela :",
   "emoji_button.activity": "Activités",
-  "emoji_button.custom": "Personnalisé",
+  "emoji_button.custom": "Personnalisés",
   "emoji_button.flags": "Drapeaux",
   "emoji_button.food": "Nourriture & Boisson",
   "emoji_button.label": "Insérer un émoji",
@@ -149,13 +149,13 @@
   "empty_column.home.public_timeline": "le fil public",
   "empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Dès que des personnes de cette liste publieront de nouveaux statuts, ils apparaîtront ici.",
   "empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.",
-  "empty_column.mutes": "Vous n’avez pas encore mis d’utilisateur·rice·s en silence.",
+  "empty_column.mutes": "Vous n’avez pas encore silencié d’utilisateur·rice·s.",
   "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.",
-  "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour le remplir",
-  "error.unexpected_crash.explanation": "En raison d’un bug dans notre code ou d’un problème de compatibilité avec le navigateur, cette page n’a pas pu être affichée correctement.",
+  "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres serveurs pour remplir le fil public",
+  "error.unexpected_crash.explanation": "En raison d’un bug dans notre code ou d’un problème de compatibilité avec votre navigateur, cette page n’a pas pu être affichée correctement.",
   "error.unexpected_crash.next_steps": "Essayez de rafraîchir la page. Si cela n’aide pas, vous pouvez toujours utiliser Mastodon via un autre navigateur ou une application native.",
-  "errors.unexpected_crash.copy_stacktrace": "Copier la trace-pile dans le presse-papier",
-  "errors.unexpected_crash.report_issue": "Signaler un bogue",
+  "errors.unexpected_crash.copy_stacktrace": "Copier la trace d'appels dans le presse-papier",
+  "errors.unexpected_crash.report_issue": "Signaler le problème",
   "follow_request.authorize": "Accepter",
   "follow_request.reject": "Rejeter",
   "getting_started.developers": "Développeur·euse·s",
@@ -163,14 +163,14 @@
   "getting_started.documentation": "Documentation",
   "getting_started.heading": "Pour commencer",
   "getting_started.invite": "Inviter des gens",
-  "getting_started.open_source_notice": "Mastodon est un logiciel libre. Vous pouvez contribuer et envoyer vos commentaires et rapports de bogues via {github} sur GitHub.",
+  "getting_started.open_source_notice": "Mastodon est un logiciel libre. Vous pouvez contribuer ou faire des rapports de bogues via {github} sur GitHub.",
   "getting_started.security": "Sécurité",
   "getting_started.terms": "Conditions d’utilisation",
   "hashtag.column_header.tag_mode.all": "et {additional}",
   "hashtag.column_header.tag_mode.any": "ou {additional}",
   "hashtag.column_header.tag_mode.none": "sans {additional}",
   "hashtag.column_settings.select.no_options_message": "Aucune suggestion trouvée",
-  "hashtag.column_settings.select.placeholder": "Ajouter des mots-clés…",
+  "hashtag.column_settings.select.placeholder": "Ajouter des hashtags…",
   "hashtag.column_settings.tag_mode.all": "Tous ces éléments",
   "hashtag.column_settings.tag_mode.any": "Au moins un de ces éléments",
   "hashtag.column_settings.tag_mode.none": "Aucun de ces éléments",
@@ -190,7 +190,7 @@
   "introduction.federation.local.text": "Les messages publics de personnes se trouvant sur le même serveur que vous apparaîtront sur le fil public local.",
   "introduction.interactions.action": "Finir le tutoriel !",
   "introduction.interactions.favourite.headline": "Favoris",
-  "introduction.interactions.favourite.text": "Vous pouvez garder un pouet pour plus tard et faire savoir à son auteur·ice que vous l’avez aimé, en le favorisant.",
+  "introduction.interactions.favourite.text": "Vous pouvez garder un pouet pour plus tard et faire savoir à son auteur·ice que vous l’avez aimé, en l'ajoutant aux favoris.",
   "introduction.interactions.reblog.headline": "Repartager",
   "introduction.interactions.reblog.text": "Vous pouvez partager les pouets d'autres personnes avec vos abonné·e·s en les repartageant.",
   "introduction.interactions.reply.headline": "Répondre",
@@ -199,16 +199,16 @@
   "introduction.welcome.headline": "Premiers pas",
   "introduction.welcome.text": "Bienvenue dans le fediverse ! Dans quelques instants, vous pourrez diffuser des messages et parler à vos amis sur une grande variété de serveurs. Mais ce serveur, {domain}, est spécial - il héberge votre profil, alors souvenez-vous de son nom.",
   "keyboard_shortcuts.back": "pour revenir en arrière",
-  "keyboard_shortcuts.blocked": "pour ouvrir une liste d’utilisateur·rice·s bloqué·e·s",
+  "keyboard_shortcuts.blocked": "pour ouvrir la liste des comptes bloqués",
   "keyboard_shortcuts.boost": "pour partager",
   "keyboard_shortcuts.column": "pour focaliser un statut dans l’une des colonnes",
   "keyboard_shortcuts.compose": "pour focaliser la zone de rédaction",
   "keyboard_shortcuts.description": "Description",
-  "keyboard_shortcuts.direct": "pour ouvrir une colonne des messages directs",
+  "keyboard_shortcuts.direct": "pour ouvrir la colonne des messages directs",
   "keyboard_shortcuts.down": "pour descendre dans la liste",
   "keyboard_shortcuts.enter": "pour ouvrir le statut",
   "keyboard_shortcuts.favourite": "pour ajouter aux favoris",
-  "keyboard_shortcuts.favourites": "pour ouvrir une liste de favoris",
+  "keyboard_shortcuts.favourites": "pour ouvrir la liste des pouets favoris",
   "keyboard_shortcuts.federated": "pour ouvrir le fil public global",
   "keyboard_shortcuts.heading": "Raccourcis clavier",
   "keyboard_shortcuts.home": "pour ouvrir l’accueil",
@@ -216,7 +216,7 @@
   "keyboard_shortcuts.legend": "pour afficher cette légende",
   "keyboard_shortcuts.local": "pour ouvrir le fil public local",
   "keyboard_shortcuts.mention": "pour mentionner l’auteur·rice",
-  "keyboard_shortcuts.muted": "pour ouvrir la liste des utilisateur·rice·s rendu·e·s muet·te·s",
+  "keyboard_shortcuts.muted": "pour ouvrir la liste des utilisateur·rice·s muté·e·s",
   "keyboard_shortcuts.my_profile": "pour ouvrir votre profil",
   "keyboard_shortcuts.notifications": "pour ouvrir votre colonne de notifications",
   "keyboard_shortcuts.pinned": "pour ouvrir une liste des pouets épinglés",
@@ -224,7 +224,7 @@
   "keyboard_shortcuts.reply": "pour répondre",
   "keyboard_shortcuts.requests": "pour ouvrir la liste de demandes de suivi",
   "keyboard_shortcuts.search": "pour cibler la recherche",
-  "keyboard_shortcuts.start": "pour ouvrir la colonne \"pour commencer\"",
+  "keyboard_shortcuts.start": "pour ouvrir la colonne « pour commencer »",
   "keyboard_shortcuts.toggle_hidden": "pour afficher/cacher un texte derrière CW",
   "keyboard_shortcuts.toggle_sensitivity": "pour afficher/cacher les médias",
   "keyboard_shortcuts.toot": "pour démarrer un tout nouveau pouet",
@@ -236,9 +236,9 @@
   "lightbox.view_context": "Voir le contexte",
   "lists.account.add": "Ajouter à la liste",
   "lists.account.remove": "Supprimer de la liste",
-  "lists.delete": "Effacer la liste",
+  "lists.delete": "Supprimer la liste",
   "lists.edit": "Éditer la liste",
-  "lists.edit.submit": "Changer le titre",
+  "lists.edit.submit": "Modifier le titre",
   "lists.new.create": "Ajouter une liste",
   "lists.new.title_placeholder": "Titre de la nouvelle liste",
   "lists.search": "Rechercher parmi les gens que vous suivez",
@@ -252,7 +252,7 @@
   "navigation_bar.apps": "Applications mobiles",
   "navigation_bar.blocks": "Comptes bloqués",
   "navigation_bar.community_timeline": "Fil public local",
-  "navigation_bar.compose": "Rédiger un nouveau toot",
+  "navigation_bar.compose": "Rédiger un nouveau pouet",
   "navigation_bar.direct": "Messages directs",
   "navigation_bar.discover": "Découvrir",
   "navigation_bar.domain_blocks": "Domaines cachés",
@@ -273,7 +273,7 @@
   "navigation_bar.security": "Sécurité",
   "notification.favourite": "{name} a ajouté à ses favoris :",
   "notification.follow": "{name} vous suit",
-  "notification.mention": "{name} vous a mentionné :",
+  "notification.mention": "{name} vous a mentionné·e :",
   "notification.poll": "Un sondage auquel vous avez participé vient de se terminer",
   "notification.reblog": "{name} a partagé votre statut :",
   "notifications.clear": "Nettoyer les notifications",
@@ -285,8 +285,8 @@
   "notifications.column_settings.filter_bar.show": "Afficher",
   "notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e·s :",
   "notifications.column_settings.mention": "Mentions :",
-  "notifications.column_settings.poll": "Résultats du sondage :",
-  "notifications.column_settings.push": "Notifications",
+  "notifications.column_settings.poll": "Résultats des sondage :",
+  "notifications.column_settings.push": "Notifications push",
   "notifications.column_settings.reblog": "Partages :",
   "notifications.column_settings.show": "Afficher dans la colonne",
   "notifications.column_settings.sound": "Émettre un son",
@@ -316,7 +316,7 @@
   "privacy.unlisted.short": "Non listé",
   "refresh": "Actualiser",
   "regeneration_indicator.label": "Chargement…",
-  "regeneration_indicator.sublabel": "Le flux de votre page principale est en cours de préparation !",
+  "regeneration_indicator.sublabel": "Votre fil principal est en cours de préparation !",
   "relative_time.days": "{number} j",
   "relative_time.hours": "{number} h",
   "relative_time.just_now": "à l’instant",
@@ -324,14 +324,14 @@
   "relative_time.seconds": "{number} s",
   "reply_indicator.cancel": "Annuler",
   "report.forward": "Transférer à {target}",
-  "report.forward_hint": "Le compte provient d’un autre serveur. Envoyez également une copie anonyme du rapport ?",
+  "report.forward_hint": "Le compte provient d’un autre serveur. Envoyer également une copie anonyme du rapport ?",
   "report.hint": "Le rapport sera envoyé aux modérateur·rice·s de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :",
   "report.placeholder": "Commentaires additionnels",
   "report.submit": "Envoyer",
-  "report.target": "Signalement",
+  "report.target": "Signalement de {target}",
   "search.placeholder": "Rechercher",
   "search_popout.search_format": "Recherche avancée",
-  "search_popout.tips.full_text": "Les textes simples retournent les pouets que vous avez écris, mis en favori, épinglés, ou ayant été mentionnés, ainsi que les identifiants, les noms affichés, et les hashtags des personnes et messages correspondant.",
+  "search_popout.tips.full_text": "Les textes simples retournent les pouets que vous avez écris, mis en favori, épinglés, ou vous mentionnant, ainsi que les identifiants, les noms affichés, et les hashtags des personnes et messages correspondant.",
   "search_popout.tips.hashtag": "hashtag",
   "search_popout.tips.status": "statuts",
   "search_popout.tips.text": "Un texte simple renvoie les noms affichés, les identifiants et les hashtags correspondants",
@@ -345,7 +345,7 @@
   "status.admin_status": "Ouvrir ce statut dans l’interface de modération",
   "status.block": "Bloquer @{name}",
   "status.cancel_reblog_private": "Dé-booster",
-  "status.cannot_reblog": "Cette publication ne peut être boostée",
+  "status.cannot_reblog": "Ce pouet ne peut pas être partagé",
   "status.copy": "Copier le lien vers le pouet",
   "status.delete": "Effacer",
   "status.detailed_status": "Vue détaillée de la conversation",
@@ -382,7 +382,7 @@
   "status.unmute_conversation": "Ne plus masquer la conversation",
   "status.unpin": "Retirer du profil",
   "suggestions.dismiss": "Rejeter la suggestion",
-  "suggestions.header": "Vous pourriez être intéressé par…",
+  "suggestions.header": "Vous pourriez être intéressé·e par…",
   "tabs_bar.federated_timeline": "Fil public global",
   "tabs_bar.home": "Accueil",
   "tabs_bar.local_timeline": "Fil public local",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 4fb924a5f..c50567aac 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -1,153 +1,153 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
-  "account.badges.bot": "Bot",
-  "account.block": "Block @{name}",
-  "account.block_domain": "Hide everything from {domain}",
-  "account.blocked": "Blocked",
-  "account.cancel_follow_request": "Cancel follow request",
-  "account.direct": "Direct message @{name}",
-  "account.domain_blocked": "Domain hidden",
-  "account.edit_profile": "Edit profile",
-  "account.endorse": "Feature on profile",
-  "account.follow": "Follow",
-  "account.followers": "Followers",
-  "account.followers.empty": "No one follows this user yet.",
-  "account.follows": "Follows",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
-  "account.follows_you": "Follows you",
-  "account.hide_reblogs": "Hide boosts from @{name}",
-  "account.last_status": "Last active",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
-  "account.media": "Media",
-  "account.mention": "Mention @{name}",
-  "account.moved_to": "{name} has moved to:",
-  "account.mute": "Mute @{name}",
-  "account.mute_notifications": "Mute notifications from @{name}",
-  "account.muted": "Muted",
-  "account.never_active": "Never",
-  "account.posts": "Toots",
-  "account.posts_with_replies": "Toots and replies",
-  "account.report": "Report @{name}",
-  "account.requested": "Awaiting approval. Click to cancel follow request",
-  "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
-  "account.unblock": "Unblock @{name}",
-  "account.unblock_domain": "Unhide {domain}",
-  "account.unendorse": "Don't feature on profile",
-  "account.unfollow": "Unfollow",
-  "account.unmute": "Unmute @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
-  "autosuggest_hashtag.per_week": "{count} per week",
-  "boost_modal.combo": "You can press {combo} to skip this next time",
-  "bundle_column_error.body": "Something went wrong while loading this component.",
-  "bundle_column_error.retry": "Try again",
-  "bundle_column_error.title": "Network error",
-  "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
-  "column.blocks": "Blocked users",
-  "column.community": "Local timeline",
-  "column.direct": "Direct messages",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "Hidden domains",
-  "column.favourites": "Favourites",
-  "column.follow_requests": "Follow requests",
-  "column.home": "Home",
-  "column.lists": "Lists",
-  "column.mutes": "Muted users",
-  "column.notifications": "Notifications",
-  "column.pins": "Pinned toot",
-  "column.public": "Federated timeline",
-  "column_back_button.label": "Back",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.media_only": "Media Only",
+  "account.add_or_remove_from_list": "सूची में जोड़ें या हटाए",
+  "account.badges.bot": "बॉट",
+  "account.block": "@{name} को ब्लॉक करें",
+  "account.block_domain": "{domain} के सारी चीज़े छुपाएं",
+  "account.blocked": "ब्लॉक",
+  "account.cancel_follow_request": "फ़ॉलो रिक्वेस्ट रद्द करें",
+  "account.direct": "प्रत्यक्ष संदेश @{name}",
+  "account.domain_blocked": "छिपा हुआ डोमेन",
+  "account.edit_profile": "प्रोफ़ाइल संपादित करें",
+  "account.endorse": "प्रोफ़ाइल पर दिखाए",
+  "account.follow": "फॉलो करें",
+  "account.followers": "फॉलोवर",
+  "account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है",
+  "account.follows": "फॉलो करें",
+  "account.follows.empty": "यह यूज़र् अभी तक किसी को फॉलो नहीं करता है।",
+  "account.follows_you": "आपको फॉलो करता है",
+  "account.hide_reblogs": "@{name} के बूस्ट छुपाएं",
+  "account.last_status": "अंतिम सक्रिय",
+  "account.link_verified_on": "इस लिंक का स्वामित्व {date} को चेक किया गया था",
+  "account.locked_info": "यह खाता गोपनीयता स्थिति लॉक करने के लिए सेट है। मालिक मैन्युअल रूप से समीक्षा करता है कि कौन उनको फॉलो कर सकता है।",
+  "account.media": "मीडिया",
+  "account.mention": "उल्लेख @{name}",
+  "account.moved_to": "{name} स्थानांतरित हो गया:",
+  "account.mute": "म्यूट @{name}",
+  "account.mute_notifications": "@{name} के नोटिफिकेशन म्यूट करे",
+  "account.muted": "म्यूट है",
+  "account.never_active": "कभी नहीं दिखे",
+  "account.posts": "टूट्स",
+  "account.posts_with_replies": "टूट्स एवं जवाब",
+  "account.report": "रिपोर्ट @{name}",
+  "account.requested": "मंजूरी का इंतजार। फॉलो रिक्वेस्ट को रद्द करने के लिए क्लिक करें",
+  "account.share": "@{name} की प्रोफाइल शेयर करे",
+  "account.show_reblogs": "@{name} के बूस्ट दिखाए",
+  "account.unblock": "@{name} को अनब्लॉक करें",
+  "account.unblock_domain": "{domain} दिखाए",
+  "account.unendorse": "प्रोफ़ाइल पर न दिखाए",
+  "account.unfollow": "अनफॉलो करें",
+  "account.unmute": "अनम्यूट @{name}",
+  "account.unmute_notifications": "@{name} के नोटिफिकेशन अनम्यूट करे",
+  "alert.rate_limited.message": "कृप्या {retry_time, time, medium} के बाद दुबारा कोशिश करें",
+  "alert.rate_limited.title": "सीमित दर",
+  "alert.unexpected.message": "एक अप्रत्याशित त्रुटि हुई है!",
+  "alert.unexpected.title": "उफ़!",
+  "autosuggest_hashtag.per_week": "{count} हर सप्ताह",
+  "boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है",
+  "bundle_column_error.body": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया",
+  "bundle_column_error.retry": "दुबारा कोशिश करें",
+  "bundle_column_error.title": "नेटवर्क त्रुटि",
+  "bundle_modal_error.close": "बंद",
+  "bundle_modal_error.message": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया",
+  "bundle_modal_error.retry": "दुबारा कोशिश करें",
+  "column.blocks": "ब्लॉक्ड यूज़र्स",
+  "column.community": "लोकल टाइम्लाइन",
+  "column.direct": "सीधा संदेश",
+  "column.directory": "प्रोफाइल्स खोजें",
+  "column.domain_blocks": "छुपे डोमेन्स",
+  "column.favourites": "पसंदीदा",
+  "column.follow_requests": "फॉलो रिक्वेस्ट्स",
+  "column.home": "होम",
+  "column.lists": "सूचियाँ",
+  "column.mutes": "म्यूट किये हुए यूजर",
+  "column.notifications": "नोटिफिकेशन्स",
+  "column.pins": "पिनड टूट्स",
+  "column.public": "फ़ेडरेटेड टाइम्लाइन",
+  "column_back_button.label": "पीछे जाए",
+  "column_header.hide_settings": "सेटिंग्स छुपाए",
+  "column_header.moveLeft_settings": "कॉलम को बाएं ले जाये",
+  "column_header.moveRight_settings": "कॉलम को दाएं ले जाये",
+  "column_header.pin": "पिन",
+  "column_header.show_settings": "सेटिंग्स दिखाएँ",
+  "column_header.unpin": "अनपिन",
+  "column_subheading.settings": "सेटिंग्स",
+  "community.column_settings.media_only": "सिर्फ़ मीडिया",
   "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
-  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
-  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.direct_message_warning_learn_more": "और जानें",
+  "compose_form.hashtag_warning": "यह टूट् किसी भी हैशटैग के तहत सूचीबद्ध नहीं होगा क्योंकि यह अनलिस्टेड है। हैशटैग द्वारा केवल सार्वजनिक टूट्स खोजे जा सकते हैं।",
+  "compose_form.lock_disclaimer": "आपका खाता {locked} नहीं है। आपको केवल फॉलोवर्स को दिखाई दिए जाने वाले पोस्ट देखने के लिए कोई भी फॉलो कर सकता है।",
+  "compose_form.lock_disclaimer.lock": "लॉक्ड",
   "compose_form.placeholder": "What is on your mind?",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.publish": "Toot",
+  "compose_form.poll.add_option": "विकल्प जोड़े",
+  "compose_form.poll.duration": "चुनाव की अवधि",
+  "compose_form.poll.option_placeholder": "कुल विकल्प {number}",
+  "compose_form.poll.remove_option": "इस विकल्प को हटाएँ",
+  "compose_form.publish": "टूट्",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Mark media as sensitive",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
-  "compose_form.spoiler_placeholder": "Write your warning here",
-  "confirmation_modal.cancel": "Cancel",
-  "confirmations.block.block_and_report": "Block & Report",
-  "confirmations.block.confirm": "Block",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
-  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
-  "confirmations.mute.confirm": "Mute",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
-  "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
-  "emoji_button.activity": "Activity",
-  "emoji_button.custom": "Custom",
-  "emoji_button.flags": "Flags",
-  "emoji_button.food": "Food & Drink",
-  "emoji_button.label": "Insert emoji",
-  "emoji_button.nature": "Nature",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Objects",
-  "emoji_button.people": "People",
-  "emoji_button.recent": "Frequently used",
-  "emoji_button.search": "Search...",
-  "emoji_button.search_results": "Search results",
-  "emoji_button.symbols": "Symbols",
-  "emoji_button.travel": "Travel & Places",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
-  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
-  "empty_column.hashtag": "There is nothing in this hashtag yet.",
-  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
-  "empty_column.home.public_timeline": "the public timeline",
-  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें",
+  "compose_form.sensitive.marked": "मीडिया संवेदनशील के रूप में चिह्नित है",
+  "compose_form.sensitive.unmarked": "मीडिया संवेदनशील के रूप में चिह्नित नहीं है",
+  "compose_form.spoiler.marked": "चेतावनी के पीछे टेक्स्ट छिपा है",
+  "compose_form.spoiler.unmarked": "टेक्स्ट छिपा नहीं है",
+  "compose_form.spoiler_placeholder": "अपनी चेतावनी यहाँ लिखें",
+  "confirmation_modal.cancel": "रद्द करें",
+  "confirmations.block.block_and_report": "ब्लॉक एवं रिपोर्ट",
+  "confirmations.block.confirm": "ब्लॉक",
+  "confirmations.block.message": "क्या आप वाकई {name} को ब्लॉक करना चाहते हैं?",
+  "confirmations.delete.confirm": "मिटाए",
+  "confirmations.delete.message": "क्या आप वाकई इस स्टेटस को हटाना चाहते हैं?",
+  "confirmations.delete_list.confirm": "मिटाए",
+  "confirmations.delete_list.message": "क्या आप वाकई इस लिस्ट को हमेशा के लिये मिटाना चाहते हैं?",
+  "confirmations.domain_block.confirm": "संपूर्ण डोमेन छिपाएं",
+  "confirmations.domain_block.message": "क्या आप वास्तव में, वास्तव में आप पूरे {domain} को ब्लॉक करना चाहते हैं? ज्यादातर मामलों में कुछ लक्षित ब्लॉक या म्यूट पर्याप्त और बेहतर हैं। आप किसी भी सार्वजनिक समय-सीमा या अपनी सूचनाओं में उस डोमेन की सामग्री नहीं देखेंगे। उस डोमेन से आपके फॉलोवर्स को हटा दिया जाएगा।",
+  "confirmations.logout.confirm": "लॉग आउट करें",
+  "confirmations.logout.message": "आप सुनिश्चित हैं कि लॉगआउट करना चाहते हैं?",
+  "confirmations.mute.confirm": "शांत",
+  "confirmations.mute.explanation": "यह उनसे और पोस्टों का उल्लेख करते हुए उनसे छिपाएगा, लेकिन यह अभी भी उन्हें आपकी पोस्ट देखने और आपको फॉलो करने की अनुमति देगा।",
+  "confirmations.mute.message": "क्या आप वाकई {name} को शांत करना चाहते हैं?",
+  "confirmations.redraft.confirm": "मिटायें और पुनःप्रारूपण करें",
+  "confirmations.redraft.message": "क्या आप वाकई इस स्टेटस को हटाना चाहते हैं और इसे फिर से ड्राफ्ट करना चाहते हैं? पसंदीदा और बूस्ट खो जाएंगे, और मूल पोस्ट के उत्तर अनाथ हो जाएंगे।",
+  "confirmations.reply.confirm": "उत्तर दें",
+  "confirmations.reply.message": "अब उत्तर देना उस संदेश को अधिलेखित कर देगा जो आप वर्तमान में बना रहे हैं। क्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं?",
+  "confirmations.unfollow.confirm": "अनफॉलो करें",
+  "confirmations.unfollow.message": "क्या आप वाकई {name} को अनफॉलो करना चाहते हैं?",
+  "conversation.delete": "वार्तालाप हटाएँ",
+  "conversation.mark_as_read": "पढ़ा गया के रूप में चिह्नित करें",
+  "conversation.open": "वार्तालाप देखें",
+  "conversation.with": "{names} के साथ",
+  "directory.federated": "ज्ञात फेडीवर्स से",
+  "directory.local": "केवल {domain} से",
+  "directory.new_arrivals": "नए आगंतुक",
+  "directory.recently_active": "हाल में ही सक्रिय",
+  "embed.instructions": "अपने वेबसाइट पर, निचे दिए कोड को कॉपी करके, इस स्टेटस को एम्बेड करें",
+  "embed.preview": "यह ऐसा दिखेगा :",
+  "emoji_button.activity": "गतिविधि",
+  "emoji_button.custom": "निजीकृत",
+  "emoji_button.flags": "झंडे",
+  "emoji_button.food": "भोजन एवं पेय",
+  "emoji_button.label": "इमोजी डाले",
+  "emoji_button.nature": "प्रकृति",
+  "emoji_button.not_found": "कोई इमोजी नहीं मिला! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "वस्तुएं",
+  "emoji_button.people": "लोग",
+  "emoji_button.recent": "अक्सर इस्तेमाल किया जाने वाला",
+  "emoji_button.search": "खोजें",
+  "emoji_button.search_results": "खोज परिणाम",
+  "emoji_button.symbols": "प्रतीक",
+  "emoji_button.travel": "यात्रा एवं स्थान",
+  "empty_column.account_timeline": "सन्नाटा! यहां कोई टूट्स नहीं!",
+  "empty_column.account_unavailable": "प्रोफाइल उपलब्ध नहीं",
+  "empty_column.blocks": "आप अभी तक किसी भी यूजर के द्वारा ब्लॉक्ड नहीं हो।",
+  "empty_column.community": "लोकल टाइम्लाइन खाली है, कुछ देखने के लिये सार्वजनिक रूप से कुछ लिखें!",
+  "empty_column.direct": "आपके पास कोई सीधा सन्देश नहीं है, जब आप कोई भेजेंगे प्राप्त करेंगे तो यहाँ दिखेगा।",
+  "empty_column.domain_blocks": "अभी तक कोई छुपा हुआ डोमेन नहीं है।",
+  "empty_column.favourited_statuses": "आपके पास अभी कोई भी चहिता टूट नहीं है. जब आप किसी टूट को पसंद (स्टार) करेंगे, तब वो यहाँ दिखेगा।",
+  "empty_column.favourites": "अभी तक किसी ने भी इस टूट को पसंद (स्टार) नहीं किया है. जब भी कोई इसे पसंद करेगा, उनका नाम यहाँ दिखेगा।",
+  "empty_column.follow_requests": "अभी तक किसी ने भी आपका अनुसरण करने की विनती नहीं की है. जब भी कोई आपको विनती भेजेगा, वो यहाँ दिखेगी.",
+  "empty_column.hashtag": "यह हैशटैग अभी तक खाली है।",
+  "empty_column.home": "आपकी मुख्य कालक्रम अभी खली है. अन्य उपयोगकर्ताओं से मिलने के लिए और अपनी गतिविधियां शुरू करने के लिए या तो {public} पर जाएं या खोज का उपयोग करें।",
+  "empty_column.home.public_timeline": "सार्वजनिक कालक्रम",
+  "empty_column.list": "यह सूची अभी खाली है. जब इसके सदस्य कोई अभिव्यक्ति देंगे, तो वो यहां दिखाई देंगी.",
   "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
@@ -155,75 +155,75 @@
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
-  "follow_request.authorize": "Authorize",
-  "follow_request.reject": "Reject",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
-  "getting_started.heading": "Getting started",
-  "getting_started.invite": "Invite people",
-  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
-  "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "errors.unexpected_crash.report_issue": "समस्या सूचित करें",
+  "follow_request.authorize": "अधिकार दें",
+  "follow_request.reject": "अस्वीकार करें",
+  "getting_started.developers": "डेवॅलपर्स",
+  "getting_started.directory": "प्रोफ़ाइल निर्देशिका",
+  "getting_started.documentation": "प्रलेखन",
+  "getting_started.heading": "पहले कदम रखें",
+  "getting_started.invite": "दोस्तों को आमंत्रित करें",
+  "getting_started.open_source_notice": "मास्टोडॉन एक मुक्त स्रोत सॉफ्टवेयर है. आप गिटहब {github} पर इस सॉफ्टवेयर में योगदान या किसी भी समस्या को सूचित कर सकते है.",
+  "getting_started.security": "अकाउंट सेटिंग्स",
+  "getting_started.terms": "सेवा की शर्तें",
+  "hashtag.column_header.tag_mode.all": "और {additional}",
+  "hashtag.column_header.tag_mode.any": "या {additional}",
+  "hashtag.column_header.tag_mode.none": "बिना {additional}",
+  "hashtag.column_settings.select.no_options_message": "कोई सुझाव नहीं मिला",
+  "hashtag.column_settings.select.placeholder": "हैशटैग लिखें...",
+  "hashtag.column_settings.tag_mode.all": "यह सभी",
+  "hashtag.column_settings.tag_mode.any": "इनमें से कोई भी",
+  "hashtag.column_settings.tag_mode.none": "इनमें से कोई भी नहीं",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
-  "home.column_settings.basic": "Basic",
-  "home.column_settings.show_reblogs": "Show boosts",
-  "home.column_settings.show_replies": "Show replies",
+  "home.column_settings.basic": "बुनियादी",
+  "home.column_settings.show_reblogs": "बूस्ट दिखाए",
+  "home.column_settings.show_replies": "जवाबों को दिखाए",
   "intervals.full.days": "{number, plural, one {# day} other {# days}}",
   "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.action": "अगला",
+  "introduction.federation.federated.headline": "फ़ेडरेटेड",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.headline": "होम",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "लोकल",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
   "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.headline": "पसंदीदा",
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.headline": "बूस्ट",
   "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.headline": "जवाब",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.action": "आइए शुरू करते हैं!",
+  "introduction.welcome.headline": "पहले कदम",
   "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
   "keyboard_shortcuts.back": "to navigate back",
   "keyboard_shortcuts.blocked": "to open blocked users list",
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
-  "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.description": "Description",
-  "keyboard_shortcuts.direct": "to open direct messages column",
-  "keyboard_shortcuts.down": "to move down in the list",
-  "keyboard_shortcuts.enter": "to open status",
-  "keyboard_shortcuts.favourite": "to favourite",
-  "keyboard_shortcuts.favourites": "to open favourites list",
-  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.compose": "कंपोज़ टेक्स्ट-एरिया पर ध्यान केंद्रित करने के लिए",
+  "keyboard_shortcuts.description": "विवरण",
+  "keyboard_shortcuts.direct": "सीधा सन्देश कॉलम को खोलने के लिए",
+  "keyboard_shortcuts.down": "सूची में शामिल करने के लिए",
+  "keyboard_shortcuts.enter": "स्टेटस खोलने के लिए",
+  "keyboard_shortcuts.favourite": "पसंदीदा के लिए",
+  "keyboard_shortcuts.favourites": "पसंदीदा सूची खोलने के लिए",
+  "keyboard_shortcuts.federated": "फ़ैडरेटेड टाइम्लाइन खोलने के लिए",
   "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "to open home timeline",
-  "keyboard_shortcuts.hotkey": "Hotkey",
-  "keyboard_shortcuts.legend": "to display this legend",
-  "keyboard_shortcuts.local": "to open local timeline",
-  "keyboard_shortcuts.mention": "to mention author",
-  "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
-  "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.pinned": "to open pinned toots list",
-  "keyboard_shortcuts.profile": "to open author's profile",
-  "keyboard_shortcuts.reply": "to reply",
-  "keyboard_shortcuts.requests": "to open follow requests list",
-  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.home": "होम टाइम्लाइन खोलने के लिए",
+  "keyboard_shortcuts.hotkey": "हॉट-की",
+  "keyboard_shortcuts.legend": "इस लीजेंड को दिखाने के लिए",
+  "keyboard_shortcuts.local": "लोकल टाइम्लाइन खोलने के लिए",
+  "keyboard_shortcuts.mention": "लेखक को मेन्शन करने के लिए",
+  "keyboard_shortcuts.muted": "म्यूटेड यूजर की लिस्ट खोलने के लिए",
+  "keyboard_shortcuts.my_profile": "आपकी प्रोफाइल खोलने के लिए",
+  "keyboard_shortcuts.notifications": "नोटिफिकेशन कॉलम खोलने के लिए",
+  "keyboard_shortcuts.pinned": "पिनड टूट्स की लिस्ट खोलने के लिए",
+  "keyboard_shortcuts.profile": "लेखक की प्रोफाइल खोलने के लिए",
+  "keyboard_shortcuts.reply": "जवाब के लिए",
+  "keyboard_shortcuts.requests": "फॉलो रिक्वेस्ट लिस्ट खोलने के लिए",
+  "keyboard_shortcuts.search": "गहरी खोज के लिए",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -244,15 +244,15 @@
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
-  "loading_indicator.label": "Loading...",
+  "loading_indicator.label": "लोड हो रहा है...",
   "media_gallery.toggle_visible": "Toggle visibility",
-  "missing_indicator.label": "Not found",
-  "missing_indicator.sublabel": "This resource could not be found",
+  "missing_indicator.label": "नहीं मिला",
+  "missing_indicator.sublabel": "यह संसाधन नहीं मिल सका।",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
-  "navigation_bar.apps": "Mobile apps",
-  "navigation_bar.blocks": "Blocked users",
-  "navigation_bar.community_timeline": "Local timeline",
-  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.apps": "मोबाइल एप्लिकेशंस",
+  "navigation_bar.blocks": "ब्लॉक्ड यूज़र्स",
+  "navigation_bar.community_timeline": "लोकल टाइम्लाइन",
+  "navigation_bar.compose": "नया टूट् लिखें",
   "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
@@ -280,56 +280,56 @@
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
   "notifications.column_settings.favourite": "Favourites:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
-  "notifications.column_settings.follow": "New followers:",
-  "notifications.column_settings.mention": "Mentions:",
-  "notifications.column_settings.poll": "Poll results:",
-  "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.reblog": "Boosts:",
-  "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.group": "{count} notifications",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
+  "notifications.column_settings.filter_bar.advanced": "सभी श्रेणियाँ दिखाएं",
+  "notifications.column_settings.filter_bar.category": "फ़िल्टर बार",
+  "notifications.column_settings.filter_bar.show": "दिखाएँ",
+  "notifications.column_settings.follow": "नए फ़ॉलोअर्स",
+  "notifications.column_settings.mention": "उल्लेख:",
+  "notifications.column_settings.poll": "चुनाव परिणाम",
+  "notifications.column_settings.push": "पुश सूचनाएँ",
+  "notifications.column_settings.reblog": "बूस्ट:",
+  "notifications.column_settings.show": "कॉलम में दिखाएँ",
+  "notifications.column_settings.sound": "ध्वनि चलाएँ",
+  "notifications.filter.all": "सभी",
+  "notifications.filter.boosts": "बूस्ट",
+  "notifications.filter.favourites": "पसंदीदा",
+  "notifications.filter.follows": "फॉलो",
+  "notifications.filter.mentions": "उल्लेख",
+  "notifications.filter.polls": "चुनाव परिणाम",
+  "notifications.group": "{count} सूचनाएँ",
+  "poll.closed": "बंद कर दिया",
+  "poll.refresh": "रीफ्रेश करें",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
   "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
+  "poll.vote": "वोट",
+  "poll.voted": "आपने इसी उत्तर का चुनाव किया है।",
   "poll_button.add_poll": "Add a poll",
   "poll_button.remove_poll": "Remove poll",
   "privacy.change": "Adjust status privacy",
   "privacy.direct.long": "Post to mentioned users only",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "सीधा",
   "privacy.private.long": "Post to followers only",
   "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Post to public timelines",
-  "privacy.public.short": "Public",
+  "privacy.public.long": "सार्वजनिक टाइम्लाइन पर भेजें",
+  "privacy.public.short": "सार्वजनिक",
   "privacy.unlisted.long": "Do not show in public timelines",
-  "privacy.unlisted.short": "Unlisted",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
+  "privacy.unlisted.short": "अनलिस्टेड",
+  "refresh": "रीफ्रेश करें",
+  "regeneration_indicator.label": "लोड हो रहा है...",
   "regeneration_indicator.sublabel": "Your home feed is being prepared!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
+  "relative_time.just_now": "अभी",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
-  "reply_indicator.cancel": "Cancel",
+  "reply_indicator.cancel": "रद्द करें",
   "report.forward": "Forward to {target}",
   "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
   "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
   "report.placeholder": "Additional comments",
-  "report.submit": "Submit",
+  "report.submit": "सबमिट करें",
   "report.target": "Report {target}",
-  "search.placeholder": "Search",
+  "search.placeholder": "खोजें",
   "search_popout.search_format": "Advanced search format",
   "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
   "search_popout.tips.hashtag": "hashtag",
@@ -363,31 +363,31 @@
   "status.pin": "Pin on profile",
   "status.pinned": "Pinned toot",
   "status.read_more": "Read more",
-  "status.reblog": "Boost",
+  "status.reblog": "बूस्ट",
   "status.reblog_private": "Boost to original audience",
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
-  "status.reply": "Reply",
+  "status.reply": "जवाब",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
-  "status.sensitive_warning": "Sensitive content",
-  "status.share": "Share",
-  "status.show_less": "Show less",
+  "status.sensitive_warning": "संवेदनशील विषय वस्तु",
+  "status.share": "शेयर करें",
+  "status.show_less": "कम दिखाएँ",
   "status.show_less_all": "Show less for all",
-  "status.show_more": "Show more",
+  "status.show_more": "और दिखाएँ",
   "status.show_more_all": "Show more for all",
   "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "अनुपलब्ध",
   "status.unmute_conversation": "Unmute conversation",
   "status.unpin": "Unpin from profile",
   "suggestions.dismiss": "Dismiss suggestion",
   "suggestions.header": "You might be interested in…",
-  "tabs_bar.federated_timeline": "Federated",
-  "tabs_bar.home": "Home",
-  "tabs_bar.local_timeline": "Local",
-  "tabs_bar.notifications": "Notifications",
-  "tabs_bar.search": "Search",
+  "tabs_bar.federated_timeline": "फ़ेडरेटेड",
+  "tabs_bar.home": "होम",
+  "tabs_bar.local_timeline": "लोकल",
+  "tabs_bar.notifications": "सूचनाएँ",
+  "tabs_bar.search": "खोजें",
   "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
   "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
@@ -397,20 +397,20 @@
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
   "upload_form.description": "Describe for the visually impaired",
-  "upload_form.edit": "Edit",
-  "upload_form.undo": "Delete",
+  "upload_form.edit": "संशोधन करें",
+  "upload_form.undo": "मिटाए",
   "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
+  "upload_modal.apply": "लागू करें",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
   "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
+  "upload_modal.edit_media": "मीडिया में संशोधन करें",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
   "upload_modal.preview_label": "Preview ({ratio})",
-  "upload_progress.label": "Uploading...",
+  "upload_progress.label": "अपलोडिंग...",
   "video.close": "Close video",
   "video.exit_fullscreen": "Exit full screen",
   "video.expand": "Expand video",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index c35c943e6..72dd6b986 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Hozzáadás és elvétel listáról",
+  "account.add_or_remove_from_list": "Hozzáadás vagy eltávolítás a listáról",
   "account.badges.bot": "Bot",
   "account.block": "@{name} letiltása",
   "account.block_domain": "Minden elrejtése innen: {domain}",
@@ -12,13 +12,13 @@
   "account.follow": "Követés",
   "account.followers": "Követő",
   "account.followers.empty": "Ezt a felhasználót még senki sem követi.",
-  "account.follows": "Követett",
+  "account.follows": "Követések",
   "account.follows.empty": "Ez a felhasználó még senkit sem követ.",
   "account.follows_you": "Követ téged",
   "account.hide_reblogs": "@{name} megtolásainak némítása",
   "account.last_status": "Utoljára aktív",
   "account.link_verified_on": "A linket ellenőriztük: {date}",
-  "account.locked_info": "Ez a fiók zárt. A tulaj engedélyezi, ki követheti őt.",
+  "account.locked_info": "Ez a fiók zárt. A tulajdonos engedélyezi, hogy ki követheti őt.",
   "account.media": "Média",
   "account.mention": "@{name} említése",
   "account.moved_to": "{name} átköltözött:",
@@ -27,7 +27,7 @@
   "account.muted": "Némítva",
   "account.never_active": "Soha",
   "account.posts": "Tülkölés",
-  "account.posts_with_replies": "Tülkölés válaszokkal",
+  "account.posts_with_replies": "Tülkölés és válaszok",
   "account.report": "@{name} jelentése",
   "account.requested": "Engedélyre vár. Kattints a követési kérés visszavonásához",
   "account.share": "@{name} profiljának megosztása",
@@ -38,7 +38,7 @@
   "account.unfollow": "Követés vége",
   "account.unmute": "@{name} némítás feloldása",
   "account.unmute_notifications": "@{name} némított értesítéseinek feloldása",
-  "alert.rate_limited.message": "Kérlek, próbáld újra {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Próbáld újra {retry_time, time, medium} után.",
   "alert.rate_limited.title": "Forgalomkorlátozás",
   "alert.unexpected.message": "Váratlan hiba történt.",
   "alert.unexpected.title": "Hoppá!",
@@ -73,38 +73,38 @@
   "column_subheading.settings": "Beállítások",
   "community.column_settings.media_only": "Csak média",
   "compose_form.direct_message_warning": "Ezt a tülköt csak a benne megemlített felhasználók láthatják majd.",
-  "compose_form.direct_message_warning_learn_more": "Több infó",
+  "compose_form.direct_message_warning_learn_more": "Tudj meg többet",
   "compose_form.hashtag_warning": "Ez a tülköd nem fog megjelenni semmilyen hashtag alatt mivel listázatlan. Csak nyilvános tülkök kereshetőek hashtaggel.",
   "compose_form.lock_disclaimer": "A fiókod nincs {locked}. Bárki követni tud, hogy megtekintse a kizárólag követőknek szánt üzeneteidet.",
   "compose_form.lock_disclaimer.lock": "lezárva",
   "compose_form.placeholder": "Mi jár a fejedben?",
   "compose_form.poll.add_option": "Lehetőség hozzáadása",
   "compose_form.poll.duration": "Szavazás időtartama",
-  "compose_form.poll.option_placeholder": "Lehetőség {number}",
+  "compose_form.poll.option_placeholder": "{number}. lehetőség",
   "compose_form.poll.remove_option": "Lehetőség törlése",
   "compose_form.publish": "Tülk",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Média megjelölése szenzitívként",
-  "compose_form.sensitive.marked": "A médiát szenzitívnek jelölték",
-  "compose_form.sensitive.unmarked": "A médiát nem jelölték szenzitívnek",
+  "compose_form.sensitive.marked": "A médiát érzékenynek jelölték",
+  "compose_form.sensitive.unmarked": "A médiát nem jelölték érzékenynek",
   "compose_form.spoiler.marked": "A szöveg figyelmeztetés mögé van rejtve",
   "compose_form.spoiler.unmarked": "A szöveg nem rejtett",
   "compose_form.spoiler_placeholder": "Írd ide a figyelmeztetést",
   "confirmation_modal.cancel": "Mégse",
-  "confirmations.block.block_and_report": "Letiltás és Bejelentés",
+  "confirmations.block.block_and_report": "Letiltás és jelentés",
   "confirmations.block.confirm": "Letiltás",
-  "confirmations.block.message": "Biztos, hogy le szeretnéd tiltani {name}?",
+  "confirmations.block.message": "Biztos, hogy letiltod: {name}?",
   "confirmations.delete.confirm": "Törlés",
   "confirmations.delete.message": "Biztos, hogy törölni szeretnéd ezt a tülkölést?",
   "confirmations.delete_list.confirm": "Törlés",
   "confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?",
   "confirmations.domain_block.confirm": "Teljes domain elrejtése",
-  "confirmations.domain_block.message": "Egészen biztos, hogy le szeretnéd tiltani a teljes {domain}-t? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se idővonalakon, se értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.",
+  "confirmations.domain_block.message": "Biztos, hogy le szeretnéd tiltani a teljes {domain} domaint? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő, és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se az idővonalakon, se az értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.",
   "confirmations.logout.confirm": "Kijelentkezés",
-  "confirmations.logout.message": "Biztosan ki akar jelentkezni?",
+  "confirmations.logout.message": "Biztos, hogy kijelentkezel?",
   "confirmations.mute.confirm": "Némítás",
-  "confirmations.mute.explanation": "Ez elrejti a tőlük érkező posztokat, valamint az őket megemlítőket, de ők továbbra is láthatják a te posztjaidat és követhetnek is téged.",
-  "confirmations.mute.message": "Biztos, hogy némítani szeretnéd {name}?",
+  "confirmations.mute.explanation": "Ez elrejti a tőlük érkező bejegyzéseket, valamint az őket megemlítőket, de ők továbbra is láthatják a te bejegyzéseid, és követhetnek is téged.",
+  "confirmations.mute.message": "Biztos, hogy némítod: {name}?",
   "confirmations.redraft.confirm": "Törlés és újraírás",
   "confirmations.redraft.message": "Biztos, hogy ezt a tülköt szeretnéd törölni és újraírni? Minden megtolást és kedvencnek jelölést elvesztesz, az eredetire adott válaszok pedig elárvulnak.",
   "confirmations.reply.confirm": "Válasz",
@@ -116,7 +116,7 @@
   "conversation.open": "Beszélgetés megtekintése",
   "conversation.with": "{names}-el/al",
   "directory.federated": "Az ismert fediverzumból",
-  "directory.local": "Csak {domain}-ból/ből",
+  "directory.local": "Csak innen: {domain}",
   "directory.new_arrivals": "Új csatlakozók",
   "directory.recently_active": "Nemrég aktív",
   "embed.instructions": "Ágyazd be ezt a tülköt a weboldaladba az alábbi kód kimásolásával.",
@@ -127,7 +127,7 @@
   "emoji_button.food": "Étel és Ital",
   "emoji_button.label": "Emoji beszúrása",
   "emoji_button.nature": "Természet",
-  "emoji_button.not_found": "Nincsenek emojik!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "Nincsenek emodzsik!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Tárgyak",
   "emoji_button.people": "Emberek",
   "emoji_button.recent": "Gyakran használt",
@@ -136,7 +136,7 @@
   "emoji_button.symbols": "Szimbólumok",
   "emoji_button.travel": "Utazás és Helyek",
   "empty_column.account_timeline": "Itt nincs tülkölés!",
-  "empty_column.account_unavailable": "A profil nem elérhető",
+  "empty_column.account_unavailable": "A profil nem érhető el",
   "empty_column.blocks": "Még senkit sem tiltottál le.",
   "empty_column.community": "A helyi idővonal üres. Tülkölj egyet nyilvánosan, hogy elindítsd az eseményeket!",
   "empty_column.direct": "Még nincs egy közvetlen üzeneted sem. Ha küldesz vagy kapsz egyet, itt fog megjelenni.",
@@ -145,8 +145,8 @@
   "empty_column.favourites": "Még senki sem jelölte ezt a tülköt kedvencként. Ha valaki mégis megteszi, itt fogjuk mutatni.",
   "empty_column.follow_requests": "Még nincs egy követési kérésed sem. Ha kapsz egyet, itt fogjuk feltüntetni.",
   "empty_column.hashtag": "Jelenleg nem található semmi ezzel a hashtaggel.",
-  "empty_column.home": "A saját idővonalad üres! Látogasd meg a {public} -at vagy használd a keresőt, hogy megismerj másokat.",
-  "empty_column.home.public_timeline": "nyilvános idővonal",
+  "empty_column.home": "A saját idővonalad üres! Látogasd meg a {public} oldalt vagy használd a keresőt, hogy megismerj másokat.",
+  "empty_column.home.public_timeline": "a nyilvános idővonal",
   "empty_column.list": "A lista jelenleg üres. Ha a listatagok tülkölnek, itt fognak megjelenni.",
   "empty_column.lists": "Még nem hoztál létre listát. Ha csinálsz egyet, itt látszik majd.",
   "empty_column.mutes": "Még egy felhasználót sem némítottál le.",
@@ -154,28 +154,28 @@
   "empty_column.public": "Jelenleg itt nincs semmi! Írj valamit nyilvánosan vagy kövess más szervereken levő felhasználókat, hogy megtöltsd",
   "error.unexpected_crash.explanation": "Egy hiba vagy böngésző inkompatibilitás miatt ez az oldal nem jeleníthető meg rendesen.",
   "error.unexpected_crash.next_steps": "Próbáld frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy appon keresztül még mindig használhatod a Mastodont.",
-  "errors.unexpected_crash.copy_stacktrace": "Stacktrace vágólapra másolása",
-  "errors.unexpected_crash.report_issue": "Probléma bejelentése",
+  "errors.unexpected_crash.copy_stacktrace": "Veremkiíratás vágólapra másolása",
+  "errors.unexpected_crash.report_issue": "Probléma jelentése",
   "follow_request.authorize": "Engedélyezés",
-  "follow_request.reject": "Visszautasítás",
+  "follow_request.reject": "Elutasítás",
   "getting_started.developers": "Fejlesztőknek",
   "getting_started.directory": "Profilok",
   "getting_started.documentation": "Dokumentáció",
   "getting_started.heading": "Első lépések",
   "getting_started.invite": "Mások meghívása",
-  "getting_started.open_source_notice": "A Mastodon nyílt forráskódú szoftver. Csatlakozhatsz a fejlesztéshez vagy jelenthetsz problémákat GitHub-on {github}.",
-  "getting_started.security": "Biztonság",
+  "getting_started.open_source_notice": "A Mastodon nyílt forráskódú szoftver. Közreműködhetsz vagy problémákat jelenthetsz a GitHubon: {github}.",
+  "getting_started.security": "Fiókbeállítások",
   "getting_started.terms": "Felhasználási feltételek",
   "hashtag.column_header.tag_mode.all": "és {additional}",
   "hashtag.column_header.tag_mode.any": "vagy {additional}",
-  "hashtag.column_header.tag_mode.none": "nélküle {additional}",
+  "hashtag.column_header.tag_mode.none": "{additional} nélkül",
   "hashtag.column_settings.select.no_options_message": "Nincs javaslat",
   "hashtag.column_settings.select.placeholder": "Addj meg hashtageket…",
   "hashtag.column_settings.tag_mode.all": "Mindegyik",
   "hashtag.column_settings.tag_mode.any": "Bármelyik",
   "hashtag.column_settings.tag_mode.none": "Egyik sem",
-  "hashtag.column_settings.tag_toggle": "Új tagek felvétele ehhez az oszlophoz",
-  "home.column_settings.basic": "Alapértelmezések",
+  "hashtag.column_settings.tag_toggle": "Új címkék felvétele ehhez az oszlophoz",
+  "home.column_settings.basic": "Alapvető",
   "home.column_settings.show_reblogs": "Megtolások mutatása",
   "home.column_settings.show_replies": "Válaszok mutatása",
   "intervals.full.days": "{number, plural, one {# nap} other {# nap}}",
@@ -184,10 +184,10 @@
   "introduction.federation.action": "Következő",
   "introduction.federation.federated.headline": "Föderációs",
   "introduction.federation.federated.text": "A fediverzum más szervereiről származó nyilvános tülkök a föderációs idővonalon jelennek meg.",
-  "introduction.federation.home.headline": "Saját",
-  "introduction.federation.home.text": "A saját idővonaladon az általad követettek tülkjei jelennek meg. Bárkit követhetsz bármely szerveren.",
+  "introduction.federation.home.headline": "Kezdőlap",
+  "introduction.federation.home.text": "A saját idővonaladon az általad követett emberek tülkjei jelennek meg. Bárkit követhetsz, bármelyik kiszolgálón.",
   "introduction.federation.local.headline": "Helyi",
-  "introduction.federation.local.text": "A helyi idővonalon a veled közös szerveren lévő emberek nyilvános tülkjei jelennek meg.",
+  "introduction.federation.local.text": "A helyi idővonalon a veled közös kiszolgálón lévő emberek nyilvános tülkjei jelennek meg.",
   "introduction.interactions.action": "Oktatóanyag befejezése!",
   "introduction.interactions.favourite.headline": "Kedvenc",
   "introduction.interactions.favourite.text": "A kedvenc funkcióval elrakhatsz későbbre egy tülköt, illetve közölheted a szerzővel, hogy tetszett a megosztása.",
@@ -261,7 +261,7 @@
   "navigation_bar.filters": "Némított szavak",
   "navigation_bar.follow_requests": "Követési kérelmek",
   "navigation_bar.follows_and_followers": "Követettek és követők",
-  "navigation_bar.info": "Erről a szerverről",
+  "navigation_bar.info": "Erről a kiszolgálóról",
   "navigation_bar.keyboard_shortcuts": "Gyorsbillentyűk",
   "navigation_bar.lists": "Listák",
   "navigation_bar.logout": "Kijelentkezés",
@@ -284,7 +284,7 @@
   "notifications.column_settings.filter_bar.category": "Gyorskereső mező",
   "notifications.column_settings.filter_bar.show": "Mutat",
   "notifications.column_settings.follow": "Új követők:",
-  "notifications.column_settings.mention": "Megemlítéseid:",
+  "notifications.column_settings.mention": "Megemlítések:",
   "notifications.column_settings.poll": "Szavazás eredménye:",
   "notifications.column_settings.push": "Push értesítések",
   "notifications.column_settings.reblog": "Megtolások:",
@@ -317,23 +317,23 @@
   "refresh": "Frissítés",
   "regeneration_indicator.label": "Töltődik…",
   "regeneration_indicator.sublabel": "A saját idővonalad épp készül!",
-  "relative_time.days": "{number}nap",
+  "relative_time.days": "{number}n",
   "relative_time.hours": "{number}ó",
   "relative_time.just_now": "most",
   "relative_time.minutes": "{number}p",
   "relative_time.seconds": "{number}mp",
   "reply_indicator.cancel": "Mégsem",
-  "report.forward": "Továbbítás neki {target}",
-  "report.forward_hint": "Ez a fiók egy másik szerverről van. Küldjünk oda is egy anonimizált bejelentést?",
+  "report.forward": "Továbbítás: {target}",
+  "report.forward_hint": "Ez a fiók egy másik kiszolgálóról van. Oda is elküldöd a jelentés egy anonimizált másolatát?",
   "report.hint": "A bejelentést a szervered moderátorainak küldjük el. Megmagyarázhatod, miért jelented az alábbi problémát:",
   "report.placeholder": "További megjegyzések",
   "report.submit": "Küldés",
   "report.target": "{target} jelentése",
   "search.placeholder": "Keresés",
-  "search_popout.search_format": "Haladó keresés",
+  "search_popout.search_format": "Speciális keresés",
   "search_popout.tips.full_text": "Egyszerű szöveg. Illeszkedő, általad írt tülköket, kedvencnek jelöléseket, megtolást, megemlítést, felhasználói nevet, megjelenített nevet, hashtageket ad majd vissza.",
   "search_popout.tips.hashtag": "hashtag",
-  "search_popout.tips.status": "tülk",
+  "search_popout.tips.status": "állapot",
   "search_popout.tips.text": "Egyszerű szöveg. Illeszkedő megjelenített nevet, felhasználói nevet, hashtageket ad majd vissza",
   "search_popout.tips.user": "felhasználó",
   "search_results.accounts": "Emberek",
@@ -371,20 +371,20 @@
   "status.reply": "Válasz",
   "status.replyAll": "Válasz a beszélgetésre",
   "status.report": "@{name} jelentése",
-  "status.sensitive_warning": "Szenzitív tartalom",
+  "status.sensitive_warning": "Érzékeny tartalom",
   "status.share": "Megosztás",
-  "status.show_less": "Kevesebbet",
+  "status.show_less": "Kevesebb megjelenítése",
   "status.show_less_all": "Kevesebbet mindenhol",
   "status.show_more": "Többet",
   "status.show_more_all": "Többet mindenhol",
   "status.show_thread": "Szál mutatása",
-  "status.uncached_media_warning": "Nem elérhető",
+  "status.uncached_media_warning": "Nem érhető el",
   "status.unmute_conversation": "Beszélgetés némításának kikapcsolása",
   "status.unpin": "Kitűzés eltávolítása a profilodról",
   "suggestions.dismiss": "Javaslat elvetése",
   "suggestions.header": "Esetleg érdekelhet…",
   "tabs_bar.federated_timeline": "Föderációs",
-  "tabs_bar.home": "Saját",
+  "tabs_bar.home": "Kezdőlap",
   "tabs_bar.local_timeline": "Helyi",
   "tabs_bar.notifications": "Értesítések",
   "tabs_bar.search": "Keresés",
@@ -394,17 +394,17 @@
   "time_remaining.moments": "Pillanatok vannak hátra",
   "time_remaining.seconds": "{number, plural, one {# másodperc} other {# másodperc}} van hátra",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {résztvevő} other {résztvevő}} beszélget",
-  "trends.trending_now": "Most trendi",
-  "ui.beforeunload": "A piszkozatod el fog veszni, ha elhagyod a Mastodon-t.",
+  "trends.trending_now": "Most felkapott",
+  "ui.beforeunload": "A piszkozatod el fog veszni, ha elhagyod a Mastodont.",
   "upload_area.title": "Húzd ide a feltöltéshez",
-  "upload_button.label": "Média hozzáadása (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "Túllépted a fájl feltöltési limitet.",
+  "upload_button.label": "Média hozzáadása ({formats})",
+  "upload_error.limit": "Túllépted a fájlfeltöltési korlátot.",
   "upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.",
   "upload_form.description": "Leírás látáskorlátozottak számára",
   "upload_form.edit": "Szerkesztés",
   "upload_form.undo": "Mégsem",
   "upload_modal.analyzing_picture": "Kép elemzése…",
-  "upload_modal.apply": "Alkalmazás",
+  "upload_modal.apply": "Alkalmaz",
   "upload_modal.description_placeholder": "A gyors, barna róka átugrik a lusta kutya fölött",
   "upload_modal.detect_text": "Szöveg felismerése a képről",
   "upload_modal.edit_media": "Média szerkesztése",
@@ -416,8 +416,8 @@
   "video.expand": "Videó nagyítása",
   "video.fullscreen": "Teljes képernyő",
   "video.hide": "Videó elrejtése",
-  "video.mute": "Hang némitása",
+  "video.mute": "Hang némítása",
   "video.pause": "Szünet",
   "video.play": "Lejátszás",
-  "video.unmute": "Hang némitásának vége"
+  "video.unmute": "Hang némításának vége"
 }
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 69af86bf2..a4c155dfe 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -73,7 +73,7 @@
   "column_subheading.settings": "Կարգավորումներ",
   "community.column_settings.media_only": "Media only",
   "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.direct_message_warning_learn_more": "Իմանալ ավելին",
   "compose_form.hashtag_warning": "Այս թութը չի հաշվառվի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարավոր է որոնել պիտակներով։",
   "compose_form.lock_disclaimer": "Քո հաշիվը {locked} չէ։ Յուրաքանչյուր ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսված գրառումները։",
   "compose_form.lock_disclaimer.lock": "փակ",
@@ -100,7 +100,7 @@
   "confirmations.delete_list.message": "Վստա՞հ ես, որ ուզում ես մշտապես ջնջել այս ցանկը։",
   "confirmations.domain_block.confirm": "Թաքցնել ամբողջ տիրույթը",
   "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրույթը։ Սովորաբար մի երկու թիրախավորված արգելափակում կամ լռեցում բավական է ու նախընտրելի։",
-  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.confirm": "Ելք",
   "confirmations.logout.message": "Are you sure you want to log out?",
   "confirmations.mute.confirm": "Լռեցնել",
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 371922a4d..167c2a766 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -228,8 +228,8 @@
   "keyboard_shortcuts.toggle_hidden": "tampilkan/sembunyikan teks di belakang CW",
   "keyboard_shortcuts.toggle_sensitivity": "tampilkan/sembunyikan media",
   "keyboard_shortcuts.toot": "mulai toot baru",
-  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
-  "keyboard_shortcuts.up": "to move up in the list",
+  "keyboard_shortcuts.unfocus": "untuk tidak fokus pada area teks/pencarian",
+  "keyboard_shortcuts.up": "untuk memindah ke atas pada daftar",
   "lightbox.close": "Tutup",
   "lightbox.next": "Selanjutnya",
   "lightbox.previous": "Sebelumnya",
@@ -243,7 +243,7 @@
   "lists.new.title_placeholder": "Judul daftar baru",
   "lists.search": "Cari di antara orang yang Anda ikuti",
   "lists.subheading": "Daftar Anda",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural, other {# item baru}}",
   "loading_indicator.label": "Tunggu sebentar...",
   "media_gallery.toggle_visible": "Tampil/Sembunyikan",
   "missing_indicator.label": "Tidak ditemukan",
@@ -260,7 +260,7 @@
   "navigation_bar.favourites": "Favorit",
   "navigation_bar.filters": "Kata yang dibisukan",
   "navigation_bar.follow_requests": "Permintaan mengikuti",
-  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.follows_and_followers": "Ikuti dan pengikut",
   "navigation_bar.info": "Informasi selengkapnya",
   "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
   "navigation_bar.lists": "Daftar",
@@ -299,12 +299,12 @@
   "notifications.group": "{count} notifikasi",
   "poll.closed": "Ditutup",
   "poll.refresh": "Segarkan",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll.total_people": "{count, plural, other {# orang}}",
+  "poll.total_votes": "{count, plural, other {# suara}}",
+  "poll.vote": "Memilih",
+  "poll.voted": "Anda memilih jawaban ini",
+  "poll_button.add_poll": "Tambah japat",
+  "poll_button.remove_poll": "Hapus japat",
   "privacy.change": "Tentukan privasi status",
   "privacy.direct.long": "Kirim hanya ke pengguna yang disebut",
   "privacy.direct.short": "Langsung",
@@ -314,110 +314,110 @@
   "privacy.public.short": "Publik",
   "privacy.unlisted.long": "Tidak ditampilkan di linimasa publik",
   "privacy.unlisted.short": "Tak Terdaftar",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
+  "refresh": "Segarkan",
+  "regeneration_indicator.label": "Memuat…",
   "regeneration_indicator.sublabel": "Linimasa anda sedang disiapkan!",
-  "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
-  "relative_time.minutes": "{number}m",
-  "relative_time.seconds": "{number}s",
+  "relative_time.days": "{number}h",
+  "relative_time.hours": "{number}j",
+  "relative_time.just_now": "sekarang",
+  "relative_time.minutes": "{number}b",
+  "relative_time.seconds": "{number}d",
   "reply_indicator.cancel": "Batal",
-  "report.forward": "Forward to {target}",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.forward": "Teruskan ke {target}",
+  "report.forward_hint": "Akun dari server lain. Kirim salinan laporan scr anonim ke sana?",
   "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
   "report.placeholder": "Komentar tambahan",
   "report.submit": "Kirim",
   "report.target": "Melaporkan",
   "search.placeholder": "Pencarian",
-  "search_popout.search_format": "Advanced search format",
-  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.search_format": "Format pencarian mahir",
+  "search_popout.tips.full_text": "Teks simpel menampilkan status yang Anda tulis, favoritkan, boost-kan, atau status yang menyebut Anda, serta nama pengguna, nama yang ditampilkan, dan tagar yang cocok.",
   "search_popout.tips.hashtag": "tagar",
   "search_popout.tips.status": "status",
-  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
-  "search_popout.tips.user": "user",
-  "search_results.accounts": "People",
-  "search_results.hashtags": "Hashtags",
-  "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_popout.tips.text": "Teks sederhana menampilkan nama yang ditampilkan, nama pengguna, dan tagar yang cocok",
+  "search_popout.tips.user": "pengguna",
+  "search_results.accounts": "Orang",
+  "search_results.hashtags": "Tagar",
+  "search_results.statuses": "Toot",
+  "search_results.statuses_fts_disabled": "Pencarian toot berdasarkan konten tidak diaktifkan di server Mastadon ini.",
   "search_results.total": "{count, number} {count, plural, one {hasil} other {hasil}}",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
-  "status.block": "Block @{name}",
-  "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "This post cannot be boosted",
-  "status.copy": "Copy link to status",
+  "status.admin_account": "Buka antar muka moderasi untuk @{name}",
+  "status.admin_status": "Buka status ini dalam antar muka moderasi",
+  "status.block": "Blokir @{name}",
+  "status.cancel_reblog_private": "Batalkan boost",
+  "status.cannot_reblog": "Pos ini tak dapat di-boost",
+  "status.copy": "Salin tautan ke status",
   "status.delete": "Hapus",
-  "status.detailed_status": "Detailed conversation view",
-  "status.direct": "Direct message @{name}",
-  "status.embed": "Embed",
+  "status.detailed_status": "Tampilan detail percakapan",
+  "status.direct": "Pesan langsung @{name}",
+  "status.embed": "Tanam",
   "status.favourite": "Difavoritkan",
-  "status.filtered": "Filtered",
+  "status.filtered": "Disaring",
   "status.load_more": "Tampilkan semua",
   "status.media_hidden": "Media disembunyikan",
   "status.mention": "Balasan @{name}",
-  "status.more": "More",
-  "status.mute": "Mute @{name}",
-  "status.mute_conversation": "Mute conversation",
+  "status.more": "Lebih banyak",
+  "status.mute": "Bisukan @{name}",
+  "status.mute_conversation": "Bisukan percakapan",
   "status.open": "Tampilkan status ini",
-  "status.pin": "Pin on profile",
-  "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
+  "status.pin": "Sematkan pada profil",
+  "status.pinned": "Toot tersemat",
+  "status.read_more": "Baca lebih banyak",
   "status.reblog": "Boost",
-  "status.reblog_private": "Boost to original audience",
+  "status.reblog_private": "Boost ke audiens asli",
   "status.reblogged_by": "di-boost {name}",
-  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
-  "status.redraft": "Delete & re-draft",
+  "status.reblogs.empty": "Belum ada yang mem-boost toot ini. Ketika seseorang melakukannya, maka akan muncul di sini.",
+  "status.redraft": "Hapus & redraf",
   "status.reply": "Balas",
   "status.replyAll": "Balas ke semua",
   "status.report": "Laporkan @{name}",
   "status.sensitive_warning": "Konten sensitif",
-  "status.share": "Share",
+  "status.share": "Bagikan",
   "status.show_less": "Tampilkan lebih sedikit",
   "status.show_less_all": "Show less for all",
   "status.show_more": "Tampilkan semua",
   "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
-  "status.unmute_conversation": "Unmute conversation",
-  "status.unpin": "Unpin from profile",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "status.show_thread": "Tampilkan utas",
+  "status.uncached_media_warning": "Tak tersedia",
+  "status.unmute_conversation": "Bunyikan percakapan",
+  "status.unpin": "Hapus sematan dari profil",
+  "suggestions.dismiss": "Hentikan saran",
+  "suggestions.header": "Anda mungkin tertarik dg…",
   "tabs_bar.federated_timeline": "Gabungan",
   "tabs_bar.home": "Beranda",
   "tabs_bar.local_timeline": "Lokal",
   "tabs_bar.notifications": "Notifikasi",
-  "tabs_bar.search": "Search",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
-  "trends.trending_now": "Trending now",
+  "tabs_bar.search": "Cari",
+  "time_remaining.days": "{number, plural, other {# hari}} tersisa",
+  "time_remaining.hours": "{number, plural, other {# jam}} tersisa",
+  "time_remaining.minutes": "{number, plural, other {# menit}} tersisa",
+  "time_remaining.moments": "Momen tersisa",
+  "time_remaining.seconds": "{number, plural, other {# detik}} tersisa",
+  "trends.count_by_accounts": "{count} {rawCount, plural, other {orang}} berbicara",
+  "trends.trending_now": "Sedang tren sekarang",
   "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.",
   "upload_area.title": "Seret & lepaskan untuk mengunggah",
   "upload_button.label": "Tambahkan media",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.limit": "Batas unggah berkas terlampaui.",
+  "upload_error.poll": "Unggah berkas tak diizinkan di japat ini.",
   "upload_form.description": "Deskripsikan untuk mereka yang tidak bisa melihat dengan jelas",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "Sunting",
   "upload_form.undo": "Undo",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.analyzing_picture": "Analisis gambar…",
+  "upload_modal.apply": "Terapkan",
+  "upload_modal.description_placeholder": "Muharjo seorang xenofobia universal yang takut pada warga jazirah, contohnya Qatar",
+  "upload_modal.detect_text": "Deteksi teks pada gambar",
+  "upload_modal.edit_media": "Sunting media",
+  "upload_modal.hint": "Klik atau seret lingkaran pada pratinjau untuk memilih titik fokus yang akan ditampilkan pada semua gambar kecil.",
+  "upload_modal.preview_label": "Pratinjau ({ratio})",
   "upload_progress.label": "Mengunggah...",
-  "video.close": "Close video",
+  "video.close": "Tutup video",
   "video.exit_fullscreen": "Keluar dari layar penuh",
   "video.expand": "Perbesar video",
-  "video.fullscreen": "Full screen",
-  "video.hide": "Hide video",
-  "video.mute": "Mute sound",
-  "video.pause": "Pause",
-  "video.play": "Play",
-  "video.unmute": "Unmute sound"
+  "video.fullscreen": "Layar penuh",
+  "video.hide": "Sembunyikan video",
+  "video.mute": "Bisukan suara",
+  "video.pause": "Jeda",
+  "video.play": "Putar",
+  "video.unmute": "Bunyikan suara"
 }
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 8d4b8f66e..757882523 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -38,7 +38,7 @@
   "account.unfollow": "Non seguire",
   "account.unmute": "Non silenziare @{name}",
   "account.unmute_notifications": "Non silenziare più le notifiche da @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Riprova dopo {retry_time, time, medium}.",
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Si è verificato un errore inatteso.",
   "alert.unexpected.title": "Oops!",
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Esci",
   "confirmations.logout.message": "Sei sicuro di voler uscire?",
   "confirmations.mute.confirm": "Silenzia",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "I post scritti da loro e quelli che li menzionano saranno nascosti, ma loro continueranno a vedere i tuoi post e a poterti seguire.",
   "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?",
   "confirmations.redraft.confirm": "Cancella e riscrivi",
   "confirmations.redraft.message": "Sei sicuro di voler cancellare questo stato e riscriverlo? Perderai tutte le risposte, condivisioni e preferiti.",
@@ -152,10 +152,10 @@
   "empty_column.mutes": "Non hai ancora silenziato nessun utente.",
   "empty_column.notifications": "Non hai ancora nessuna notifica. Interagisci con altri per iniziare conversazioni.",
   "empty_column.public": "Qui non c'è nulla! Scrivi qualcosa pubblicamente, o aggiungi utenti da altri server per riempire questo spazio",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "A causa di un bug nel nostro codice o di un problema di compatibilità del browser, questa pagina non può essere visualizzata correttamente.",
+  "error.unexpected_crash.next_steps": "Prova ad aggiornare la pagina. Se non funziona, potresti ancora essere in grado di utilizzare Mastodon attraverso un browser diverso o un'app nativa.",
+  "errors.unexpected_crash.copy_stacktrace": "Copia stacktrace negli appunti",
+  "errors.unexpected_crash.report_issue": "Segnala il problema",
   "follow_request.authorize": "Autorizza",
   "follow_request.reject": "Rifiuta",
   "getting_started.developers": "Sviluppatori",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} notifiche",
   "poll.closed": "Chiuso",
   "poll.refresh": "Aggiorna",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# persona} other {# persone}}",
   "poll.total_votes": "{count, plural, one {# voto} other {# voti}}",
   "poll.vote": "Vota",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Hai votato per questa risposta",
   "poll_button.add_poll": "Aggiungi un sondaggio",
   "poll_button.remove_poll": "Rimuovi sondaggio",
   "privacy.change": "Modifica privacy del post",
@@ -314,7 +314,7 @@
   "privacy.public.short": "Pubblico",
   "privacy.unlisted.long": "Non mostrare sulla timeline pubblica",
   "privacy.unlisted.short": "Non elencato",
-  "refresh": "Refresh",
+  "refresh": "Aggiorna",
   "regeneration_indicator.label": "Caricamento in corso…",
   "regeneration_indicator.sublabel": "Stiamo preparando il tuo home feed!",
   "relative_time.days": "{number}g",
@@ -404,7 +404,7 @@
   "upload_form.edit": "Modifica",
   "upload_form.undo": "Cancella",
   "upload_modal.analyzing_picture": "Analisi immagine…",
-  "upload_modal.apply": "Apply",
+  "upload_modal.apply": "Applica",
   "upload_modal.description_placeholder": "Ma la volpe col suo balzo ha raggiunto il quieto Fido",
   "upload_modal.detect_text": "Rileva testo dall'immagine",
   "upload_modal.edit_media": "Modifica media",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index ba0f5378e..ba13c7ddf 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -4,7 +4,7 @@
   "account.block": "Бұғаттау @{name}",
   "account.block_domain": "Домендегі барлығын бұғатта {domain}",
   "account.blocked": "Бұғатталды",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.cancel_follow_request": "Жазылуға сұранымды қайтару",
   "account.direct": "Жеке хат @{name}",
   "account.domain_blocked": "Домен жабық",
   "account.edit_profile": "Профильді өңдеу",
@@ -16,7 +16,7 @@
   "account.follows.empty": "Ешкімге жазылмапты.",
   "account.follows_you": "Сізге жазылыпты",
   "account.hide_reblogs": "@{name} атты қолданушының әрекеттерін жасыру",
-  "account.last_status": "Last active",
+  "account.last_status": "Соңғы белсенділік",
   "account.link_verified_on": "Сілтеме меншігі расталған күн {date}",
   "account.locked_info": "Бұл қолданушы өзі туралы мәліметтерді жасырған. Тек жазылғандар ғана көре алады.",
   "account.media": "Медиа",
@@ -25,7 +25,7 @@
   "account.mute": "Үнсіз қылу @{name}",
   "account.mute_notifications": "@{name} туралы ескертпелерді жасыру",
   "account.muted": "Үнсіз",
-  "account.never_active": "Never",
+  "account.never_active": "Ешқашан",
   "account.posts": "Жазбалар",
   "account.posts_with_replies": "Жазбалар мен жауаптар",
   "account.report": "Шағымдану @{name}",
@@ -38,11 +38,11 @@
   "account.unfollow": "Оқымау",
   "account.unmute": "@{name} ескертпелерін қосу",
   "account.unmute_notifications": "@{name} ескертпелерін көрсету",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.message": "Қайтадан көріңіз  {retry_time, time, medium} кейін.",
+  "alert.rate_limited.title": "Бағалау шектеулі",
   "alert.unexpected.message": "Бір нәрсе дұрыс болмады.",
   "alert.unexpected.title": "Өй!",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "autosuggest_hashtag.per_week": "{count} аптасына",
   "boost_modal.combo": "Келесіде өткізіп жіберу үшін басыңыз {combo}",
   "bundle_column_error.body": "Бұл компонентті жүктеген кезде бір қате пайда болды.",
   "bundle_column_error.retry": "Қайтадан көріңіз",
@@ -53,7 +53,7 @@
   "column.blocks": "Бұғатталғандар",
   "column.community": "Жергілікті желі",
   "column.direct": "Жеке хаттар",
-  "column.directory": "Browse profiles",
+  "column.directory": "Профильдерді аралау",
   "column.domain_blocks": "Жасырылған домендер",
   "column.favourites": "Таңдаулылар",
   "column.follow_requests": "Жазылу сұранымдары",
@@ -84,14 +84,14 @@
   "compose_form.poll.remove_option": "Бұл жауапты өшір",
   "compose_form.publish": "Түрт",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Mark media as sensitive",
+  "compose_form.sensitive.hide": "Сезімтал ретінде белгіле",
   "compose_form.sensitive.marked": "Медиа нәзік деп белгіленген",
   "compose_form.sensitive.unmarked": "Медиа нәзік деп белгіленбеген",
   "compose_form.spoiler.marked": "Мәтін ескертумен жасырылған",
   "compose_form.spoiler.unmarked": "Мәтін жасырылмаған",
   "compose_form.spoiler_placeholder": "Ескертуіңізді осында жазыңыз",
   "confirmation_modal.cancel": "Қайтып алу",
-  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.block_and_report": "Блок және Шағым",
   "confirmations.block.confirm": "Бұғаттау",
   "confirmations.block.message": "{name} атты қолданушыны бұғаттайтыныңызға сенімдісіз бе?",
   "confirmations.delete.confirm": "Өшіру",
@@ -100,10 +100,10 @@
   "confirmations.delete_list.message": "Бұл тізімді жоясыз ба шынымен?",
   "confirmations.domain_block.confirm": "Бұл доменді бұғатта",
   "confirmations.domain_block.message": "Бұл домендегі {domain} жазбаларды шынымен бұғаттайсыз ба? Кейде үнсіз қылып тастау да жеткілікті.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.logout.confirm": "Шығу",
+  "confirmations.logout.message": "Шығатыныңызға сенімдісіз бе?",
   "confirmations.mute.confirm": "Үнсіз қылу",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Олардың посттары же олар туралы меншндар сізге көрінбейді, бірақ олар сіздің посттарды көре алады және жазыла алады.",
   "confirmations.mute.message": "{name} атты қолданушы үнсіз болсын ба?",
   "confirmations.redraft.confirm": "Өшіруді құптау",
   "confirmations.redraft.message": "Бұл жазбаны өшіріп, нобайларға жібереміз бе? Барлық жауаптар мен лайктарды жоғалтасыз.",
@@ -111,14 +111,14 @@
   "confirmations.reply.message": "Жауабыңыз жазып жатқан жазбаңыздың үстіне кетеді. Жалғастырамыз ба?",
   "confirmations.unfollow.confirm": "Оқымау",
   "confirmations.unfollow.message": "\"{name} атты қолданушыға енді жазылғыңыз келмей ме?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "conversation.delete": "Пікірталасты өшіру",
+  "conversation.mark_as_read": "Оқылды деп белгіле",
+  "conversation.open": "Пікірталасты қарау",
+  "conversation.with": "{names} атты",
+  "directory.federated": "Танымал желіден",
+  "directory.local": "Тек {domain} доменінен",
+  "directory.new_arrivals": "Жаңадан келгендер",
+  "directory.recently_active": "Жақында кіргендер",
   "embed.instructions": "Төмендегі кодты көшіріп алу арқылы жазбаны басқа сайттарға да орналастыра аласыз.",
   "embed.preview": "Былай көрінетін болады:",
   "emoji_button.activity": "Белсенділік",
@@ -136,7 +136,7 @@
   "emoji_button.symbols": "Таңбалар",
   "emoji_button.travel": "Саяхат",
   "empty_column.account_timeline": "Жазба жоқ ешқандай!",
-  "empty_column.account_unavailable": "Profile unavailable",
+  "empty_column.account_unavailable": "Профиль қолжетімді емес",
   "empty_column.blocks": "Ешкімді бұғаттамағансыз.",
   "empty_column.community": "Жергілікті желі бос. Сіз бастап жазыңыз!",
   "empty_column.direct": "Әзірше дым хат жоқ. Өзіңіз жазып көріңіз алдымен.",
@@ -152,10 +152,10 @@
   "empty_column.mutes": "Әзірше ешқандай үнсізге қойылған қолданушы жоқ.",
   "empty_column.notifications": "Әзірше ешқандай ескертпе жоқ. Басқалармен араласуды бастаңыз және пікірталастарға қатысыңыз.",
   "empty_column.public": "Ештеңе жоқ бұл жерде! Өзіңіз бастап жазып көріңіз немесе басқаларға жазылыңыз",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "Кодтағы баг немесе браузердегі қатеден, бұл бет дұрыс ашылмай тұр.",
+  "error.unexpected_crash.next_steps": "Бетті жаңартып көріңіз. Егер бұл көмектеспесе, Mastodon желісін басқа браузерден немесе мобиль қосымшадан ашып көріңіз.",
+  "errors.unexpected_crash.copy_stacktrace": "Жиынтықты көшіріп ал клипбордқа",
+  "errors.unexpected_crash.report_issue": "Мәселені хабарла",
   "follow_request.authorize": "Авторизация",
   "follow_request.reject": "Қабылдамау",
   "getting_started.developers": "Жасаушылар тобы",
@@ -180,7 +180,7 @@
   "home.column_settings.show_replies": "Жауаптарды көрсету",
   "intervals.full.days": "{number, plural, one {# күн} other {# күн}}",
   "intervals.full.hours": "{number, plural, one {# сағат} other {# сағат}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "intervals.full.minutes": "{number, plural, one {# минут} other {# минут}}",
   "introduction.federation.action": "Келесі",
   "introduction.federation.federated.headline": "Жаһандық",
   "introduction.federation.federated.text": "Жаһандық желідегі жазбалар осында көрінетін болады.",
@@ -226,14 +226,14 @@
   "keyboard_shortcuts.search": "іздеу",
   "keyboard_shortcuts.start": "бастапқы бағанға бару",
   "keyboard_shortcuts.toggle_hidden": "жабық мәтінді CW ашу/жабу",
-  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toggle_sensitivity": "көрсет/жап",
   "keyboard_shortcuts.toot": "жаңа жазба бастау",
   "keyboard_shortcuts.unfocus": "жазба қалдыру алаңынан шығу",
   "keyboard_shortcuts.up": "тізімде жоғары шығу",
   "lightbox.close": "Жабу",
   "lightbox.next": "Келесі",
   "lightbox.previous": "Алдыңғы",
-  "lightbox.view_context": "View context",
+  "lightbox.view_context": "Контексті көрсет",
   "lists.account.add": "Тізімге қосу",
   "lists.account.remove": "Тізімнен шығару",
   "lists.delete": "Тізімді өшіру",
@@ -243,7 +243,7 @@
   "lists.new.title_placeholder": "Жаңа тізім аты",
   "lists.search": "Сіз іздеген адамдар арасында іздеу",
   "lists.subheading": "Тізімдеріңіз",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural, one {# жаңа нәрсе} other {# жаңа нәрсе}}",
   "loading_indicator.label": "Жүктеу...",
   "media_gallery.toggle_visible": "Көрінуді қосу",
   "missing_indicator.label": "Табылмады",
@@ -260,7 +260,7 @@
   "navigation_bar.favourites": "Таңдаулылар",
   "navigation_bar.filters": "Үнсіз сөздер",
   "navigation_bar.follow_requests": "Жазылуға сұранғандар",
-  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.follows_and_followers": "Жазылымдар және оқырмандар",
   "navigation_bar.info": "Сервер туралы",
   "navigation_bar.keyboard_shortcuts": "Ыстық пернелер",
   "navigation_bar.lists": "Тізімдер",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} ескертпе",
   "poll.closed": "Жабық",
   "poll.refresh": "Жаңарту",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# адам} other {# адам}}",
   "poll.total_votes": "{count, plural, one {# дауыс} other {# дауыс}}",
   "poll.vote": "Дауыс беру",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Бұл сұраққа жауап бердіңіз",
   "poll_button.add_poll": "Сауалнама қосу",
   "poll_button.remove_poll": "Сауалнаманы өшіру",
   "privacy.change": "Құпиялылықты реттеу",
@@ -314,14 +314,14 @@
   "privacy.public.short": "Ашық",
   "privacy.unlisted.long": "Do not show in public timelines",
   "privacy.unlisted.short": "Тізімсіз",
-  "refresh": "Refresh",
+  "refresh": "Жаңарту",
   "regeneration_indicator.label": "Жүктеу…",
   "regeneration_indicator.sublabel": "Жергілікті желі құрылуда!",
   "relative_time.days": "{number}күн",
   "relative_time.hours": "{number}сағ",
   "relative_time.just_now": "жаңа",
   "relative_time.minutes": "{number}мин",
-  "relative_time.seconds": "{number}s",
+  "relative_time.seconds": "{number}с",
   "reply_indicator.cancel": "Қайтып алу",
   "report.forward": "Жіберу {target}",
   "report.forward_hint": "Бұл аккаунт басқа серверден. Аноним шағым жібересіз бе?",
@@ -339,8 +339,8 @@
   "search_results.accounts": "Адамдар",
   "search_results.hashtags": "Хэштегтер",
   "search_results.statuses": "Жазбалар",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
-  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "search_results.statuses_fts_disabled": "Mastodon серверінде постты толық мәтінмен іздей алмайсыз.",
+  "search_results.total": "{count, number} {count, plural, one {нәтиже} other {нәтиже}}",
   "status.admin_account": "@{name} үшін модерация интерфейсін аш",
   "status.admin_status": "Бұл жазбаны модерация интерфейсінде аш",
   "status.block": "Бұғаттау @{name}",
@@ -378,7 +378,7 @@
   "status.show_more": "Толығырақ",
   "status.show_more_all": "Бәрін толығымен",
   "status.show_thread": "Желіні көрсет",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "Қолжетімді емес",
   "status.unmute_conversation": "Пікірталасты үнсіз қылмау",
   "status.unpin": "Профильден алып тастау",
   "suggestions.dismiss": "Өткізіп жіберу",
@@ -394,22 +394,22 @@
   "time_remaining.moments": "Қалған уақыт",
   "time_remaining.seconds": "{number, plural, one {# секунд} other {# секунд}}",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} жазған екен",
-  "trends.trending_now": "Trending now",
+  "trends.trending_now": "Тренд тақырыптар",
   "ui.beforeunload": "Mastodon желісінен шықсаңыз, нобайыңыз сақталмайды.",
   "upload_area.title": "Жүктеу үшін сүйреп әкеліңіз",
   "upload_button.label": "Медиа қосу (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Файл жүктеу лимитінен асып кеттіңіз.",
   "upload_error.poll": "Сауалнамамен бірге файл жүктеуге болмайды.",
   "upload_form.description": "Көру қабілеті нашар адамдар үшін сипаттаңыз",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "Түзету",
   "upload_form.undo": "Өшіру",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.analyzing_picture": "Суретті анализ жасау…",
+  "upload_modal.apply": "Қолдану",
+  "upload_modal.description_placeholder": "Щучинск съезіндегі өрт пе? Вагон-үй, аэромобиль һәм ұшақ фюзеляжы цехінен ғой",
+  "upload_modal.detect_text": "Суреттен мәтін анықтау",
+  "upload_modal.edit_media": "Медиафайлды өңдеу",
+  "upload_modal.hint": "Алдын-ала қарау шеңберін басыңыз немесе сүйреңіз, барлық нобайларда көрінетін фокусты таңдау үшін.",
+  "upload_modal.preview_label": "Превью ({ratio})",
   "upload_progress.label": "Жүктеп жатыр...",
   "video.close": "Видеоны жабу",
   "video.exit_fullscreen": "Толық экраннан шық",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
new file mode 100644
index 000000000..39ca86a0c
--- /dev/null
+++ b/app/javascript/mastodon/locales/kn.json
@@ -0,0 +1,423 @@
+{
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Bot",
+  "account.block": "Block @{name}",
+  "account.block_domain": "Hide everything from {domain}",
+  "account.blocked": "Blocked",
+  "account.cancel_follow_request": "Cancel follow request",
+  "account.direct": "Direct message @{name}",
+  "account.domain_blocked": "Domain hidden",
+  "account.edit_profile": "Edit profile",
+  "account.endorse": "Feature on profile",
+  "account.follow": "Follow",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.follows": "Follows",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.last_status": "Last active",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "Media",
+  "account.mention": "Mention @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.never_active": "Never",
+  "account.posts": "Toots",
+  "account.posts_with_replies": "Toots and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unhide {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Rate limited",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "autosuggest_hashtag.per_week": "{count} per week",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.body": "Something went wrong while loading this component.",
+  "bundle_column_error.retry": "Try again",
+  "bundle_column_error.title": "Network error",
+  "bundle_modal_error.close": "Close",
+  "bundle_modal_error.message": "Something went wrong while loading this component.",
+  "bundle_modal_error.retry": "Try again",
+  "column.blocks": "Blocked users",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.directory": "Browse profiles",
+  "column.domain_blocks": "Hidden domains",
+  "column.favourites": "Favourites",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Home",
+  "column.lists": "Lists",
+  "column.mutes": "Muted users",
+  "column.notifications": "Notifications",
+  "column.pins": "Pinned toot",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Back",
+  "column_header.hide_settings": "Hide settings",
+  "column_header.moveLeft_settings": "Move column to the left",
+  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.pin": "Pin",
+  "column_header.show_settings": "Show settings",
+  "column_header.unpin": "Unpin",
+  "column_subheading.settings": "Settings",
+  "community.column_settings.media_only": "Media only",
+  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.poll.add_option": "Add a choice",
+  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.option_placeholder": "Choice {number}",
+  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.hide": "Mark media as sensitive",
+  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.confirm": "Block",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "conversation.delete": "Delete conversation",
+  "conversation.mark_as_read": "Mark as read",
+  "conversation.open": "View conversation",
+  "conversation.with": "With {names}",
+  "directory.federated": "From known fediverse",
+  "directory.local": "From {domain} only",
+  "directory.new_arrivals": "New arrivals",
+  "directory.recently_active": "Recently active",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_unavailable": "Profile unavailable",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
+  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Report issue",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "getting_started.developers": "Developers",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Documentation",
+  "getting_started.heading": "Getting started",
+  "getting_started.invite": "Invite people",
+  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.security": "Security",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "and {additional}",
+  "hashtag.column_header.tag_mode.any": "or {additional}",
+  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.pinned": "to open pinned toots list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lightbox.view_context": "View context",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Toggle visibility",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
+  "notifications.group": "{count} notifications",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+  "poll.vote": "Vote",
+  "poll.voted": "You voted for this answer",
+  "poll_button.add_poll": "Add a poll",
+  "poll_button.remove_poll": "Remove poll",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Post to mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Post to followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Post to public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Do not show in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "refresh": "Refresh",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "reply_indicator.cancel": "Cancel",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost to original audience",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.uncached_media_warning": "Not available",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "time_remaining.moments": "Moments remaining",
+  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media ({formats})",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.edit": "Edit",
+  "upload_form.undo": "Delete",
+  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.apply": "Apply",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "video.close": "Close video",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index ea70c7055..e7c59d68f 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -99,7 +99,7 @@
   "confirmations.delete_list.confirm": "삭제",
   "confirmations.delete_list.message": "정말로 이 리스트를 삭제하시겠습니까?",
   "confirmations.domain_block.confirm": "도메인 전체를 숨김",
-  "confirmations.domain_block.message": "정말로 {domain} 전체를 숨기시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 컨텐츠를 보지 못합니다. 해당 도메인 팔로워와의 관계가 사라집니다.",
+  "confirmations.domain_block.message": "정말로 {domain} 전체를 차단하시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 컨텐츠를 보지 못합니다. 해당 도메인 팔로워와의 관계가 사라집니다.",
   "confirmations.logout.confirm": "로그아웃",
   "confirmations.logout.message": "정말로 로그아웃 하시겠습니까?",
   "confirmations.mute.confirm": "뮤트",
@@ -159,7 +159,7 @@
   "follow_request.authorize": "허가",
   "follow_request.reject": "거부",
   "getting_started.developers": "개발자",
-  "getting_started.directory": "프로필 디렉터리",
+  "getting_started.directory": "프로필 디렉토리",
   "getting_started.documentation": "문서",
   "getting_started.heading": "시작",
   "getting_started.invite": "초대",
@@ -248,7 +248,7 @@
   "media_gallery.toggle_visible": "표시 전환",
   "missing_indicator.label": "찾을 수 없습니다",
   "missing_indicator.sublabel": "이 리소스를 찾을 수 없었습니다",
-  "mute_modal.hide_notifications": "이 사용자로부터의 알림을 뮤트하시겠습니까?",
+  "mute_modal.hide_notifications": "이 사용자로부터의 알림을 숨기시겠습니까?",
   "navigation_bar.apps": "모바일 앱",
   "navigation_bar.blocks": "차단한 사용자",
   "navigation_bar.community_timeline": "로컬 타임라인",
@@ -258,7 +258,7 @@
   "navigation_bar.domain_blocks": "숨겨진 도메인",
   "navigation_bar.edit_profile": "프로필 편집",
   "navigation_bar.favourites": "즐겨찾기",
-  "navigation_bar.filters": "뮤트",
+  "navigation_bar.filters": "뮤트된 단어",
   "navigation_bar.follow_requests": "팔로우 요청",
   "navigation_bar.follows_and_followers": "팔로우와 팔로워",
   "navigation_bar.info": "이 서버에 대해서",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index 9a4a417af..5189e8ea8 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -34,7 +34,7 @@
   "account.show_reblogs": "Прикажи бустови од @{name}",
   "account.unblock": "Одблокирај @{name}",
   "account.unblock_domain": "Прикажи {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Не прикажувај на профил",
   "account.unfollow": "Одследи",
   "account.unmute": "Зачути го @{name}",
   "account.unmute_notifications": "Исклучи известувања од @{name}",
@@ -51,102 +51,102 @@
   "bundle_modal_error.message": "Настана грешка при прикажувањето на оваа веб-страница.",
   "bundle_modal_error.retry": "Обидете се повторно",
   "column.blocks": "Блокирани корисници",
-  "column.community": "Local timeline",
+  "column.community": "Локална временска зона",
   "column.direct": "Директна порака",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "Hidden domains",
-  "column.favourites": "Favourites",
+  "column.directory": "Види профили",
+  "column.domain_blocks": "Скриени домеини",
+  "column.favourites": "Омилени",
   "column.follow_requests": "Follow requests",
   "column.home": "Дома",
   "column.lists": "Листа",
-  "column.mutes": "Muted users",
+  "column.mutes": "Заќутени корисници",
   "column.notifications": "Известувања",
   "column.pins": "Pinned toot",
-  "column.public": "Federated timeline",
+  "column.public": "Федеративен времеплов",
   "column_back_button.label": "Назад",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.hide_settings": "Скриј подесувања",
+  "column_header.moveLeft_settings": "Премести колона влево",
+  "column_header.moveRight_settings": "Премести колона вдесно",
   "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
+  "column_header.show_settings": "Прикажи подесувања",
   "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.media_only": "Media only",
+  "column_subheading.settings": "Подесувања",
+  "community.column_settings.media_only": "Само медиа",
   "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.direct_message_warning_learn_more": "Научи повеќе",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
-  "compose_form.lock_disclaimer.lock": "locked",
-  "compose_form.placeholder": "What is on your mind?",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.publish": "Toot",
+  "compose_form.lock_disclaimer.lock": "заклучен",
+  "compose_form.placeholder": "Што имате на ум?",
+  "compose_form.poll.add_option": "Додај избор",
+  "compose_form.poll.duration": "Времетрање на анкета",
+  "compose_form.poll.option_placeholder": "Избери {number}",
+  "compose_form.poll.remove_option": "Избриши избор",
+  "compose_form.publish": "Тутови",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Mark media as sensitive",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.sensitive.hide": "Обележи медиа како сензитивна",
+  "compose_form.sensitive.marked": "Медиата е обележана како сензитивна",
+  "compose_form.sensitive.unmarked": "Медиата не е обележана како сензитивна",
+  "compose_form.spoiler.marked": "Текстот е сокриен зад предупредување",
+  "compose_form.spoiler.unmarked": "Текстот не е сокриен",
   "compose_form.spoiler_placeholder": "Write your warning here",
-  "confirmation_modal.cancel": "Cancel",
-  "confirmations.block.block_and_report": "Block & Report",
+  "confirmation_modal.cancel": "Откажи",
+  "confirmations.block.block_and_report": "Блокирај и Пријави",
   "confirmations.block.confirm": "Блокирај",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
-  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
-  "confirmations.mute.confirm": "Mute",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.block.message": "Сигурни сте дека дека го блокирате {name}?",
+  "confirmations.delete.confirm": "Избриши",
+  "confirmations.delete.message": "Сигурни сте дека го бришите статусот?",
+  "confirmations.delete_list.confirm": "Избриши",
+  "confirmations.delete_list.message": "Дали сте сигурни дека сакате да го избришете списоков?",
+  "confirmations.domain_block.confirm": "Сокриј цел домеин",
+  "confirmations.domain_block.message": "Дали скроз сте сигурни дека ќе блокирате сѐ од {domain}? Во повеќето случаеви неколку таргетирани блокирања или заќутувања се доволни и предложени. Нема да ја видите содржината од тој домеин во никој јавен времеплов или вашите нотификации. Вашите следбеници од тој домеин ќе бидат остранети.",
+  "confirmations.logout.confirm": "Одјави се",
+  "confirmations.logout.message": "Дали сте сигурни дека сакате да се одјавите?",
+  "confirmations.mute.confirm": "Заќути",
+  "confirmations.mute.explanation": "Ќе сокрие објави од нив и објави кои ги спомнуваат нив, но сеуште ќе им дозволи да ги видат вашите постови и ве следат.",
+  "confirmations.mute.message": "Дали ќе го заќутите {name}?",
   "confirmations.redraft.confirm": "Delete & redraft",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
-  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.confirm": "Одговори",
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
+  "confirmations.unfollow.confirm": "Одследи",
+  "confirmations.unfollow.message": "Сигурни сте дека ќе го отследите {name}?",
+  "conversation.delete": "Избриши разговор",
+  "conversation.mark_as_read": "Означете како прочитано",
+  "conversation.open": "Прегледај разговор",
+  "conversation.with": "Со {names}",
+  "directory.federated": "Од познати fediverse",
+  "directory.local": "Само од {domain}",
   "directory.new_arrivals": "New arrivals",
   "directory.recently_active": "Recently active",
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
-  "emoji_button.activity": "Activity",
+  "emoji_button.activity": "Активност",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
-  "emoji_button.food": "Food & Drink",
+  "emoji_button.food": "Храна &amp; Пијалаци",
   "emoji_button.label": "Insert emoji",
-  "emoji_button.nature": "Nature",
+  "emoji_button.nature": "Природа",
   "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Objects",
-  "emoji_button.people": "People",
-  "emoji_button.recent": "Frequently used",
-  "emoji_button.search": "Search...",
-  "emoji_button.search_results": "Search results",
-  "emoji_button.symbols": "Symbols",
-  "emoji_button.travel": "Travel & Places",
+  "emoji_button.objects": "Објекти",
+  "emoji_button.people": "Луѓе",
+  "emoji_button.recent": "Најчесто користени",
+  "emoji_button.search": "Барај...",
+  "emoji_button.search_results": "Резултати од барање",
+  "emoji_button.symbols": "Симболи",
+  "emoji_button.travel": "Патувања и Места",
   "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
-  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.account_unavailable": "Недостапен профил",
+  "empty_column.blocks": "Немате сеуште блокирано корисници.",
+  "empty_column.community": "Локалниот времеплов е празен. Објавете нешто јавно за да може да почне шоуто!",
+  "empty_column.direct": "Немате директни пораки. Кога ќе пратите или примите, ќе се појават тука.",
+  "empty_column.domain_blocks": "Немате сокриени домеини уште.",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
   "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
   "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
   "empty_column.hashtag": "There is nothing in this hashtag yet.",
   "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
-  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.home.public_timeline": "јавен времеплов",
   "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
   "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
   "empty_column.mutes": "You haven't muted any users yet.",
@@ -155,50 +155,50 @@
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
-  "follow_request.authorize": "Authorize",
-  "follow_request.reject": "Reject",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
-  "getting_started.heading": "Getting started",
-  "getting_started.invite": "Invite people",
-  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
-  "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
-  "home.column_settings.basic": "Basic",
-  "home.column_settings.show_reblogs": "Show boosts",
-  "home.column_settings.show_replies": "Show replies",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
+  "errors.unexpected_crash.report_issue": "Пријавете проблем",
+  "follow_request.authorize": "Одобри",
+  "follow_request.reject": "Одбиј",
+  "getting_started.developers": "Програмери",
+  "getting_started.directory": "Профил директориум",
+  "getting_started.documentation": "Документација",
+  "getting_started.heading": "Започни",
+  "getting_started.invite": "Покани луѓе",
+  "getting_started.open_source_notice": "Мастодон е софтвер со отворен код. Можете да придонесувате или пријавувате проблеми во GitHub на {github}.",
+  "getting_started.security": "Поставки на сметката",
+  "getting_started.terms": "Услови на користење",
+  "hashtag.column_header.tag_mode.all": "и {additional}",
+  "hashtag.column_header.tag_mode.any": "или {additional}",
+  "hashtag.column_header.tag_mode.none": "без {additional}",
+  "hashtag.column_settings.select.no_options_message": "Нема предлози",
+  "hashtag.column_settings.select.placeholder": "Внеси хаштагови…",
+  "hashtag.column_settings.tag_mode.all": "Сите овие",
+  "hashtag.column_settings.tag_mode.any": "Било кои",
+  "hashtag.column_settings.tag_mode.none": "Никои",
+  "hashtag.column_settings.tag_toggle": "Стави додатни тагови за оваа колона",
+  "home.column_settings.basic": "Основно",
+  "home.column_settings.show_reblogs": "Прикажи бустирања",
+  "home.column_settings.show_replies": "Прикажи одговори",
+  "intervals.full.days": "{number, plural, one {# ден} other {# дена}}",
+  "intervals.full.hours": "{number, plural, one {# час} other {# часа}}",
+  "intervals.full.minutes": "{number, plural, one {# минута} other {# минути}}",
+  "introduction.federation.action": "Следно",
+  "introduction.federation.federated.headline": "Федеративно",
+  "introduction.federation.federated.text": "Јавни објави од други сервери од fediverse ќе се појават во федеративниот времеплов.",
+  "introduction.federation.home.headline": "Дома",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "Локално",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.action": "Заврши туторијал!",
+  "introduction.interactions.favourite.headline": "Омилени",
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.headline": "Бустирај",
   "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.headline": "Одговори",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.action": "Да започнеме!",
+  "introduction.welcome.headline": "Почетни чекори",
   "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
-  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.back": "за да одите назад",
   "keyboard_shortcuts.blocked": "to open blocked users list",
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
@@ -221,7 +221,7 @@
   "keyboard_shortcuts.notifications": "to open notifications column",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
-  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.reply": "одговори",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
   "keyboard_shortcuts.start": "to open \"get started\" column",
@@ -256,21 +256,21 @@
   "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
-  "navigation_bar.edit_profile": "Edit profile",
-  "navigation_bar.favourites": "Favourites",
-  "navigation_bar.filters": "Muted words",
-  "navigation_bar.follow_requests": "Follow requests",
-  "navigation_bar.follows_and_followers": "Follows and followers",
-  "navigation_bar.info": "About this server",
-  "navigation_bar.keyboard_shortcuts": "Hotkeys",
-  "navigation_bar.lists": "Lists",
-  "navigation_bar.logout": "Logout",
-  "navigation_bar.mutes": "Muted users",
-  "navigation_bar.personal": "Personal",
+  "navigation_bar.edit_profile": "Уреди профил",
+  "navigation_bar.favourites": "Омилени",
+  "navigation_bar.filters": "Замолќени зборови",
+  "navigation_bar.follow_requests": "Следи покани",
+  "navigation_bar.follows_and_followers": "Следења и следбеници",
+  "navigation_bar.info": "За овој сервер",
+  "navigation_bar.keyboard_shortcuts": "Кратенки",
+  "navigation_bar.lists": "Листи",
+  "navigation_bar.logout": "Одјави се",
+  "navigation_bar.mutes": "Заќутени корисници",
+  "navigation_bar.personal": "Лично",
   "navigation_bar.pins": "Pinned toots",
   "navigation_bar.preferences": "Preferences",
-  "navigation_bar.public_timeline": "Federated timeline",
-  "navigation_bar.security": "Security",
+  "navigation_bar.public_timeline": "Федеративен времеплов",
+  "navigation_bar.security": "Безбедност",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
   "notification.mention": "{name} mentioned you",
@@ -285,56 +285,56 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
   "notifications.column_settings.mention": "Mentions:",
-  "notifications.column_settings.poll": "Poll results:",
-  "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.reblog": "Boosts:",
-  "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.group": "{count} notifications",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
-  "privacy.change": "Adjust status privacy",
-  "privacy.direct.long": "Post to mentioned users only",
-  "privacy.direct.short": "Direct",
-  "privacy.private.long": "Post to followers only",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Post to public timelines",
-  "privacy.public.short": "Public",
-  "privacy.unlisted.long": "Do not show in public timelines",
-  "privacy.unlisted.short": "Unlisted",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
-  "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
-  "relative_time.minutes": "{number}m",
-  "relative_time.seconds": "{number}s",
-  "reply_indicator.cancel": "Cancel",
-  "report.forward": "Forward to {target}",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
-  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
-  "report.placeholder": "Additional comments",
-  "report.submit": "Submit",
-  "report.target": "Report {target}",
-  "search.placeholder": "Search",
-  "search_popout.search_format": "Advanced search format",
+  "notifications.column_settings.poll": "Резултати од анкета:",
+  "notifications.column_settings.push": "Пуш нотификации",
+  "notifications.column_settings.reblog": "Бустови:",
+  "notifications.column_settings.show": "Прикажи во колона",
+  "notifications.column_settings.sound": "Свири звуци",
+  "notifications.filter.all": "Сите",
+  "notifications.filter.boosts": "Бустови",
+  "notifications.filter.favourites": "Омилени",
+  "notifications.filter.follows": "Следења",
+  "notifications.filter.mentions": "Спомнувања",
+  "notifications.filter.polls": "Резултати од анкета",
+  "notifications.group": "{count} нотификации",
+  "poll.closed": "Затворени",
+  "poll.refresh": "Освежи",
+  "poll.total_people": "{count, plural, one {# човек} other {# луѓе}}",
+  "poll.total_votes": "{count, plural, one {# глас} other {# гласа}}",
+  "poll.vote": "Гласај",
+  "poll.voted": "Вие гласавте за овој одговор",
+  "poll_button.add_poll": "Додадете нова анкета",
+  "poll_button.remove_poll": "Избришете анкета",
+  "privacy.change": "Штеловај статус на приватност",
+  "privacy.direct.long": "Објави само на спомнати корисници",
+  "privacy.direct.short": "Директно",
+  "privacy.private.long": "Објави само на следбеници",
+  "privacy.private.short": "Само следбеници",
+  "privacy.public.long": "Објави во јавни времплови",
+  "privacy.public.short": "Јавно",
+  "privacy.unlisted.long": "Не објавувај на јавни времеплови",
+  "privacy.unlisted.short": "Необјавено",
+  "refresh": "Освежи",
+  "regeneration_indicator.label": "Вчитување…",
+  "regeneration_indicator.sublabel": "Вашиот новости се подготвуваат!",
+  "relative_time.days": "{number}д",
+  "relative_time.hours": "{number}ч",
+  "relative_time.just_now": "сега",
+  "relative_time.minutes": "{number}м",
+  "relative_time.seconds": "{number}с",
+  "reply_indicator.cancel": "Откажи",
+  "report.forward": "Проследи до {target}",
+  "report.forward_hint": "Оваа сметка е од друг сервер. Испрати анонимна копија од пријавата и таму?",
+  "report.hint": "Пријавата ќе биде испратена до вашиот серверски модератор. Подолу можете да ставите опис зошто ја пријавувате сметката:",
+  "report.placeholder": "Додатни коментари",
+  "report.submit": "Испрати",
+  "report.target": "Пријавување {target}",
+  "search.placeholder": "Барај",
+  "search_popout.search_format": "Напреден формат за барање",
   "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
-  "search_popout.tips.hashtag": "hashtag",
-  "search_popout.tips.status": "status",
-  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.hashtag": "хештег",
+  "search_popout.tips.status": "состојба",
+  "search_popout.tips.text": "Прост текст враќа совпаднати имиња, корисници и хештагови",
   "search_popout.tips.user": "user",
   "search_results.accounts": "People",
   "search_results.hashtags": "Hashtags",
@@ -384,15 +384,15 @@
   "suggestions.dismiss": "Dismiss suggestion",
   "suggestions.header": "You might be interested in…",
   "tabs_bar.federated_timeline": "Federated",
-  "tabs_bar.home": "Home",
-  "tabs_bar.local_timeline": "Local",
-  "tabs_bar.notifications": "Notifications",
-  "tabs_bar.search": "Search",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "tabs_bar.home": "Дома",
+  "tabs_bar.local_timeline": "Локално",
+  "tabs_bar.notifications": "Нотификации",
+  "tabs_bar.search": "Барај",
+  "time_remaining.days": "{number, plural, one {# ден} other {# дена}} {number, plural, one {остана} other {останаа}}",
+  "time_remaining.hours": "{number, plural, one {# час} other {# часа}} {number, plural, one {остана} other {останаа}}",
+  "time_remaining.minutes": "{number, plural, one {# минута} other {# минути}} {number, plural, one {остана} other {останаа}}",
+  "time_remaining.moments": "Уште некои мига",
+  "time_remaining.seconds": "{number, plural, one {# секунда} other {# секунди}} {number, plural, one {остана} other {останаа}}",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
new file mode 100644
index 000000000..f331590de
--- /dev/null
+++ b/app/javascript/mastodon/locales/ml.json
@@ -0,0 +1,423 @@
+{
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "റോബോട്ട്",
+  "account.block": "@{name} നെ ബ്ലോക്ക് ചെയ്യുക",
+  "account.block_domain": "{domain} ഇൽ നിന്നുള്ള എല്ലാം മറയ്കുക",
+  "account.blocked": "തടഞ്ഞു",
+  "account.cancel_follow_request": "Cancel follow request",
+  "account.direct": "നേരിട്ട് മെസേജ് അയക്കുക{name}",
+  "account.domain_blocked": "Domain hidden",
+  "account.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
+  "account.endorse": "Feature on profile",
+  "account.follow": "പിന്തുടരുക",
+  "account.followers": "നിങ്ങളെ പിന്തുടരുന്നവർ",
+  "account.followers.empty": "ഈ ഉപയോക്താവിനെ ആരും ഇതുവരെ പിന്തുടരുന്നില്ല.",
+  "account.follows": "പിന്തുടരുന്നു",
+  "account.follows.empty": "ഈ ഉപയോക്താവ് ആരേയും ഇതുവരെ പിന്തുടരുന്നില്ല.",
+  "account.follows_you": "നിങ്ങളെ പിന്തുടരുന്നു",
+  "account.hide_reblogs": "@{name} ബൂസ്റ്റ് ചെയ്തവ മറയ്കുക",
+  "account.last_status": "അവസാനം കണ്ടത്",
+  "account.link_verified_on": "ഈ ലിങ്കിന്റെ ഉടമസ്തത {date} ഇൽ ഉറപ്പാക്കിയതാണ്",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "മീഡിയ",
+  "account.mention": "Mention @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "നിശ്ശബ്ദമാക്കുക @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "നിശ്ശബ്ദമാക്കിയിരിക്കുന്നു",
+  "account.never_active": "ഒരിക്കലും വേണ്ട",
+  "account.posts": "ടൂട്ടുകൾ",
+  "account.posts_with_replies": "ടൂട്ടുകളും മറുപടികളും",
+  "account.report": "റിപ്പോർട്ട് ചെയ്യുക @{name}",
+  "account.requested": "Awaiting approval",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.unblock": "ബ്ലോക്ക് മാറ്റുക @{name}",
+  "account.unblock_domain": "Unhide {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "പിന്തുടരുന്നത് നിര്‍ത്തുക",
+  "account.unmute": "നിശ്ശബ്ദമാക്കുന്നത് നിർത്തുക @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Rate limited",
+  "alert.unexpected.message": "അപ്രതീക്ഷിതമായി എന്തോ സംഭവിച്ചു.",
+  "alert.unexpected.title": "ശ്ശോ!",
+  "autosuggest_hashtag.per_week": "{count} per week",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.body": "Something went wrong while loading this component.",
+  "bundle_column_error.retry": "വീണ്ടും ശ്രമിക്കുക",
+  "bundle_column_error.title": "Network error",
+  "bundle_modal_error.close": "അടയ്ക്കുക",
+  "bundle_modal_error.message": "ഈ വെബ്പേജ് പ്രദർശിപ്പിക്കുമ്പോൾ എന്തോ കുഴപ്പം സംഭവിച്ചു.",
+  "bundle_modal_error.retry": "വീണ്ടും ശ്രമിക്കുക",
+  "column.blocks": "Blocked users",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.directory": "Browse profiles",
+  "column.domain_blocks": "Hidden domains",
+  "column.favourites": "Favourites",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Home",
+  "column.lists": "Lists",
+  "column.mutes": "Muted users",
+  "column.notifications": "Notifications",
+  "column.pins": "Pinned toot",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Back",
+  "column_header.hide_settings": "Hide settings",
+  "column_header.moveLeft_settings": "Move column to the left",
+  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.pin": "Pin",
+  "column_header.show_settings": "Show settings",
+  "column_header.unpin": "Unpin",
+  "column_subheading.settings": "Settings",
+  "community.column_settings.media_only": "Media only",
+  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.poll.add_option": "Add a choice",
+  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.option_placeholder": "Choice {number}",
+  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.hide": "Mark media as sensitive",
+  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.confirm": "Block",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "conversation.delete": "Delete conversation",
+  "conversation.mark_as_read": "Mark as read",
+  "conversation.open": "View conversation",
+  "conversation.with": "With {names}",
+  "directory.federated": "From known fediverse",
+  "directory.local": "From {domain} only",
+  "directory.new_arrivals": "New arrivals",
+  "directory.recently_active": "Recently active",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_unavailable": "Profile unavailable",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
+  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Report issue",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "getting_started.developers": "Developers",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Documentation",
+  "getting_started.heading": "Getting started",
+  "getting_started.invite": "Invite people",
+  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.security": "Security",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "and {additional}",
+  "hashtag.column_header.tag_mode.any": "or {additional}",
+  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.pinned": "to open pinned toots list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lightbox.view_context": "View context",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Toggle visibility",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
+  "notifications.group": "{count} notifications",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+  "poll.vote": "Vote",
+  "poll.voted": "You voted for this answer",
+  "poll_button.add_poll": "Add a poll",
+  "poll_button.remove_poll": "Remove poll",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Post to mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Post to followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Post to public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Do not show in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "refresh": "Refresh",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "reply_indicator.cancel": "Cancel",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost to original audience",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.uncached_media_warning": "Not available",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "time_remaining.moments": "Moments remaining",
+  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media ({formats})",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.edit": "Edit",
+  "upload_form.undo": "Delete",
+  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.apply": "Apply",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "video.close": "Close video",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
new file mode 100644
index 000000000..8af8e3493
--- /dev/null
+++ b/app/javascript/mastodon/locales/mr.json
@@ -0,0 +1,423 @@
+{
+  "account.add_or_remove_from_list": "यादीत घाला किंवा यादीतून काढून टाका",
+  "account.badges.bot": "स्वयंचलित खाते",
+  "account.block": "@{name} यांना ब्लॉक करा",
+  "account.block_domain": "{domain} पासून सर्व लपवा",
+  "account.blocked": "ब्लॉक केले आहे",
+  "account.cancel_follow_request": "अनुयायी होण्याची विनंती रद्द करा",
+  "account.direct": "थेट संदेश @{name}",
+  "account.domain_blocked": "Domain hidden",
+  "account.edit_profile": "प्रोफाइल एडिट करा",
+  "account.endorse": "Feature on profile",
+  "account.follow": "अनुयायी व्हा",
+  "account.followers": "अनुयायी",
+  "account.followers.empty": "ह्या वापरकर्त्याचा आतापर्यंत कोणी अनुयायी नाही.",
+  "account.follows": "अनुयायी आहे",
+  "account.follows.empty": "हा वापरकर्ता अजूनपर्यंत कोणाचा अनुयायी नाही.",
+  "account.follows_you": "तुमचा अनुयायी आहे",
+  "account.hide_reblogs": "@{name} पासून सर्व बूस्ट लपवा",
+  "account.last_status": "शेवटचे सक्रिय",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "दृक्‌‌श्राव्य मजकूर",
+  "account.mention": "@{name} चा उल्लेख करा",
+  "account.moved_to": "{name} आता आहे:",
+  "account.mute": "@{name} ला मूक कारा",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.never_active": "Never",
+  "account.posts": "Toots",
+  "account.posts_with_replies": "Toots and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "{name}चे सर्व बुस्ट्स दाखवा",
+  "account.unblock": "@{name} ला ब्लॉक करा",
+  "account.unblock_domain": "उघड करा {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "अनुयायी असणे थांबवा",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Rate limited",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "अरेरे!",
+  "autosuggest_hashtag.per_week": "{count} प्रतिसप्ताह",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.body": "हा घटक लोड करतांना काहीतरी चुकले आहे.",
+  "bundle_column_error.retry": "पुन्हा प्रयत्न करा",
+  "bundle_column_error.title": "नेटवर्क त्रुटी",
+  "bundle_modal_error.close": "बंद करा",
+  "bundle_modal_error.message": "हा घटक लोड करतांना काहीतरी चुकले आहे.",
+  "bundle_modal_error.retry": "पुन्हा प्रयत्न करा",
+  "column.blocks": "ब्लॉक केलेले खातेधारक",
+  "column.community": "Local timeline",
+  "column.direct": "थेट संदेश",
+  "column.directory": "Browse profiles",
+  "column.domain_blocks": "गुप्त डोमेन्स",
+  "column.favourites": "आवडते",
+  "column.follow_requests": "अनुचरण विनंत्या",
+  "column.home": "मुख्यपृष्ठ",
+  "column.lists": "याद्या",
+  "column.mutes": "नि: शब्द खातेधारक",
+  "column.notifications": "सूचना",
+  "column.pins": "Pinned toot",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "मागे",
+  "column_header.hide_settings": "सेटिंग लपवा",
+  "column_header.moveLeft_settings": "स्तंभ डावीकडे सरकवा",
+  "column_header.moveRight_settings": "स्तंभ उजवीकडे सरकवा",
+  "column_header.pin": "टाचण",
+  "column_header.show_settings": "सेटिंग्स दाखवा",
+  "column_header.unpin": "अनपिन करा",
+  "column_subheading.settings": "सेटिंग्ज",
+  "community.column_settings.media_only": "केवळ मीडिया",
+  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+  "compose_form.direct_message_warning_learn_more": "अधिक जाणून घ्या",
+  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "आपल्या मनात काय आहे?",
+  "compose_form.poll.add_option": "नवीन पर्याय",
+  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.option_placeholder": "निवड {number}",
+  "compose_form.poll.remove_option": "हा पर्याय काढा",
+  "compose_form.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.hide": "Mark media as sensitive",
+  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.confirm": "Block",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.delete.confirm": "हटवा",
+  "confirmations.delete.message": "हे स्टेटस तुम्हाला नक्की हटवायचंय?",
+  "confirmations.delete_list.confirm": "हटवा",
+  "confirmations.delete_list.message": "ही यादी तुम्हाला नक्की कायमची हटवायचीय?",
+  "confirmations.domain_block.confirm": "संपूर्ण डोमेन लपवा",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "conversation.delete": "Delete conversation",
+  "conversation.mark_as_read": "Mark as read",
+  "conversation.open": "View conversation",
+  "conversation.with": "With {names}",
+  "directory.federated": "From known fediverse",
+  "directory.local": "From {domain} only",
+  "directory.new_arrivals": "New arrivals",
+  "directory.recently_active": "Recently active",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_unavailable": "Profile unavailable",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
+  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Report issue",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "getting_started.developers": "Developers",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Documentation",
+  "getting_started.heading": "Getting started",
+  "getting_started.invite": "Invite people",
+  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.security": "Security",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "and {additional}",
+  "hashtag.column_header.tag_mode.any": "or {additional}",
+  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.pinned": "to open pinned toots list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lightbox.view_context": "View context",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Toggle visibility",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
+  "notifications.group": "{count} notifications",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+  "poll.vote": "Vote",
+  "poll.voted": "You voted for this answer",
+  "poll_button.add_poll": "Add a poll",
+  "poll_button.remove_poll": "Remove poll",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Post to mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Post to followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Post to public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Do not show in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "refresh": "Refresh",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "reply_indicator.cancel": "Cancel",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost to original audience",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.uncached_media_warning": "Not available",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "time_remaining.moments": "Moments remaining",
+  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media ({formats})",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.edit": "Edit",
+  "upload_form.undo": "Delete",
+  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.apply": "Apply",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "video.close": "Close video",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 68b8f4cbd..74aaad970 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Uitloggen",
   "confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?",
   "confirmations.mute.confirm": "Negeren",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Dit verbergt toots van hen en toots waar hen in wordt vermeld, maar hen kan nog steeds jouw toots bekijken en jou volgen.",
   "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?",
   "confirmations.redraft.confirm": "Verwijderen en herschrijven",
   "confirmations.redraft.message": "Weet je zeker dat je deze toot wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en reacties op de originele toot zitten niet meer aan de nieuwe toot vast.",
@@ -152,8 +152,8 @@
   "empty_column.mutes": "Jij hebt nog geen gebruikers genegeerd.",
   "empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.",
   "empty_column.public": "Er is hier helemaal niks! Toot iets in het openbaar of volg mensen van andere servers om het te vullen",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.explanation": "Als gevolg van een bug in onze broncode of als gevolg van een compatibiliteitsprobleem met jouw webbrowser, kan deze pagina niet goed worden weergegeven.",
+  "error.unexpected_crash.next_steps": "Probeer deze pagina te vernieuwen. Wanneer dit niet helpt is het nog steeds mogelijk om Mastodon in een andere webbrowser of mobiele app te gebruiken.",
   "errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren",
   "errors.unexpected_crash.report_issue": "Technisch probleem melden",
   "follow_request.authorize": "Goedkeuren",
@@ -164,7 +164,7 @@
   "getting_started.heading": "Aan de slag",
   "getting_started.invite": "Mensen uitnodigen",
   "getting_started.open_source_notice": "Mastodon is vrije software. Je kunt bijdragen of problemen melden op GitHub via {github}.",
-  "getting_started.security": "Beveiliging",
+  "getting_started.security": "Accountinstellingen",
   "getting_started.terms": "Voorwaarden",
   "hashtag.column_header.tag_mode.all": "en {additional}",
   "hashtag.column_header.tag_mode.any": "of {additional}",
@@ -206,7 +206,7 @@
   "keyboard_shortcuts.description": "Omschrijving",
   "keyboard_shortcuts.direct": "om jouw directe berichten te tonen",
   "keyboard_shortcuts.down": "om naar beneden door de lijst te bewegen",
-  "keyboard_shortcuts.enter": "om toot volledig te tonen",
+  "keyboard_shortcuts.enter": "om uitgebreide toot te tonen",
   "keyboard_shortcuts.favourite": "om aan jouw favorieten toe te voegen",
   "keyboard_shortcuts.favourites": "om jouw lijst met favorieten te tonen",
   "keyboard_shortcuts.federated": "om de globale tijdlijn te tonen",
@@ -359,7 +359,7 @@
   "status.more": "Meer",
   "status.mute": "Negeer @{name}",
   "status.mute_conversation": "Negeer gesprek",
-  "status.open": "Toot volledig tonen",
+  "status.open": "Uitgebreide toot tonen",
   "status.pin": "Aan profielpagina vastmaken",
   "status.pinned": "Vastgemaakte toot",
   "status.read_more": "Meer lezen",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 73a319179..039381cf0 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -150,11 +150,11 @@
   "empty_column.list": "Det er ikkje noko i denne lista enno. Når medlemmar av denne lista poster statuser, så vill dei sjåast her.",
   "empty_column.lists": "Du har ikkje nokon liste enno. Når du lagar ein, så vill den ende up her.",
   "empty_column.mutes": "Du har ikkje dempet nokon brukare enno.",
-  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
-  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "empty_column.notifications": "Der er ikkje nokon varsler her enno. Kommuniser med andre for å starte samtalen.",
+  "empty_column.public": "Det er ikkje noko her! Skriv noko offentleg, eller manuelt følje brukare fra andre tenarmaskiner for å fylle det opp",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "error.unexpected_crash.next_steps": "Prøv å laste på nytt. Om det ikkje hjelper så kan du fortsatt bruke mastodon gjennom ein anna nettlesar eller ein applikasjon.",
+  "errors.unexpected_crash.copy_stacktrace": "Kopiér stacktrace til klippebord",
   "errors.unexpected_crash.report_issue": "Rapportér problem",
   "follow_request.authorize": "Autoriser",
   "follow_request.reject": "Reject",
@@ -169,13 +169,13 @@
   "hashtag.column_header.tag_mode.all": "og {additional}",
   "hashtag.column_header.tag_mode.any": "eller {additional}",
   "hashtag.column_header.tag_mode.none": "uten {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.select.no_options_message": "Ingen forslag funnet",
+  "hashtag.column_settings.select.placeholder": "Legg til emneknagger…",
   "hashtag.column_settings.tag_mode.all": "Alle disse",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
-  "home.column_settings.basic": "Basic",
+  "hashtag.column_settings.tag_mode.any": "Kvem som helst av disse",
+  "hashtag.column_settings.tag_mode.none": "Ikkje nokon av disse",
+  "hashtag.column_settings.tag_toggle": "Inkludér ekstra emneknagger til denne kolonnen",
+  "home.column_settings.basic": "Enkel",
   "home.column_settings.show_reblogs": "Vis fremhevingar",
   "home.column_settings.show_replies": "Vis svar",
   "intervals.full.days": "{number, plural, one {# day} other {# days}}",
@@ -183,53 +183,53 @@
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
   "introduction.federation.action": "Neste",
   "introduction.federation.federated.headline": "Federert",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.federated.text": "Offentlege poster fra tenarmaskiner i fediverset kjem fram i den federerte tidslinja.",
   "introduction.federation.home.headline": "Heim",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.home.text": "Poster frå folk du kjenner kjem i heime tidslinja. Du kan følje kvem som helst ifrå alle tenarmaskiner!",
   "introduction.federation.local.headline": "Lokal",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.federation.local.text": "Offentlege poster frå folk på samme tenarmaskin som deg vill du finne i den lokale tidslinja.",
   "introduction.interactions.action": "Fullfør omvisning!",
   "introduction.interactions.favourite.headline": "Lik",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.favourite.text": "Du kan lagre ein tut til seinere, og la forfatteren vite at ut likte den ved å trykke likar på tuten.",
   "introduction.interactions.reblog.headline": "Fremhev",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reblog.text": "Du kan dela folks tutar ved å \"booste\" døm.",
   "introduction.interactions.reply.headline": "Svar",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
+  "introduction.interactions.reply.text": "Du kan svare på andre folk sine tuter, om så vill tutane lenkes i hop i ein samtale.",
+  "introduction.welcome.action": "Ta åt!",
   "introduction.welcome.headline": "Første steg",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
-  "keyboard_shortcuts.back": "to navigate back",
-  "keyboard_shortcuts.blocked": "to open blocked users list",
-  "keyboard_shortcuts.boost": "to boost",
-  "keyboard_shortcuts.column": "to focus a status in one of the columns",
-  "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.description": "Description",
-  "keyboard_shortcuts.direct": "to open direct messages column",
-  "keyboard_shortcuts.down": "to move down in the list",
-  "keyboard_shortcuts.enter": "to open status",
-  "keyboard_shortcuts.favourite": "to favourite",
-  "keyboard_shortcuts.favourites": "to open favourites list",
-  "keyboard_shortcuts.federated": "to open federated timeline",
-  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "to open home timeline",
-  "keyboard_shortcuts.hotkey": "Hotkey",
+  "introduction.welcome.text": "Velkommen til fediverset! Om ein kort tid vill det være mogleg å skrive til verden og venner gjennom ein stor variasjon av tenarmaskiner. Men denne tenarmaskinen, {domain}, er spesiell - den holder din profil, så ikkje gløym namnet dens.",
+  "keyboard_shortcuts.back": "for å navigere tilbake",
+  "keyboard_shortcuts.blocked": "for å åpne lista for blokka brukare",
+  "keyboard_shortcuts.boost": "for å dele",
+  "keyboard_shortcuts.column": "for å fokusere på ein status i ein av kollonene",
+  "keyboard_shortcuts.compose": "for å fokusera på status-skrivaren",
+  "keyboard_shortcuts.description": "Beskrivelse",
+  "keyboard_shortcuts.direct": "forå åpne direkte meldingar i ein kollone",
+  "keyboard_shortcuts.down": "for å bevege seg opp og ned",
+  "keyboard_shortcuts.enter": "for å åpne status",
+  "keyboard_shortcuts.favourite": "for å favorisere",
+  "keyboard_shortcuts.favourites": "for å åpne favoriserings lista",
+  "keyboard_shortcuts.federated": "for å åpne den fødererte tidslinja",
+  "keyboard_shortcuts.heading": "Tastatur hurtigtaster",
+  "keyboard_shortcuts.home": "for åpne heime tidslinja",
+  "keyboard_shortcuts.hotkey": "Hurtigtast",
   "keyboard_shortcuts.legend": "to display this legend",
-  "keyboard_shortcuts.local": "to open local timeline",
-  "keyboard_shortcuts.mention": "to mention author",
-  "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
-  "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.pinned": "to open pinned toots list",
-  "keyboard_shortcuts.profile": "to open author's profile",
-  "keyboard_shortcuts.reply": "to reply",
-  "keyboard_shortcuts.requests": "to open follow requests list",
-  "keyboard_shortcuts.search": "to focus search",
-  "keyboard_shortcuts.start": "to open \"get started\" column",
-  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
-  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.local": "for å åpne den lokale tidslinja",
+  "keyboard_shortcuts.mention": "for å nemne forfatteren",
+  "keyboard_shortcuts.muted": "for å åpne lista over dempa brukare",
+  "keyboard_shortcuts.my_profile": "for å åpne profilen din",
+  "keyboard_shortcuts.notifications": "for å åpne notifikasjons kolonnen",
+  "keyboard_shortcuts.pinned": "forå åpne lista for festa statuser",
+  "keyboard_shortcuts.profile": "for å åpne forfatteren's profil",
+  "keyboard_shortcuts.reply": "for å svare",
+  "keyboard_shortcuts.requests": "for å åpne lista for føljar førespurnader",
+  "keyboard_shortcuts.search": "for å fokus søkje",
+  "keyboard_shortcuts.start": "for å åpne \"kjem i gong\" kolonna",
+  "keyboard_shortcuts.toggle_hidden": "for å vise/gøyme tekst bak innholds varsel",
+  "keyboard_shortcuts.toggle_sensitivity": "for å vise/gøyme media",
   "keyboard_shortcuts.toot": "Start ein heilt ny tut",
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
-  "keyboard_shortcuts.up": "to move up in the list",
+  "keyboard_shortcuts.up": "for å bevege seg oppover i lista",
   "lightbox.close": "Lukk",
   "lightbox.next": "Neste",
   "lightbox.previous": "Forrige",
@@ -248,21 +248,21 @@
   "media_gallery.toggle_visible": "Toggle visibility",
   "missing_indicator.label": "Ikkje funne",
   "missing_indicator.sublabel": "Denne ressursen ble ikkje funne",
-  "mute_modal.hide_notifications": "Hide notifications from this user?",
-  "navigation_bar.apps": "Mobile apps",
-  "navigation_bar.blocks": "Blocked users",
-  "navigation_bar.community_timeline": "Local timeline",
-  "navigation_bar.compose": "Compose new toot",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.discover": "Discover",
-  "navigation_bar.domain_blocks": "Hidden domains",
-  "navigation_bar.edit_profile": "Edit profile",
-  "navigation_bar.favourites": "Favourites",
-  "navigation_bar.filters": "Muted words",
-  "navigation_bar.follow_requests": "Follow requests",
-  "navigation_bar.follows_and_followers": "Follows and followers",
-  "navigation_bar.info": "About this server",
-  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "mute_modal.hide_notifications": "Gøyme notifikasjoner frå denne brukaren?",
+  "navigation_bar.apps": "Mobil apper",
+  "navigation_bar.blocks": "Blokka brukare",
+  "navigation_bar.community_timeline": "Lokal tidslinje",
+  "navigation_bar.compose": "Lag ein ny status",
+  "navigation_bar.direct": "Direkte meldingar",
+  "navigation_bar.discover": "Oppdag",
+  "navigation_bar.domain_blocks": "Gøymte domener",
+  "navigation_bar.edit_profile": "Rediger profil",
+  "navigation_bar.favourites": "Favoritter",
+  "navigation_bar.filters": "Demp ord",
+  "navigation_bar.follow_requests": "Føljar førespurnader",
+  "navigation_bar.follows_and_followers": "Føljer og føljare",
+  "navigation_bar.info": "Om denne tenarmaskinen",
+  "navigation_bar.keyboard_shortcuts": "Hurtigtaster",
   "navigation_bar.lists": "Lister",
   "navigation_bar.logout": "Logg ut",
   "navigation_bar.mutes": "Dempa brukare",
@@ -274,71 +274,71 @@
   "notification.favourite": "{name} likte din status",
   "notification.follow": "{name} fulgte deg",
   "notification.mention": "{name} nevnte deg",
-  "notification.poll": "A poll you have voted in has ended",
-  "notification.reblog": "{name} boosted your status",
+  "notification.poll": "Ein avstemming du har votert i har endt",
+  "notification.reblog": "{name} delte statusen din",
   "notifications.clear": "Klarer notifikasjoner",
-  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
-  "notifications.column_settings.alert": "Desktop notifications",
-  "notifications.column_settings.favourite": "Favourites:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.clear_confirmation": "Er du sikker på at du vill permanent klarere alle notifikasjonene dine?",
+  "notifications.column_settings.alert": "Desktop notifikasjoner",
+  "notifications.column_settings.favourite": "Favoritter:",
+  "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier",
+  "notifications.column_settings.filter_bar.category": "Rask filter bar",
+  "notifications.column_settings.filter_bar.show": "Vis",
   "notifications.column_settings.follow": "Nye føljare:",
-  "notifications.column_settings.mention": "Mentions:",
-  "notifications.column_settings.poll": "Poll results:",
-  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.mention": "Nemningar:",
+  "notifications.column_settings.poll": "Avstemming resultater:",
+  "notifications.column_settings.push": "Push varsler",
   "notifications.column_settings.reblog": "Framhevinger:",
-  "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
-  "notifications.filter.all": "All",
+  "notifications.column_settings.show": "Vis i kolonne",
+  "notifications.column_settings.sound": "Køyr lyd",
+  "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Framhevinger",
   "notifications.filter.favourites": "Favoritter",
   "notifications.filter.follows": "Føljare",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.group": "{count} notifications",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
+  "notifications.filter.mentions": "Nemningar",
+  "notifications.filter.polls": "Avstemmings resultater",
+  "notifications.group": "{count} notifikasjoner",
+  "poll.closed": "Lukka",
+  "poll.refresh": "Forfriske",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
   "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
-  "privacy.change": "Adjust status privacy",
-  "privacy.direct.long": "Post to mentioned users only",
-  "privacy.direct.short": "Direct",
-  "privacy.private.long": "Post to followers only",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Post to public timelines",
-  "privacy.public.short": "Public",
+  "poll.vote": "Voter",
+  "poll.voted": "Du voterte for dette svaret",
+  "poll_button.add_poll": "Start ein avstemming",
+  "poll_button.remove_poll": "Slett avstemming",
+  "privacy.change": "Juster status synligheit",
+  "privacy.direct.long": "Post berre direkte til nemnte brukare",
+  "privacy.direct.short": "Direkte",
+  "privacy.private.long": "Post til berre føljare",
+  "privacy.private.short": "Berre-føljare",
+  "privacy.public.long": "Post til offentlege tidslinjar",
+  "privacy.public.short": "Offentleg",
   "privacy.unlisted.long": "Do not show in public timelines",
-  "privacy.unlisted.short": "Unlisted",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "privacy.unlisted.short": "Uoppført",
+  "refresh": "Forfrisk",
+  "regeneration_indicator.label": "Lastar…",
+  "regeneration_indicator.sublabel": "Din startside driver å blir forberedt!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
+  "relative_time.just_now": "no",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
-  "reply_indicator.cancel": "Cancel",
-  "report.forward": "Forward to {target}",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
-  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
-  "report.placeholder": "Additional comments",
-  "report.submit": "Submit",
-  "report.target": "Report {target}",
-  "search.placeholder": "Search",
-  "search_popout.search_format": "Advanced search format",
+  "reply_indicator.cancel": "Avbrot",
+  "report.forward": "Send videre til {target}",
+  "report.forward_hint": "Denne brukaren er frå ein anna tenarmaskin. Send ein anonymisert versjon av rapporten til døm også?",
+  "report.hint": "Denne rapporten vill bli sendt til din tenarmaskin moderator. Du kan gi ein forklaring til kvifor du rapportérer denne brukaren under:",
+  "report.placeholder": "Tilleggskommentarer",
+  "report.submit": "Send inn",
+  "report.target": "Rapportér {target}",
+  "search.placeholder": "Søk",
+  "search_popout.search_format": "Avansert søke format",
   "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
-  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.hashtag": "emneknagg",
   "search_popout.tips.status": "status",
   "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
-  "search_popout.tips.user": "user",
-  "search_results.accounts": "People",
-  "search_results.hashtags": "Hashtags",
-  "search_results.statuses": "Toots",
+  "search_popout.tips.user": "brukar",
+  "search_results.accounts": "Folk",
+  "search_results.hashtags": "Emneknagger",
+  "search_results.statuses": "Tutar",
   "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "status.admin_account": "Open moderation interface for @{name}",
@@ -347,77 +347,77 @@
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
   "status.copy": "Copy link to status",
-  "status.delete": "Delete",
-  "status.detailed_status": "Detailed conversation view",
-  "status.direct": "Direct message @{name}",
-  "status.embed": "Embed",
-  "status.favourite": "Favourite",
-  "status.filtered": "Filtered",
-  "status.load_more": "Load more",
-  "status.media_hidden": "Media hidden",
-  "status.mention": "Mention @{name}",
-  "status.more": "More",
-  "status.mute": "Mute @{name}",
-  "status.mute_conversation": "Mute conversation",
-  "status.open": "Expand this status",
-  "status.pin": "Pin on profile",
-  "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
-  "status.reblog": "Boost",
-  "status.reblog_private": "Boost to original audience",
-  "status.reblogged_by": "{name} boosted",
-  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
-  "status.redraft": "Delete & re-draft",
-  "status.reply": "Reply",
-  "status.replyAll": "Reply to thread",
-  "status.report": "Report @{name}",
-  "status.sensitive_warning": "Sensitive content",
-  "status.share": "Share",
-  "status.show_less": "Show less",
-  "status.show_less_all": "Show less for all",
-  "status.show_more": "Show more",
-  "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
-  "status.unmute_conversation": "Unmute conversation",
-  "status.unpin": "Unpin from profile",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
-  "tabs_bar.federated_timeline": "Federated",
-  "tabs_bar.home": "Home",
-  "tabs_bar.local_timeline": "Local",
-  "tabs_bar.notifications": "Notifications",
-  "tabs_bar.search": "Search",
+  "status.delete": "Slett",
+  "status.detailed_status": "Detaljert samtale syn",
+  "status.direct": "Direkte meld @{name}",
+  "status.embed": "Bygge inn",
+  "status.favourite": "Lik",
+  "status.filtered": "Filter",
+  "status.load_more": "Last inn meir",
+  "status.media_hidden": "Media gøymt",
+  "status.mention": "Nemn @{name}",
+  "status.more": "Meir",
+  "status.mute": "Demp @{name}",
+  "status.mute_conversation": "Demp samtale",
+  "status.open": "Utvid statusen",
+  "status.pin": "Fest på profil",
+  "status.pinned": "Fasta tut",
+  "status.read_more": "Les meir",
+  "status.reblog": "Fremhev",
+  "status.reblog_private": "Fremhev til orginale sjåare",
+  "status.reblogged_by": "{name} fremheivd",
+  "status.reblogs.empty": "Ikkje nokon har fremhevd tuten enno. Om nokon gjør det kjem det opp her.",
+  "status.redraft": "Slett & gjer om",
+  "status.reply": "Svar",
+  "status.replyAll": "Svar til tråd",
+  "status.report": "Rapportér @{name}",
+  "status.sensitive_warning": "Sensitivt innhald",
+  "status.share": "Del",
+  "status.show_less": "Vis mindre",
+  "status.show_less_all": "Vis mindre for alle",
+  "status.show_more": "Vis meir",
+  "status.show_more_all": "Vis meir for alle",
+  "status.show_thread": "Vis tråd",
+  "status.uncached_media_warning": "Ikkje tilgjengeleg",
+  "status.unmute_conversation": "Ikke demp samtale",
+  "status.unpin": "Angre festing på profil",
+  "suggestions.dismiss": "Avbrot forslag",
+  "suggestions.header": "Du e kanskje interessert i…",
+  "tabs_bar.federated_timeline": "Føderert",
+  "tabs_bar.home": "Heim",
+  "tabs_bar.local_timeline": "Lokal",
+  "tabs_bar.notifications": "Notifikasjoner",
+  "tabs_bar.search": "Søk",
   "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
   "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Moments remaining",
+  "time_remaining.moments": "Kort tid gjennstår",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
-  "trends.trending_now": "Trending now",
-  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
-  "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add media ({formats})",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
-  "upload_form.description": "Describe for the visually impaired",
-  "upload_form.edit": "Edit",
-  "upload_form.undo": "Delete",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
-  "upload_progress.label": "Uploading…",
-  "video.close": "Close video",
-  "video.exit_fullscreen": "Exit full screen",
+  "trends.trending_now": "Kva som trender no",
+  "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.",
+  "upload_area.title": "Dra & slipp for å laste opp",
+  "upload_button.label": "Legg til media ({formats})",
+  "upload_error.limit": "Fil størrelsen er for stor.",
+  "upload_error.poll": "Fil opplasting ikkje lov i hop med avstemming.",
+  "upload_form.description": "Beskriv for synshemmede",
+  "upload_form.edit": "Redigér",
+  "upload_form.undo": "Slett",
+  "upload_modal.analyzing_picture": "Analyserer bilde…",
+  "upload_modal.apply": "Bruk",
+  "upload_modal.description_placeholder": "Ein rask brun rev hoppar over den late hunden",
+  "upload_modal.detect_text": "Finn tekst i bildet",
+  "upload_modal.edit_media": "Redigér media",
+  "upload_modal.hint": "Klikk og dra sirkelen på forsyneren for å fokusere synspunktet slik det ska synes i alle minityrbildene.",
+  "upload_modal.preview_label": "Framsyn ({ratio})",
+  "upload_progress.label": "Lastar opp...",
+  "video.close": "Lukk video",
+  "video.exit_fullscreen": "Lukk fullskjerm",
   "video.expand": "Expand video",
-  "video.fullscreen": "Full screen",
-  "video.hide": "Hide video",
-  "video.mute": "Mute sound",
+  "video.fullscreen": "Fullskjerm",
+  "video.hide": "Gøym video",
+  "video.mute": "Demp lyd",
   "video.pause": "Pause",
-  "video.play": "Play",
-  "video.unmute": "Unmute sound"
+  "video.play": "Spel",
+  "video.unmute": "Av-dempe lyd"
 }
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 37b893938..5c84c08fe 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -1,31 +1,31 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "Legg til eller fjern fra lister",
   "account.badges.bot": "Bot",
   "account.block": "Blokkér @{name}",
   "account.block_domain": "Skjul alt fra {domain}",
-  "account.blocked": "Blocked",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.blocked": "Blokkert",
+  "account.cancel_follow_request": "Avbryt følge forespørsel",
   "account.direct": "Direct Message @{name}",
-  "account.domain_blocked": "Domain hidden",
+  "account.domain_blocked": "Domenet skjult",
   "account.edit_profile": "Rediger profil",
   "account.endorse": "Feature on profile",
   "account.follow": "Følg",
   "account.followers": "Følgere",
-  "account.followers.empty": "No one follows this user yet.",
+  "account.followers.empty": "Ingen følger denne brukeren ennå.",
   "account.follows": "Følger",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows.empty": "Denne brukeren følger ikke noen enda.",
   "account.follows_you": "Følger deg",
   "account.hide_reblogs": "Skjul fremhevinger fra @{name}",
-  "account.last_status": "Last active",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.last_status": "Sist aktiv",
+  "account.link_verified_on": "Eierskap av denne lenken ble sjekket {date}",
+  "account.locked_info": "Denne kontoens personvernstatus er satt til låst. Eieren vurderer manuelt hvem som kan følge dem.",
   "account.media": "Media",
   "account.mention": "Nevn @{name}",
   "account.moved_to": "{name} har flyttet til:",
   "account.mute": "Demp @{name}",
   "account.mute_notifications": "Ignorer varsler fra @{name}",
   "account.muted": "Muted",
-  "account.never_active": "Never",
+  "account.never_active": "Aldri",
   "account.posts": "Innlegg",
   "account.posts_with_replies": "Toots with replies",
   "account.report": "Rapportér @{name}",
@@ -40,20 +40,20 @@
   "account.unmute_notifications": "Vis varsler fra @{name}",
   "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
   "alert.rate_limited.title": "Rate limited",
-  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.message": "En uventet feil oppstod.",
   "alert.unexpected.title": "Oops!",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "autosuggest_hashtag.per_week": "{count} per uke",
   "boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang",
   "bundle_column_error.body": "Noe gikk galt mens denne komponenten lastet.",
   "bundle_column_error.retry": "Prøv igjen",
-  "bundle_column_error.title": "Network error",
+  "bundle_column_error.title": "Nettverksfeil",
   "bundle_modal_error.close": "Lukk",
   "bundle_modal_error.message": "Noe gikk galt da denne komponenten lastet.",
   "bundle_modal_error.retry": "Prøv igjen",
   "column.blocks": "Blokkerte brukere",
   "column.community": "Lokal tidslinje",
-  "column.direct": "Direct messages",
-  "column.directory": "Browse profiles",
+  "column.direct": "Direktemeldinger",
+  "column.directory": "Bla gjennom profiler",
   "column.domain_blocks": "Hidden domains",
   "column.favourites": "Likt",
   "column.follow_requests": "Følgeforespørsler",
@@ -73,18 +73,18 @@
   "column_subheading.settings": "Innstillinger",
   "community.column_settings.media_only": "Media only",
   "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.direct_message_warning_learn_more": "Lær mer",
   "compose_form.hashtag_warning": "Denne tuten blir ikke listet under noen emneknagger da den er ulistet. Kun offentlige tuter kan søktes etter med emneknagg.",
   "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Hvem som helst kan følge deg og se dine private poster.",
   "compose_form.lock_disclaimer.lock": "låst",
   "compose_form.placeholder": "Hva har du på hjertet?",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.add_option": "Legg til et valg",
+  "compose_form.poll.duration": "Avstemningens varighet",
+  "compose_form.poll.option_placeholder": "Valg {number}",
+  "compose_form.poll.remove_option": "Fjern dette valget",
   "compose_form.publish": "Tut",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Mark media as sensitive",
+  "compose_form.sensitive.hide": "Merk media som sensitivt",
   "compose_form.sensitive.marked": "Media is marked as sensitive",
   "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
@@ -96,25 +96,25 @@
   "confirmations.block.message": "Er du sikker på at du vil blokkere {name}?",
   "confirmations.delete.confirm": "Slett",
   "confirmations.delete.message": "Er du sikker på at du vil slette denne statusen?",
-  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.confirm": "Slett",
   "confirmations.delete_list.message": "Er du sikker på at du vil slette denne listen permanent?",
   "confirmations.domain_block.confirm": "Skjul alt fra domenet",
   "confirmations.domain_block.message": "Er du sikker på at du vil skjule hele domenet {domain}? I de fleste tilfeller er det bedre med målrettet blokkering eller demping.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.logout.confirm": "Logg ut",
+  "confirmations.logout.message": "Er du sikker på at du vil logge ut?",
   "confirmations.mute.confirm": "Demp",
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
   "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?",
   "confirmations.redraft.confirm": "Delete & redraft",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
-  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.confirm": "Svar",
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Slutt å følge",
   "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
+  "conversation.with": "Med {names}",
   "directory.federated": "From known fediverse",
   "directory.local": "From {domain} only",
   "directory.new_arrivals": "New arrivals",
@@ -193,7 +193,7 @@
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
   "introduction.interactions.reblog.headline": "Boost",
   "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.headline": "Svar",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
   "introduction.welcome.action": "Let's go!",
   "introduction.welcome.headline": "First steps",
@@ -203,7 +203,7 @@
   "keyboard_shortcuts.boost": "å fremheve",
   "keyboard_shortcuts.column": "å fokusere en status i en av kolonnene",
   "keyboard_shortcuts.compose": "å fokusere komponeringsfeltet",
-  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.description": "Beskrivelse",
   "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "for å flytte ned i listen",
   "keyboard_shortcuts.enter": "to open status",
@@ -270,7 +270,7 @@
   "navigation_bar.pins": "Festa tuter",
   "navigation_bar.preferences": "Preferanser",
   "navigation_bar.public_timeline": "Felles tidslinje",
-  "navigation_bar.security": "Security",
+  "navigation_bar.security": "Sikkerhet",
   "notification.favourite": "{name} likte din status",
   "notification.follow": "{name} fulgte deg",
   "notification.mention": "{name} nevnte deg",
@@ -290,15 +290,15 @@
   "notifications.column_settings.reblog": "Fremhevet:",
   "notifications.column_settings.show": "Vis i kolonne",
   "notifications.column_settings.sound": "Spill lyd",
-  "notifications.filter.all": "All",
+  "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.favourites": "Favoritter",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
+  "poll.refresh": "Oppdater",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
   "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
   "poll.vote": "Vote",
@@ -362,7 +362,7 @@
   "status.open": "Utvid denne statusen",
   "status.pin": "Fest på profilen",
   "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
+  "status.read_more": "Les mer",
   "status.reblog": "Fremhev",
   "status.reblog_private": "Boost to original audience",
   "status.reblogged_by": "Fremhevd av {name}",
@@ -378,7 +378,7 @@
   "status.show_more": "Vis mer",
   "status.show_more_all": "Show more for all",
   "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "Ikke tilgjengelig",
   "status.unmute_conversation": "Ikke demp samtale",
   "status.unpin": "Angre festing på profilen",
   "suggestions.dismiss": "Dismiss suggestion",
@@ -387,7 +387,7 @@
   "tabs_bar.home": "Hjem",
   "tabs_bar.local_timeline": "Lokal",
   "tabs_bar.notifications": "Varslinger",
-  "tabs_bar.search": "Search",
+  "tabs_bar.search": "Søk",
   "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
   "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
@@ -404,7 +404,7 @@
   "upload_form.edit": "Edit",
   "upload_form.undo": "Angre",
   "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
+  "upload_modal.apply": "Bruk",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
@@ -414,7 +414,7 @@
   "video.close": "Lukk video",
   "video.exit_fullscreen": "Lukk fullskjerm",
   "video.expand": "Utvid video",
-  "video.fullscreen": "Full screen",
+  "video.fullscreen": "Fullskjerm",
   "video.hide": "Skjul video",
   "video.mute": "Skru av lyd",
   "video.pause": "Pause",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index b52d58970..1ca5f42ed 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Desconnexion",
   "confirmations.logout.message": "Volètz vertadièrament vos desconnectar ?",
   "confirmations.mute.confirm": "Rescondre",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Aquò lor escondrà las publicacions e mencions, mas aquò lor permetrà encara de veire vòstra publicacions e de vos sègre.",
   "confirmations.mute.message": "Volètz vertadièrament rescondre {name} ?",
   "confirmations.redraft.confirm": "Escafar & tornar formular",
   "confirmations.redraft.message": "Volètz vertadièrament escafar aqueste estatut e lo reformular ? Totes sos partiments e favorits seràn perduts, e sas responsas seràn orfanèlas.",
@@ -152,9 +152,9 @@
   "empty_column.mutes": "Encara avètz pas mes en silenci degun.",
   "empty_column.notifications": "Avètz pas encara de notificacions. Respondètz a qualqu’un per començar una conversacion.",
   "empty_column.public": "I a pas res aquí ! Escrivètz quicòm de public, o seguètz de personas d’autres servidors per garnir lo flux public",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "error.unexpected_crash.explanation": "A causa d’una avaria dins nòstre còdi o d’un problèma de compatibilitat de navegador, aquesta pagina se pòt pas afichar corrèctament.",
+  "error.unexpected_crash.next_steps": "Ensajatz d’actualizar la pagina. S’aquò càmbia pas res, podètz provar d’utilizar Mastodon via un navegador diferent o d’una aplicacion nativa estant.",
+  "errors.unexpected_crash.copy_stacktrace": "Copiar las traças al quichapapièrs",
   "errors.unexpected_crash.report_issue": "Senhalar un problèma",
   "follow_request.authorize": "Acceptar",
   "follow_request.reject": "Regetar",
@@ -302,7 +302,7 @@
   "poll.total_people": "{count, plural, one {# persona} other {# personas}}",
   "poll.total_votes": "{count, plural, one {# vòte} other {# vòtes}}",
   "poll.vote": "Votar",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Avètz votat per aquesta responsa",
   "poll_button.add_poll": "Ajustar un sondatge",
   "poll_button.remove_poll": "Levar lo sondatge",
   "privacy.change": "Ajustar la confidencialitat del messatge",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 29b448cb6..b3513ea46 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -39,7 +39,7 @@
   "account.unmute": "Cofnij wyciszenie @{name}",
   "account.unmute_notifications": "Cofnij wyciszenie powiadomień od @{name}",
   "alert.rate_limited.message": "Spróbuj ponownie po {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.title": "Ograniczony czasowo",
   "alert.unexpected.message": "Wystąpił nieoczekiwany błąd.",
   "alert.unexpected.title": "O nie!",
   "autosuggest_hashtag.per_week": "{count} co tydzień",
@@ -307,7 +307,7 @@
   "poll.total_people": "{count, plural, one {# osoba} few {# osoby} many {# osób} other {# osób}}",
   "poll.total_votes": "{count, plural, one {# głos} few {# głosy} many {# głosów} other {# głosów}}",
   "poll.vote": "Zagłosuj",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Zagłosowałeś_aś na tą odpowiedź",
   "poll_button.add_poll": "Dodaj głosowanie",
   "poll_button.remove_poll": "Usuń głosowanie",
   "privacy.change": "Dostosuj widoczność wpisów",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 859dc1991..bb8a94516 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -4,7 +4,7 @@
   "account.block": "Bloquear @{name}",
   "account.block_domain": "Esconder tudo do domínio {domain}",
   "account.blocked": "Bloqueado",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.cancel_follow_request": "Cancelar pedido de seguidor",
   "account.direct": "Mensagem directa @{name}",
   "account.domain_blocked": "Domínio escondido",
   "account.edit_profile": "Editar perfil",
@@ -16,7 +16,7 @@
   "account.follows.empty": "Este utilizador ainda não segue alguém.",
   "account.follows_you": "É teu seguidor",
   "account.hide_reblogs": "Esconder partilhas de @{name}",
-  "account.last_status": "Last active",
+  "account.last_status": "Última actividade",
   "account.link_verified_on": "A posse deste link foi verificada em {date}",
   "account.locked_info": "O estatuto de privacidade desta conta é fechado. O dono revê manualmente que a pode seguir.",
   "account.media": "Média",
@@ -25,7 +25,7 @@
   "account.mute": "Silenciar @{name}",
   "account.mute_notifications": "Silenciar notificações de @{name}",
   "account.muted": "Silenciada",
-  "account.never_active": "Never",
+  "account.never_active": "Nunca",
   "account.posts": "Publicações",
   "account.posts_with_replies": "Publicações e respostas",
   "account.report": "Denunciar @{name}",
@@ -38,11 +38,11 @@
   "account.unfollow": "Deixar de seguir",
   "account.unmute": "Não silenciar @{name}",
   "account.unmute_notifications": "Deixar de silenciar @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Volte a tentar depois das {retry_time, time, medium}.",
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Ocorreu um erro inesperado.",
   "alert.unexpected.title": "Bolas!",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "autosuggest_hashtag.per_week": "{count} por semana",
   "boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
   "bundle_column_error.body": "Algo de errado aconteceu enquanto este componente era carregado.",
   "bundle_column_error.retry": "Tente de novo",
@@ -53,7 +53,7 @@
   "column.blocks": "Utilizadores Bloqueados",
   "column.community": "Cronologia local",
   "column.direct": "Mensagens directas",
-  "column.directory": "Browse profiles",
+  "column.directory": "Procurar perfis",
   "column.domain_blocks": "Domínios escondidos",
   "column.favourites": "Favoritos",
   "column.follow_requests": "Seguidores pendentes",
@@ -100,10 +100,10 @@
   "confirmations.delete_list.message": "Tens a certeza de que desejas eliminar permanentemente esta lista?",
   "confirmations.domain_block.confirm": "Esconder tudo deste domínio",
   "confirmations.domain_block.message": "De certeza que queres bloquear completamente o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é suficiente e é o recomendado. Não irás ver conteúdo daquele domínio em cronologia alguma nem nas tuas notificações. Os teus seguidores daquele domínio serão removidos.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.logout.confirm": "Terminar sessão",
+  "confirmations.logout.message": "Deseja terminar a sessão?",
   "confirmations.mute.confirm": "Silenciar",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Isto irá esconder publicações deles ou publicações que os mencionem, mas irá permitir que vejam as suas publicações e sejam seus seguidores.",
   "confirmations.mute.message": "De certeza que queres silenciar {name}?",
   "confirmations.redraft.confirm": "Apagar & redigir",
   "confirmations.redraft.message": "Tens a certeza que queres apagar e redigir esta publicação?  Os favoritos e as partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.",
@@ -111,14 +111,14 @@
   "confirmations.reply.message": "Responder agora irá reescrever a mensagem que estás a compor actualmente. Tens a certeza que queres continuar?",
   "confirmations.unfollow.confirm": "Deixar de seguir",
   "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "conversation.delete": "Eliminar conversa",
+  "conversation.mark_as_read": "Marcar como lida",
+  "conversation.open": "Ver conversa",
+  "conversation.with": "Com {names}",
+  "directory.federated": "Do fediverso conhecido",
+  "directory.local": "Apenas de {domain}",
+  "directory.new_arrivals": "Recém chegados",
+  "directory.recently_active": "Com actividade recente",
   "embed.instructions": "Publica esta publicação no teu site copiando o código abaixo.",
   "embed.preview": "Podes ver aqui como irá ficar:",
   "emoji_button.activity": "Actividade",
@@ -152,10 +152,10 @@
   "empty_column.mutes": "Ainda não silenciaste qualquer utilizador.",
   "empty_column.notifications": "Não tens notificações. Interage com outros utilizadores para iniciar uma conversa.",
   "empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para veres aqui os conteúdos públicos",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a uma compatilidade com o seu navegador, esta página não pôde ser apresentada correctamente.",
+  "error.unexpected_crash.next_steps": "Tente atualizar a página. Se isso não ajudar, pode usar o Mastodon através de um navegador diferente ou uma aplicação nativa.",
+  "errors.unexpected_crash.copy_stacktrace": "Copiar a stacktrace para o clipboard",
+  "errors.unexpected_crash.report_issue": "Reportar problema",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rejeitar",
   "getting_started.developers": "Responsáveis pelo desenvolvimento",
@@ -243,7 +243,7 @@
   "lists.new.title_placeholder": "Título da nova lista",
   "lists.search": "Pesquisa entre as pessoas que segues",
   "lists.subheading": "As tuas listas",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural, one {# novo item} other {# novos itens}}",
   "loading_indicator.label": "A carregar...",
   "media_gallery.toggle_visible": "Mostrar/ocultar",
   "missing_indicator.label": "Não encontrado",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} notificações",
   "poll.closed": "Fechado",
   "poll.refresh": "Recarregar",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# pessoa} other {# pessoas}}",
   "poll.total_votes": "{contar, plural, um {# vote} outro {# votes}}",
   "poll.vote": "Votar",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Você votou nesta resposta",
   "poll_button.add_poll": "Adicionar votação",
   "poll_button.remove_poll": "Remover votação",
   "privacy.change": "Ajustar a privacidade da mensagem",
@@ -314,7 +314,7 @@
   "privacy.public.short": "Público",
   "privacy.unlisted.long": "Não publicar nos feeds públicos",
   "privacy.unlisted.short": "Não listar",
-  "refresh": "Refresh",
+  "refresh": "Actualizar",
   "regeneration_indicator.label": "A carregar…",
   "regeneration_indicator.sublabel": "A tua home está a ser preparada!",
   "relative_time.days": "{number}d",
@@ -339,7 +339,7 @@
   "search_results.accounts": "Pessoas",
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.statuses_fts_disabled": "A pesquisa de toots pelo seu conteúdo não está disponível neste servidor Mastodon.",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "status.admin_account": "Abrir a interface de moderação para @{name}",
   "status.admin_status": "Abrir esta publicação na interface de moderação",
@@ -378,7 +378,7 @@
   "status.show_more": "Mostrar mais",
   "status.show_more_all": "Mostrar mais para todas",
   "status.show_thread": "Mostrar conversa",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "Não diponível",
   "status.unmute_conversation": "Deixar de silenciar esta conversa",
   "status.unpin": "Não fixar no perfil",
   "suggestions.dismiss": "Dispensar a sugestão",
@@ -394,22 +394,22 @@
   "time_remaining.moments": "Momentos restantes",
   "time_remaining.seconds": "{número, plural, um {# second} outro {# seconds}} faltam",
   "trends.count_by_accounts": "{count} {rawCount, plural, uma {person} outra {people}} a falar",
-  "trends.trending_now": "Trending now",
+  "trends.trending_now": "Tendencias actuais",
   "ui.beforeunload": "O teu rascunho será perdido se abandonares o Mastodon.",
   "upload_area.title": "Arraste e solte para enviar",
   "upload_button.label": "Adicionar media",
   "upload_error.limit": "Limite máximo do ficheiro a carregar excedido.",
   "upload_error.poll": "Carregamento de ficheiros não é permitido em votações.",
   "upload_form.description": "Descrição da imagem para pessoas com dificuldades visuais",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "Editar",
   "upload_form.undo": "Apagar",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.analyzing_picture": "A analizar imagem…",
+  "upload_modal.apply": "Aplicar",
+  "upload_modal.description_placeholder": "Grave e cabisbaixo, o filho justo zelava pela querida mãe doente",
+  "upload_modal.detect_text": "Detectar texto na imagem",
+  "upload_modal.edit_media": "Editar média",
+  "upload_modal.hint": "Clique ou arraste o círculo na pré-visualização para escolher o ponto focal que será sempre visível em todas as miniaturas.",
+  "upload_modal.preview_label": "Pré-visualizar ({ratio})",
   "upload_progress.label": "A enviar...",
   "video.close": "Fechar vídeo",
   "video.exit_fullscreen": "Sair de full screen",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 4ace1649a..c8767e535 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -11,9 +11,9 @@
   "account.endorse": "Рекомендовать в профиле",
   "account.follow": "Подписаться",
   "account.followers": "Подписаны",
-  "account.followers.empty": "Никто не подписан на этого пользователя.",
+  "account.followers.empty": "На этого пользователя пока никто не подписан.",
   "account.follows": "Подписки",
-  "account.follows.empty": "Этот пользователь ни на кого не подписан.",
+  "account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
   "account.follows_you": "Подписан(а) на вас",
   "account.hide_reblogs": "Скрыть реблоги от @{name}",
   "account.last_status": "Последняя активность",
@@ -22,9 +22,9 @@
   "account.media": "Медиа",
   "account.mention": "Упомянуть",
   "account.moved_to": "Ищите {name} здесь:",
-  "account.mute": "Скрыть @{name}",
+  "account.mute": "Заглушить",
   "account.mute_notifications": "Скрыть уведомления от @{name}",
-  "account.muted": "Скрыт",
+  "account.muted": "Приглушён",
   "account.never_active": "Никогда",
   "account.posts": "Посты",
   "account.posts_with_replies": "Посты с ответами",
@@ -32,11 +32,11 @@
   "account.requested": "Ожидает подтверждения. Нажмите для отмены",
   "account.share": "Поделиться профилем @{name}",
   "account.show_reblogs": "Показывать продвижения от @{name}",
-  "account.unblock": "Разблокировать",
+  "account.unblock": "Разблокировать @{name}",
   "account.unblock_domain": "Разблокировать {domain}",
   "account.unendorse": "Не рекомендовать в профиле",
   "account.unfollow": "Отписаться",
-  "account.unmute": "Снять глушение",
+  "account.unmute": "Не скрывать @{name}",
   "account.unmute_notifications": "Показывать уведомления от @{name}",
   "alert.rate_limited.message": "Пожалуйста, повторите через {retry_time, time, medium}.",
   "alert.rate_limited.title": "Скорость ограничена",
@@ -75,11 +75,11 @@
   "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": "Добавить",
-  "compose_form.poll.duration": "Длительность опроса",
+  "compose_form.poll.add_option": "Добавить вариант",
+  "compose_form.poll.duration": "Продолжительность опроса",
   "compose_form.poll.option_placeholder": "Вариант {number}",
   "compose_form.poll.remove_option": "Удалить этот вариант",
   "compose_form.publish": "Запостить",
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Выйти",
   "confirmations.logout.message": "Вы уверены, что хотите выйти?",
   "confirmations.mute.confirm": "Заглушить",
-  "confirmations.mute.explanation": "Будут скрыты их посты и те, где они упоминаются, но они при этом смогут видеть ваши посты и подписываться на вас.",
+  "confirmations.mute.explanation": "Это скроет посты этого пользователя и те, в которых он упоминается, но при этом он по-прежнему сможет подписаться на вас и смотреть ваши посты.",
   "confirmations.mute.message": "Вы уверены, что хотите заглушить {name}?",
   "confirmations.redraft.confirm": "Удалить и исправить",
   "confirmations.redraft.message": "Вы уверены, что хотите удалить этот статус и превратить в черновик? Вы потеряете все ответы, продвижения и отметки 'нравится' к нему.",
@@ -119,10 +119,10 @@
   "directory.local": "Только из {domain}",
   "directory.new_arrivals": "Новички",
   "directory.recently_active": "Недавно активные",
-  "embed.instructions": "Встройте этот статус на Вашем сайте, скопировав код внизу.",
+  "embed.instructions": "Встройте этот пост на свой сайт, скопировав следующий код:",
   "embed.preview": "Так это будет выглядеть:",
   "emoji_button.activity": "Занятия",
-  "emoji_button.custom": "Собственные",
+  "emoji_button.custom": "Особенные",
   "emoji_button.flags": "Флаги",
   "emoji_button.food": "Еда и напитки",
   "emoji_button.label": "Вставить эмодзи",
@@ -134,7 +134,7 @@
   "emoji_button.search": "Найти...",
   "emoji_button.search_results": "Результаты поиска",
   "emoji_button.symbols": "Символы",
-  "emoji_button.travel": "Путешествия",
+  "emoji_button.travel": "Путешествия и места",
   "empty_column.account_timeline": "Здесь нет постов!",
   "empty_column.account_unavailable": "Профиль недоступен",
   "empty_column.blocks": "Вы ещё никого не заблокировали.",
@@ -144,14 +144,14 @@
   "empty_column.favourited_statuses": "Вы не добавили ни один пост в «Избранное». Как только вы это сделаете, он появится здесь.",
   "empty_column.favourites": "Никто ещё не добавил этот пост в «Избранное». Как только кто-то это сделает, это отобразится здесь.",
   "empty_column.follow_requests": "Вам ещё не приходили запросы на подписку. Все новые запросы будут показаны здесь.",
-  "empty_column.hashtag": "Статусов с таким хэштегом еще не существует.",
+  "empty_column.hashtag": "С этим хэштегом пока ещё ничего не постили.",
   "empty_column.home": "Пока вы ни на кого не подписаны. Полистайте {public} или используйте поиск, чтобы освоиться и завести новые знакомства.",
   "empty_column.home.public_timeline": "публичные ленты",
   "empty_column.list": "В этом списке пока ничего нет.",
   "empty_column.lists": "У вас ещё нет списков. Созданные вами списки будут показаны здесь.",
   "empty_column.mutes": "Вы ещё никого не скрывали.",
   "empty_column.notifications": "У вас пока нет уведомлений. Взаимодействуйте с другими, чтобы завести разговор.",
-  "empty_column.public": "Здесь ничего нет! Опубликуйте что-нибудь или подпишитесь на пользователей с других узлов, чтобы заполнить ленту.",
+  "empty_column.public": "Здесь ничего нет! Опубликуйте что-нибудь или подпишитесь на пользователей с других узлов, чтобы заполнить ленту",
   "error.unexpected_crash.explanation": "Из-за несовместимого браузера или ошибки в нашем коде, эта страница не может быть корректно отображена.",
   "error.unexpected_crash.next_steps": "Попробуйте обновить страницу. Если проблема не исчезает, используйте Mastodon из-под другого браузера или приложения.",
   "errors.unexpected_crash.copy_stacktrace": "Копировать стектрейс в буфер обмена",
@@ -174,7 +174,7 @@
   "hashtag.column_settings.tag_mode.all": "Все из списка",
   "hashtag.column_settings.tag_mode.any": "Любой из списка",
   "hashtag.column_settings.tag_mode.none": "Ни один из списка",
-  "hashtag.column_settings.tag_toggle": "Включая дополнительные хэштеге из этой колонки",
+  "hashtag.column_settings.tag_toggle": "Включить дополнительные теги для этой колонки",
   "home.column_settings.basic": "Основные",
   "home.column_settings.show_reblogs": "Показывать продвижения",
   "home.column_settings.show_replies": "Показывать ответы",
@@ -185,19 +185,19 @@
   "introduction.federation.federated.headline": "Глобальная лента",
   "introduction.federation.federated.text": "Публичные статусы с других серверов федеративной сети расположатся в глобальной ленте.",
   "introduction.federation.home.headline": "Домашняя лента",
-  "introduction.federation.home.text": "Статусы от тех, на кого вы подписаны, появятся в вашей домашней ленте. Вы можете подписаться на кого угодно с любого сервера!",
+  "introduction.federation.home.text": "Посты людей, на которых вы подписаны, будут отображаться в домашней ленте. Подписываться можно на кого угодно, независимо от узла.",
   "introduction.federation.local.headline": "Локальная лента",
   "introduction.federation.local.text": "Публичные статусы от людей с того же сервера, что и вы, будут отображены в локальной ленте.",
   "introduction.interactions.action": "Завершить обучение",
   "introduction.interactions.favourite.headline": "Отметки «нравится»",
   "introduction.interactions.favourite.text": "Вы можете отметить статус, чтобы вернуться к нему позже и дать знать автору, что запись вам понравилась, поставив отметку \"нравится\".",
   "introduction.interactions.reblog.headline": "Продвижения",
-  "introduction.interactions.reblog.text": "Вы можете делиться статусами других людей, продвигая их в своём аккаунте.",
+  "introduction.interactions.reblog.text": "Вы можете делиться статусами других людей, продвигая их в своей учётной записи.",
   "introduction.interactions.reply.headline": "Ответы",
   "introduction.interactions.reply.text": "Вы можете отвечать свои и чужие посты, образуя цепочки сообщений (обсуждения).",
   "introduction.welcome.action": "Поехали!",
   "introduction.welcome.headline": "Первые шаги",
-  "introduction.welcome.text": "Добро пожаловать в федеративную сеть! Уже через мгновение вы сможете отправлять сообщения и общаться со своими друзьями на любом сервере. Но этот сервер — {domain} — особенный: на нём располагается ваш профиль. Запомните его название.",
+  "introduction.welcome.text": "Добро пожаловать в Федиверс! Уже через мгновение вы сможете отправлять сообщения и общаться со своими друзьями с любых узлов. Но этот узел — {domain} — особенный: на нём располагается ваш профиль, так что не забудьте его название.",
   "keyboard_shortcuts.back": "перейти назад",
   "keyboard_shortcuts.blocked": "чтобы открыть список заблокированных",
   "keyboard_shortcuts.boost": "продвинуть пост",
@@ -241,7 +241,7 @@
   "lists.edit.submit": "Изменить название",
   "lists.new.create": "Новый список",
   "lists.new.title_placeholder": "Заголовок списка",
-  "lists.search": "Искать из ваших подписок",
+  "lists.search": "Искать среди подписок",
   "lists.subheading": "Ваши списки",
   "load_pending": "{count, plural, one {# новый элемент} few {# новых элемента} other {# новых элементов}}",
   "loading_indicator.label": "Загрузка...",
@@ -271,11 +271,11 @@
   "navigation_bar.preferences": "Настройки",
   "navigation_bar.public_timeline": "Глобальная лента",
   "navigation_bar.security": "Безопасность",
-  "notification.favourite": "{name} понравился Ваш статус",
+  "notification.favourite": "{name} добавил(а) ваш статус в избранное",
   "notification.follow": "{name} подписался (-лась) на вас",
   "notification.mention": "{name} упомянул(а) вас",
   "notification.poll": "Опрос, в котором вы приняли участие, завершился",
-  "notification.reblog": "{name} продвинул(а) Ваш статус",
+  "notification.reblog": "{name} продвинул(а) ваш статус",
   "notifications.clear": "Очистить уведомления",
   "notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
   "notifications.column_settings.alert": "Десктопные уведомления",
@@ -316,7 +316,7 @@
   "privacy.unlisted.short": "Скрытый",
   "refresh": "Обновить",
   "regeneration_indicator.label": "Загрузка…",
-  "regeneration_indicator.sublabel": "Ваша домашняя лента готовится!",
+  "regeneration_indicator.sublabel": "Один момент, мы подготавливаем вашу ленту!",
   "relative_time.days": "{number}д",
   "relative_time.hours": "{number}ч",
   "relative_time.just_now": "только что",
@@ -324,14 +324,14 @@
   "relative_time.seconds": "{number}с",
   "reply_indicator.cancel": "Отмена",
   "report.forward": "Переслать в {target}",
-  "report.forward_hint": "Этот аккаунт расположен на другом сервере. Отправить туда анонимную копию Вашей жалобы?",
-  "report.hint": "Жалоба будет отправлена модераторам Вашего сервера. Вы также можете указать подробную причину жалобы ниже:",
+  "report.forward_hint": "Этот аккаунт расположен на другом узле. Отправить туда анонимную копию вашей жалобы?",
+  "report.hint": "Жалоба будет отправлена модераторам вашего узла. Вы также можете указать подробную причину жалобы ниже:",
   "report.placeholder": "Комментарий",
   "report.submit": "Отправить",
   "report.target": "Жалоба на {target}",
   "search.placeholder": "Поиск",
   "search_popout.search_format": "Продвинутый формат поиска",
-  "search_popout.tips.full_text": "Возвращает посты, которые Вы написали, отметили как 'избранное', продвинули или в которых были упомянуты, а также содержащие юзернейм, имя и хэштеги.",
+  "search_popout.tips.full_text": "Поиск по простому тексту отобразит посты, которые вы написали, добавили в избранное, продвинули или в которых были упомянуты, а также подходящие имена пользователей и хэштеги.",
   "search_popout.tips.hashtag": "хэштег",
   "search_popout.tips.status": "статус",
   "search_popout.tips.text": "Простой ввод текста покажет совпадающие имена пользователей, отображаемые имена и хэштеги",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 5d2726309..0766e703f 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -5,7 +5,7 @@
   "account.block_domain": "Ukry všetko z {domain}",
   "account.blocked": "Blokovaný/á",
   "account.cancel_follow_request": "Zruš požiadanie o sledovanie",
-  "account.direct": "Súkromná správa pre @{name}",
+  "account.direct": "Priama správa pre @{name}",
   "account.domain_blocked": "Doména ukrytá",
   "account.edit_profile": "Uprav profil",
   "account.endorse": "Zobrazuj na profile",
@@ -52,7 +52,7 @@
   "bundle_modal_error.retry": "Skúsiť znova",
   "column.blocks": "Blokovaní užívatelia",
   "column.community": "Miestna časová os",
-  "column.direct": "Súkromné správy",
+  "column.direct": "Priame správy",
   "column.directory": "Prehľadávaj profily",
   "column.domain_blocks": "Skryté domény",
   "column.favourites": "Obľúbené",
@@ -69,11 +69,11 @@
   "column_header.moveRight_settings": "Presuň stĺpec doprava",
   "column_header.pin": "Pripni",
   "column_header.show_settings": "Ukáž nastavenia",
-  "column_header.unpin": "Odopnúť",
+  "column_header.unpin": "Odopni",
   "column_subheading.settings": "Nastavenia",
   "community.column_settings.media_only": "Iba médiá",
-  "compose_form.direct_message_warning": "Tento príspevok bude videný výhradne iba spomenutými užívateľmi. Ber ale na vedomie že správci tvojej a všetkých iných zahrnutých instancií majú možnosť skontrolovať túto správu.",
-  "compose_form.direct_message_warning_learn_more": "Zistiť viac",
+  "compose_form.direct_message_warning": "Tento príspevok bude boslaný iba spomenutým užívateľom.",
+  "compose_form.direct_message_warning_learn_more": "Zisti viac",
   "compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.",
   "compose_form.lock_disclaimer": "Tvoj účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.",
   "compose_form.lock_disclaimer.lock": "zamknutý",
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Odhlás sa",
   "confirmations.logout.message": "Si si istý/á, že sa chceš odhlásiť?",
   "confirmations.mute.confirm": "Ignoruj",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Toto nastavenie pred tebou skryje ich príspevky, alebo príspevky od iných v ktorých sú spomenutí, ale umožní im vidieť tvoje príspevky, aj ťa následovať.",
   "confirmations.mute.message": "Naozaj chceš ignorovať {name}?",
   "confirmations.redraft.confirm": "Vyčisti a prepíš",
   "confirmations.redraft.message": "Si si istý/á, že chceš premazať a prepísať tento príspevok? Jeho nadobudnuté vyzdvihnutia a obľúbenia, ale i odpovede na pôvodný príspevok budú odlúčené.",
@@ -139,7 +139,7 @@
   "empty_column.account_unavailable": "Profil nedostupný",
   "empty_column.blocks": "Ešte si nikoho nezablokoval/a.",
   "empty_column.community": "Lokálna časová os je prázdna. Napíšte niečo, aby sa to tu začalo hýbať!",
-  "empty_column.direct": "Ešte nemáš žiadne súkromné správy. Keď nejakú pošleš, alebo dostaneš, ukáže sa tu.",
+  "empty_column.direct": "Ešte nemáš žiadne priame správy. Keď nejakú pošleš, alebo dostaneš, ukáže sa tu.",
   "empty_column.domain_blocks": "Žiadne domény ešte niesú skryté.",
   "empty_column.favourited_statuses": "Nemáš obľúbené ešte žiadne príspevky. Keď si nejaký obľúbiš, bude zobrazený práve tu.",
   "empty_column.favourites": "Tento toot si ešte nikto neobľúbil. Ten kto si ho obľúbi, bude zobrazený tu.",
@@ -152,8 +152,8 @@
   "empty_column.mutes": "Ešte si nestĺmil žiadných užívateľov.",
   "empty_column.notifications": "Ešte nemáš žiadne oznámenia. Začni komunikovať s ostatnými, aby diskusia mohla začať.",
   "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne, alebo začni sledovať užívateľov z iných serverov, aby tu niečo pribudlo",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.explanation": "Kvôli chybe v našom kóde, alebo problému s kompatibilitou prehliadača, túto stránku nebolo možné zobraziť správne.",
+  "error.unexpected_crash.next_steps": "Skús obnoviť stránku. Ak to nepomôže, pravdepodobne budeš stále môcť používať Mastodon cez iný prehliadač, alebo natívnu aplikáciu.",
   "errors.unexpected_crash.copy_stacktrace": "Skopíruj stacktrace do schránky",
   "errors.unexpected_crash.report_issue": "Nahlás problém",
   "follow_request.authorize": "Povoľ prístup",
@@ -204,7 +204,7 @@
   "keyboard_shortcuts.column": "zameraj sa na príspevok v jednom zo stĺpcov",
   "keyboard_shortcuts.compose": "zameraj sa na písaciu plochu",
   "keyboard_shortcuts.description": "Popis",
-  "keyboard_shortcuts.direct": "otvor panel súkromných správ",
+  "keyboard_shortcuts.direct": "pre otvorenie panelu priamých správ",
   "keyboard_shortcuts.down": "posunúť sa dole v zozname",
   "keyboard_shortcuts.enter": "otvoriť správu",
   "keyboard_shortcuts.favourite": "pridaj do obľúbených",
@@ -253,14 +253,14 @@
   "navigation_bar.blocks": "Blokovaní užívatelia",
   "navigation_bar.community_timeline": "Miestna časová os",
   "navigation_bar.compose": "Napíš nový príspevok",
-  "navigation_bar.direct": "Súkromné správy",
+  "navigation_bar.direct": "Priame správy",
   "navigation_bar.discover": "Objavuj",
   "navigation_bar.domain_blocks": "Skryté domény",
   "navigation_bar.edit_profile": "Uprav profil",
   "navigation_bar.favourites": "Obľúbené",
   "navigation_bar.filters": "Filtrované slová",
   "navigation_bar.follow_requests": "Žiadosti o sledovanie",
-  "navigation_bar.follows_and_followers": "Následovaní a sledovatelia",
+  "navigation_bar.follows_and_followers": "Sledovania a následovatelia",
   "navigation_bar.info": "O tomto serveri",
   "navigation_bar.keyboard_shortcuts": "Klávesové skratky",
   "navigation_bar.lists": "Zoznamy",
@@ -349,7 +349,7 @@
   "status.copy": "Skopíruj odkaz na príspevok",
   "status.delete": "Zmazať",
   "status.detailed_status": "Podrobný náhľad celej konverzácie",
-  "status.direct": "Súkromná správa @{name}",
+  "status.direct": "Priama správa pre @{name}",
   "status.embed": "Vložiť",
   "status.favourite": "Páči sa mi",
   "status.filtered": "Filtrované",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 65e275102..ecac0d9c7 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -365,7 +365,7 @@
   "status.read_more": "Preberi več",
   "status.reblog": "Spodbudi",
   "status.reblog_private": "Spodbudi izvirnemu občinstvu",
-  "status.reblogged_by": "{name} spodbujen",
+  "status.reblogged_by": "{name} spodbuja",
   "status.reblogs.empty": "Nihče še ni spodbudil tega tuta. Ko se bo to zgodilo, se bodo pojavili tukaj.",
   "status.redraft": "Izbriši in preoblikuj",
   "status.reply": "Odgovori",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index e8c1c40c2..9b12f337b 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -1,24 +1,24 @@
 {
-  "account.add_or_remove_from_list": "Lägg till eller ta bort från listor",
+  "account.add_or_remove_from_list": "Lägg till i eller ta bort från listor",
   "account.badges.bot": "Robot",
   "account.block": "Blockera @{name}",
   "account.block_domain": "Dölj allt från {domain}",
   "account.blocked": "Blockerad",
-  "account.cancel_follow_request": "Avbryt förfrågan att följa",
+  "account.cancel_follow_request": "Avbryt följarförfrågan",
   "account.direct": "Skicka ett direktmeddelande till @{name}",
   "account.domain_blocked": "Domän dold",
   "account.edit_profile": "Redigera profil",
-  "account.endorse": "Visa upp på profil",
+  "account.endorse": "Visa på profil",
   "account.follow": "Följ",
   "account.followers": "Följare",
-  "account.followers.empty": "Ingen följer denna användaren än.",
+  "account.followers.empty": "Ingen följer denna användare än.",
   "account.follows": "Följer",
-  "account.follows.empty": "Den här användaren följer inte någon ännu.",
+  "account.follows.empty": "Denna användare följer inte någon än.",
   "account.follows_you": "Följer dig",
   "account.hide_reblogs": "Dölj knuffar från @{name}",
   "account.last_status": "Senast aktiv",
-  "account.link_verified_on": "Ägarskapet för det här kontot kontrollerades den {date}",
-  "account.locked_info": "Detta konto har en låst integritetsstatus. Ägaren väljer manuellt vem som kan följa.",
+  "account.link_verified_on": "Ägarskap för detta konto kontrollerades den {date}",
+  "account.locked_info": "Detta konto har låst integritetsstatus. Ägaren väljer manuellt vem som kan följa.",
   "account.media": "Media",
   "account.mention": "Nämna @{name}",
   "account.moved_to": "{name} har flyttat till:",
@@ -26,25 +26,25 @@
   "account.mute_notifications": "Stäng av notifieringar från @{name}",
   "account.muted": "Tystad",
   "account.never_active": "Aldrig",
-  "account.posts": "Inlägg",
-  "account.posts_with_replies": "Toots och svar",
+  "account.posts": "Tutningar",
+  "account.posts_with_replies": "Tutningar och svar",
   "account.report": "Rapportera @{name}",
-  "account.requested": "Inväntar godkännande. Klicka för att avbryta följförfrågan",
+  "account.requested": "Inväntar godkännande. Klicka för att avbryta följarförfrågan",
   "account.share": "Dela @{name}s profil",
   "account.show_reblogs": "Visa knuffar från @{name}",
   "account.unblock": "Avblockera @{name}",
   "account.unblock_domain": "Sluta dölja {domain}",
-  "account.unendorse": "Visa inte upp på profil",
-  "account.unfollow": "Sluta följa",
+  "account.unendorse": "Visa inte på profil",
+  "account.unfollow": "Sluta följ",
   "account.unmute": "Sluta tysta @{name}",
-  "account.unmute_notifications": "Återaktivera notifikationer från @{name}",
+  "account.unmute_notifications": "Återaktivera notifieringar från @{name}",
   "alert.rate_limited.message": "Vänligen försök igen efter {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Begränsad mängd",
+  "alert.rate_limited.title": "Mängd begränsad",
   "alert.unexpected.message": "Ett oväntat fel uppstod.",
   "alert.unexpected.title": "Hoppsan!",
   "autosuggest_hashtag.per_week": "{count} per vecka",
-  "boost_modal.combo": "Du kan trycka {combo} för att slippa denna nästa gång",
-  "bundle_column_error.body": "Något gick fel när du laddade denna komponent.",
+  "boost_modal.combo": "Du kan trycka {combo} för att slippa detta nästa gång",
+  "bundle_column_error.body": "Något gick fel medan denna komponent laddades.",
   "bundle_column_error.retry": "Försök igen",
   "bundle_column_error.title": "Nätverksfel",
   "bundle_modal_error.close": "Stäng",
@@ -56,70 +56,70 @@
   "column.directory": "Bläddra bland profiler",
   "column.domain_blocks": "Dolda domäner",
   "column.favourites": "Favoriter",
-  "column.follow_requests": "Följförfrågningar",
+  "column.follow_requests": "Följarförfrågningar",
   "column.home": "Hem",
   "column.lists": "Listor",
   "column.mutes": "Tystade användare",
-  "column.notifications": "Meddelanden",
+  "column.notifications": "Aviseringar",
   "column.pins": "Nålade toots",
   "column.public": "Förenad tidslinje",
   "column_back_button.label": "Tillbaka",
   "column_header.hide_settings": "Dölj inställningar",
-  "column_header.moveLeft_settings": "Flytta kolumnen till vänster",
-  "column_header.moveRight_settings": "Flytta kolumnen till höger",
+  "column_header.moveLeft_settings": "Flytta kolumnen åt vänster",
+  "column_header.moveRight_settings": "Flytta kolumnen åt höger",
   "column_header.pin": "Fäst",
   "column_header.show_settings": "Visa inställningar",
   "column_header.unpin": "Ångra fäst",
   "column_subheading.settings": "Inställningar",
-  "community.column_settings.media_only": "Enbart media",
-  "compose_form.direct_message_warning": "Denna toot kommer endast att skickas till nämnda användare.",
-  "compose_form.direct_message_warning_learn_more": "Visa mer",
-  "compose_form.hashtag_warning": "Denna toot kommer inte att listas under någon hashtag eftersom den är onoterad. Endast offentliga toots kan sökas med hashtag.",
-  "compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vem som helst kan följa dig och även se dina inlägg som bara är för följare.",
+  "community.column_settings.media_only": "Endast media",
+  "compose_form.direct_message_warning": "Denna tutning kommer endast skickas till de nämnda användarna.",
+  "compose_form.direct_message_warning_learn_more": "Lär dig mer",
+  "compose_form.hashtag_warning": "Denna toot kommer inte att visas under någon hashtag eftersom den är onoterad. Endast offentliga toots kan sökas med hashtag.",
+  "compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vem som helst kan följa dig för att se dina inlägg som endast är för följare.",
   "compose_form.lock_disclaimer.lock": "låst",
   "compose_form.placeholder": "Vad funderar du på?",
-  "compose_form.poll.add_option": "Nytt alternativ",
+  "compose_form.poll.add_option": "Lägg till ett val",
   "compose_form.poll.duration": "Varaktighet för omröstning",
-  "compose_form.poll.option_placeholder": "Alternativ {number}",
-  "compose_form.poll.remove_option": "Ta bort alternativ",
+  "compose_form.poll.option_placeholder": "Val {number}",
+  "compose_form.poll.remove_option": "Ta bort detta val",
   "compose_form.publish": "Tut",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Markera media som känsligt",
   "compose_form.sensitive.marked": "Media har markerats som känsligt",
-  "compose_form.sensitive.unmarked": "Media har inte markerats som känsligt",
-  "compose_form.spoiler.marked": "Texten har dolts bakom en varning",
+  "compose_form.sensitive.unmarked": "Media är inte markerat som känsligt",
+  "compose_form.spoiler.marked": "Texten är dold bakom en varning",
   "compose_form.spoiler.unmarked": "Texten är inte dold",
   "compose_form.spoiler_placeholder": "Skriv din varning här",
   "confirmation_modal.cancel": "Ångra",
   "confirmations.block.block_and_report": "Blockera & rapportera",
   "confirmations.block.confirm": "Blockera",
-  "confirmations.block.message": "Är du säker att du vill blockera {name}?",
+  "confirmations.block.message": "Är du säker på att du vill blockera {name}?",
   "confirmations.delete.confirm": "Ta bort",
-  "confirmations.delete.message": "Är du säker att du vill ta bort denna status?",
+  "confirmations.delete.message": "Är du säker på att du vill ta bort denna status?",
   "confirmations.delete_list.confirm": "Ta bort",
   "confirmations.delete_list.message": "Är du säker på att du vill radera denna lista permanent?",
   "confirmations.domain_block.confirm": "Dölj hela domänen",
-  "confirmations.domain_block.message": "Är du verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer sluta se innehåll från {domain}-domänen i den allmänna tidslinjen och i dina egna notifieringar. Du kommer även sluta följa alla eventuella följare du har från {domain}.",
+  "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer inte se innehåll från den domänen i den allmänna tidslinjen eller i dina notifieringar. Dina följare från den domänen komer att tas bort.",
   "confirmations.logout.confirm": "Logga ut",
   "confirmations.logout.message": "Är du säker på att du vill logga ut?",
   "confirmations.mute.confirm": "Tysta",
-  "confirmations.mute.explanation": "Detta kommer dölja postningar från dem och postningar som nämner dem, men fortfarande tillåta dem att se dina postningar och följa dig.",
-  "confirmations.mute.message": "Är du säker du vill tysta ner {name}?",
-  "confirmations.redraft.confirm": "Radera och gör om",
-  "confirmations.redraft.message": "Är du säker på att du vill radera meddelandet och göra om det? Du kommer förlora alla svar, knuffar och favoriter som hänvisar till meddelandet.",
+  "confirmations.mute.explanation": "Detta kommer att dölja poster från dem och poster som nämner dem, men fortfarande tillåta dem att se dina poster och följa dig.",
+  "confirmations.mute.message": "Är du säker på att du vill tysta {name}?",
+  "confirmations.redraft.confirm": "Radera & gör om",
+  "confirmations.redraft.message": "Är du säker på att du vill radera detta meddelande och göra om det? Du kommer förlora alla favoriter, knuffar och svar till det ursprungliga meddelandet.",
   "confirmations.reply.confirm": "Svara",
-  "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skriva. Är du säker på att du vill fortsätta?",
-  "confirmations.unfollow.confirm": "Sluta följa",
-  "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?",
+  "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skapa. Är du säker på att du vill fortsätta?",
+  "confirmations.unfollow.confirm": "Avfölj",
+  "confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?",
   "conversation.delete": "Radera konversation",
   "conversation.mark_as_read": "Markera som läst",
   "conversation.open": "Se konversation",
   "conversation.with": "Med {names}",
-  "directory.federated": "Från känt fediverse",
+  "directory.federated": "Från känt servernätverk",
   "directory.local": "Endast från {domain}",
   "directory.new_arrivals": "Nyanlända",
   "directory.recently_active": "Nyligen aktiva",
-  "embed.instructions": "Bädda in den här statusen på din webbplats genom att kopiera koden nedan.",
+  "embed.instructions": "Lägg in denna status på din webbplats genom att kopiera koden nedan.",
   "embed.preview": "Så här kommer det att se ut:",
   "emoji_button.activity": "Aktivitet",
   "emoji_button.custom": "Anpassad",
@@ -136,14 +136,14 @@
   "emoji_button.symbols": "Symboler",
   "emoji_button.travel": "Resor & platser",
   "empty_column.account_timeline": "Inga inlägg här!",
-  "empty_column.account_unavailable": "Profilen är inte tillgänglig",
-  "empty_column.blocks": "Du har ännu inte blockerat några användare.",
+  "empty_column.account_unavailable": "Profilen ej tillgänglig",
+  "empty_column.blocks": "Du har ännu ej blockerat några användare.",
   "empty_column.community": "Den lokala tidslinjen är tom. Skriv något offentligt för att sätta bollen i rullning!",
-  "empty_column.direct": "Du har inga direktmeddelanden än. När du skickar eller tar emot ett kommer det att dyka upp här.",
+  "empty_column.direct": "Du har inga direktmeddelanden än. När du skickar eller tar emot ett kommer det att visas här.",
   "empty_column.domain_blocks": "Det finns ännu inga dolda domäner.",
-  "empty_column.favourited_statuses": "Du har inga favoritmarkerade toots än. När du favoritmarkerar en kommer den synas här.",
-  "empty_column.favourites": "Ingen har favoritmarkerat den här tooten än. När någon gör det kommer de synas här.",
-  "empty_column.follow_requests": "Du har inga följförfrågningar än. När du får en kommer den synas här.",
+  "empty_column.favourited_statuses": "Du har inga favoritmarkerade toots än. När du favoritmarkerar en kommer den visas här.",
+  "empty_column.favourites": "Ingen har favoritmarkerat den här tooten än. När någon gör det kommer den visas här.",
+  "empty_column.follow_requests": "Du har inga följarförfrågningar än. När du får en kommer den visas här.",
   "empty_column.hashtag": "Det finns inget i denna hashtag ännu.",
   "empty_column.home": "Din hemma-tidslinje är tom! Besök {public} eller använd sökning för att komma igång och träffa andra användare.",
   "empty_column.home.public_timeline": "den publika tidslinjen",
@@ -366,7 +366,7 @@
   "status.reblog": "Knuffa",
   "status.reblog_private": "Knuffa till de ursprungliga åhörarna",
   "status.reblogged_by": "{name} knuffade",
-  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.reblogs.empty": "Ingen har favoriserat den här tutningen än. När någon gör det kommer den att synas här.",
   "status.redraft": "Radera & gör om",
   "status.reply": "Svara",
   "status.replyAll": "Svara på tråden",
@@ -381,8 +381,8 @@
   "status.uncached_media_warning": "Ej tillgängligt",
   "status.unmute_conversation": "Öppna konversation",
   "status.unpin": "Ångra fäst i profil",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "Avfärda förslag",
+  "suggestions.header": "Du kanske är intresserad av…",
   "tabs_bar.federated_timeline": "Förenad",
   "tabs_bar.home": "Hem",
   "tabs_bar.local_timeline": "Lokal",
@@ -391,25 +391,25 @@
   "time_remaining.days": "{number, plural, one {# dag} other {# dagar}} kvar",
   "time_remaining.hours": "{hours, plural, one {# timme} other {# timmar}} kvar",
   "time_remaining.minutes": "{minutes, plural, one {1 minut} other {# minuter}} kvar",
-  "time_remaining.moments": "Moments remaining",
+  "time_remaining.moments": "Återstående tillfällen",
   "time_remaining.seconds": "{hours, plural, one {# sekund} other {# sekunder}} kvar",
   "trends.count_by_accounts": "{count} {rawCount, plural, en {person} andra {people}} pratar",
-  "trends.trending_now": "Trending now",
+  "trends.trending_now": "Trendar nu",
   "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.",
   "upload_area.title": "Dra & släpp för att ladda upp",
   "upload_button.label": "Lägg till media",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.limit": "Filöverföringsgränsen överskriden.",
+  "upload_error.poll": "Filuppladdning tillåts inte med omröstningar.",
   "upload_form.description": "Beskriv för synskadade",
   "upload_form.edit": "Redigera",
   "upload_form.undo": "Ta bort",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.analyzing_picture": "Analyserar bild…",
   "upload_modal.apply": "Verkställ",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.description_placeholder": "En snabb brun räv hoppar över den lata hunden",
+  "upload_modal.detect_text": "Upptäck bildens text",
+  "upload_modal.edit_media": "Redigera meida",
+  "upload_modal.hint": "Klicka eller dra cirkeln på förhandstitten för att välja den fokusering som alltid kommer synas på alla miniatyrer.",
+  "upload_modal.preview_label": "Förhandstitt ({ratio})",
   "upload_progress.label": "Laddar upp...",
   "video.close": "Stäng video",
   "video.exit_fullscreen": "Stäng helskärm",
@@ -417,7 +417,7 @@
   "video.fullscreen": "Helskärm",
   "video.hide": "Dölj video",
   "video.mute": "Stäng av ljud",
-  "video.pause": "Pause",
+  "video.pause": "Pausa",
   "video.play": "Spela upp",
   "video.unmute": "Spela upp ljud"
 }
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 82b5fff9e..9be141523 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -1,36 +1,36 @@
 {
   "account.add_or_remove_from_list": "பட்டியல்களில் இருந்து சேர் அல்லது நீக்குக",
   "account.badges.bot": "பாட்",
-  "account.block": "Block @{name}",
-  "account.block_domain": "எல்லாவற்றையும் மறைக்க {domain}",
-  "account.blocked": "தடைமுட்டுகள்",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.block": "@{name} -ஐத் தடு",
+  "account.block_domain": "{domain} யில் இருந்து வரும் எல்லாவற்றையும் மறை",
+  "account.blocked": "முடக்கப்பட்டது",
+  "account.cancel_follow_request": "பின்தொடரும் முடிவைக் கைவிடவும்",
   "account.direct": "நேரடி செய்தி @{name}",
-  "account.domain_blocked": "டொமைன் மறைக்கப்பட்டது",
-  "account.edit_profile": "சுயவிவரத்தைத் திருத்தவும்",
-  "account.endorse": "சுயவிவரத்தில் அம்சம்",
-  "account.follow": "பின்பற்று",
+  "account.domain_blocked": "மறைக்கப்பட்டத் தளங்கள்",
+  "account.edit_profile": "சுயவிவரத்தை மாற்று",
+  "account.endorse": "சுயவிவரத்தில் வெளிப்படுத்து",
+  "account.follow": "பின்தொடர்",
   "account.followers": "பின்பற்றுபவர்கள்",
   "account.followers.empty": "இதுவரை யாரும் இந்த பயனரைப் பின்தொடரவில்லை.",
-  "account.follows": "பின்பற்று",
+  "account.follows": "பின்தொடர்",
   "account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.",
-  "account.follows_you": "நீ பின் தொடர்கிறாய்",
+  "account.follows_you": "உங்களைப் பின்தொடர்கிறார்",
   "account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}",
-  "account.last_status": "Last active",
+  "account.last_status": "கடைசி செயல்பாடு",
   "account.link_verified_on": "இந்த இணைப்பை உரிமையாளர் சரிபார்க்கப்பட்டது {date}",
-  "account.locked_info": "இந்தக் கணக்கு தனியுரிமை நிலை பூட்டப்பட்டுள்ளது. அவர்களைப் பின்தொடர்பவர் யார் என்பதை உரிமையாளர் கைமுறையாக மதிப்பாய்வு செய்கிறார்.",
-  "account.media": "Media",
+  "account.locked_info": "இந்த கணக்கின் தனியுரிமை நிலை பூட்டப்படவுள்ளது. உரிமையாளர் தன்னை யார் பின்தொடரலாம் என்பதை தானே முடிவு செய்வார்.",
+  "account.media": "ஊடகங்கள்",
   "account.mention": "குறிப்பிடு @{name}",
   "account.moved_to": "{name} நகர்த்தப்பட்டது:",
   "account.mute": "ஊமையான @{name}",
   "account.mute_notifications": "அறிவிப்புகளை முடக்கு @{name}",
   "account.muted": "முடக்கியது",
-  "account.never_active": "Never",
-  "account.posts": "Toots",
+  "account.never_active": "எப்போதுமில்லை",
+  "account.posts": "டூட்டுகள்",
   "account.posts_with_replies": "Toots மற்றும் பதில்கள்",
-  "account.report": "Report @{name}",
+  "account.report": "@{name} -ஐப் புகாரளி",
   "account.requested": "ஒப்புதலுக்காக காத்திருக்கிறது. கோரிக்கையை ரத்துசெய்ய கிளிக் செய்க",
-  "account.share": "பங்கிடு @{name}'s மனித முகத்தின்",
+  "account.share": "@{name} உடைய விவரத்தை பகிர்",
   "account.show_reblogs": "காட்டு boosts இருந்து @{name}",
   "account.unblock": "விடுவி @{name}",
   "account.unblock_domain": "காண்பி {domain}",
@@ -38,32 +38,32 @@
   "account.unfollow": "பின்தொடராட்",
   "account.unmute": "தடுப்புநீக்கு @{name}",
   "account.unmute_notifications": "அறிவிப்புகளை அகற்றவும் @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
-  "alert.unexpected.message": "எதிர் பாராத பிழை ஏற்பட்டு விட்டது.",
+  "alert.rate_limited.message": "{retry_time, time, medium} மணிக்குப் பிறகு மீண்டும் முயற்சிக்கவும்.",
+  "alert.rate_limited.title": "விகித அளவுக்கு உட்படுத்தப்பட்டது",
+  "alert.unexpected.message": "எதிர்பாராத பிழை ஏற்பட்டுவிட்டது.",
   "alert.unexpected.title": "அச்சச்சோ!",
-  "autosuggest_hashtag.per_week": "{count} per week",
-  "boost_modal.combo": "நீங்கள் அழுத்தவும் {combo} அடுத்த முறை தவிர்க்கவும்",
-  "bundle_column_error.body": "இந்த கூறுகளை ஏற்றும்போது ஏதோ தவறு ஏற்பட்டது.",
+  "autosuggest_hashtag.per_week": "வாரத்திற்கு {count}",
+  "boost_modal.combo": "நீங்கள் இதை அடுத்தமுறை தவிர்க்க {combo} வை அழுத்தவும்",
+  "bundle_column_error.body": "இந்த பகுதி கூறை ஏற்றம் செய்யும் பொது ஏதோ தவறு ஏற்பட்டுள்ளது.",
   "bundle_column_error.retry": "மீண்டும் முயற்சி செய்",
-  "bundle_column_error.title": "Network error",
+  "bundle_column_error.title": "பிணையப் பிழை",
   "bundle_modal_error.close": "நெருக்கமாக",
   "bundle_modal_error.message": "இந்த கூறுகளை ஏற்றும்போது ஏதோ தவறு ஏற்பட்டது.",
   "bundle_modal_error.retry": "மீண்டும் முயற்சி செய்",
   "column.blocks": "தடுக்கப்பட்ட பயனர்கள்",
   "column.community": "உள்ளூர் காலக்கெடு",
   "column.direct": "நேரடி செய்திகள்",
-  "column.directory": "Browse profiles",
+  "column.directory": "சுயவிவரங்களை உலாவு",
   "column.domain_blocks": "மறைந்த களங்கள்",
   "column.favourites": "விருப்பத்துக்குகந்த",
   "column.follow_requests": "கோரிக்கைகளை பின்பற்றவும்",
-  "column.home": "Home",
+  "column.home": "முதற்பக்கம்",
   "column.lists": "குதிரை வீர்ர்கள்",
   "column.mutes": "முடக்கப்பட்ட பயனர்கள்",
-  "column.notifications": "Notifications",
+  "column.notifications": "அறிவிப்புகள்",
   "column.pins": "Pinned toot",
   "column.public": "கூட்டாட்சி காலக்கெடு",
-  "column_back_button.label": "ஆதரி",
+  "column_back_button.label": "முந்தைய பக்கம்",
   "column_header.hide_settings": "அமைப்புகளை மறை",
   "column_header.moveLeft_settings": "நெடுவரிசையை இடதுபுறமாக நகர்த்தவும்",
   "column_header.moveRight_settings": "நெடுவரிசை வலது புறமாக நகர்த்து",
@@ -82,28 +82,28 @@
   "compose_form.poll.duration": "வாக்கெடுப்பு காலம்",
   "compose_form.poll.option_placeholder": "தேர்ந்தெடுப்ப {number}",
   "compose_form.poll.remove_option": "இந்த விருப்பத்தை அகற்றவும்",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "டூட் செய்க",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Mark media as sensitive",
+  "compose_form.sensitive.hide": "அனைவருக்கும் ஏற்ற ஊடகம் இல்லை எனக் குறியிடுக",
   "compose_form.sensitive.marked": "ஊடகம் உணர்திறன் என குறிக்கப்பட்டுள்ளது",
   "compose_form.sensitive.unmarked": "ஊடகம் உணர்திறன் என குறிக்கப்படவில்லை",
   "compose_form.spoiler.marked": "எச்சரிக்கை பின்னால் உரை மறைக்கப்பட்டுள்ளது",
   "compose_form.spoiler.unmarked": "உரை மறைக்கப்படவில்லை",
   "compose_form.spoiler_placeholder": "இங்கே உங்கள் எச்சரிக்கையை எழுதுங்கள்",
   "confirmation_modal.cancel": "எதிராணை",
-  "confirmations.block.block_and_report": "Block & Report",
-  "confirmations.block.confirm": "Block",
+  "confirmations.block.block_and_report": "தடுத்துப் புகாரளி",
+  "confirmations.block.confirm": "தடு",
   "confirmations.block.message": "நீங்கள் நிச்சயமாக தடைசெய்ய விரும்புகிறீர்களா {name}?",
-  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.confirm": "அழி",
   "confirmations.delete.message": "இந்த நிலையை நிச்சயமாக நீக்க விரும்புகிறீர்களா?",
-  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.confirm": "அழி",
   "confirmations.delete_list.message": "இந்த பட்டியலில் நிரந்தரமாக நீக்க விரும்புகிறீர்களா?",
   "confirmations.domain_block.confirm": "முழு டொமைனை மறை",
   "confirmations.domain_block.message": "நீங்கள் உண்மையில், நிச்சயமாக நீங்கள் முழு தடுக்க வேண்டும் நிச்சயமாக {domain}? பெரும்பாலான சந்தர்ப்பங்களில் ஒரு சில இலக்குகள் அல்லது மியூட்கள் போதுமானவை மற்றும் சிறந்தவை. எந்த பொது நேரத்திலும் அல்லது உங்கள் அறிவிப்புகளிலும் அந்தக் களத்திலிருந்து உள்ளடக்கத்தை நீங்கள் பார்க்க மாட்டீர்கள். அந்த களத்தில் இருந்து உங்கள் ஆதரவாளர்கள் அகற்றப்படுவார்கள்.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.logout.confirm": "வெளியேறு",
+  "confirmations.logout.message": "கண்டிப்பாக வெளியேறத்தான் வேண்டுமா?",
   "confirmations.mute.confirm": "ஊமையான",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "இது அவர்களின் பதிவுகளையும், அவர்களைக் குறிப்பிடும் பதிவுகளையும் மறைத்துவிடும். ஆனால் அவர்கள் உங்கள் பதிவுகளைப் பார்க்கவும், உங்களைப் பின் தொடரவும் அனுமதிக்கப்படுவார்கள்.",
   "confirmations.mute.message": "நிச்சயமாக நீங்கள் முடக்க விரும்புகிறீர்களா {name}?",
   "confirmations.redraft.confirm": "நீக்கு & redraft",
   "confirmations.redraft.message": "நிச்சயமாக இந்த நிலையை நீக்கி, அதை மறுபடியும் உருவாக்க வேண்டுமா? பிடித்தவை மற்றும் ஊக்கங்கள் இழக்கப்படும், மற்றும் அசல் இடுகையில் பதில்கள் அனாதையான இருக்கும்.",
@@ -111,29 +111,29 @@
   "confirmations.reply.message": "இப்போது பதில், தற்போது நீங்கள் உருவாக்கும் செய்தி மேலெழுதப்படும். நீங்கள் தொடர விரும்புகிறீர்களா?",
   "confirmations.unfollow.confirm": "பின்தொடராட்",
   "confirmations.unfollow.message": "நிச்சயமாக நீங்கள் பின்தொடர விரும்புகிறீர்களா {name}?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "conversation.delete": "உரையாடலை அழிக்கவும்",
+  "conversation.mark_as_read": "படிக்கபட்டதாகக் குறி",
+  "conversation.open": "உரையாடலைக் காண்க",
+  "conversation.with": "{names} உடன்",
+  "directory.federated": "தெரிந்த ஃபெடிவெர்சிலிருந்து",
+  "directory.local": "{domain} இல் இருந்து மட்டும்",
+  "directory.new_arrivals": "புதிய வரவு",
+  "directory.recently_active": "தற்பொழுது இயாக்கதிலிருப்பவர்கள்",
   "embed.instructions": "கீழே உள்ள குறியீட்டை நகலெடுப்பதன் மூலம் உங்கள் இணையதளத்தில் இந்த நிலையை உட்பொதிக்கவும்.",
   "embed.preview": "இது போன்ற தோற்றத்தை இங்கு காணலாம்:",
   "emoji_button.activity": "நடவடிக்கை",
   "emoji_button.custom": "வழக்கம்",
   "emoji_button.flags": "கொடி",
   "emoji_button.food": "உணவு மற்றும் பானம்",
-  "emoji_button.label": "Insert emoji",
+  "emoji_button.label": "குறுப்படங்களை உள்ளிடு",
   "emoji_button.nature": "இயற்கை",
   "emoji_button.not_found": "எமோஜோஸ் இல்லை! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "மறுப்ப கூறு",
-  "emoji_button.people": "People",
+  "emoji_button.people": "மக்கள்",
   "emoji_button.recent": "அடிக்கடி பயன்படுத்தப்படும்",
   "emoji_button.search": "தேடல்...",
   "emoji_button.search_results": "தேடல் முடிவுகள்",
-  "emoji_button.symbols": "Symbols",
+  "emoji_button.symbols": "குறியீடுகள்",
   "emoji_button.travel": "சுற்றுலா மற்றும் இடங்கள்",
   "empty_column.account_timeline": "இல்லை toots இங்கே!",
   "empty_column.account_unavailable": "சுயவிவரம் கிடைக்கவில்லை",
@@ -152,15 +152,15 @@
   "empty_column.mutes": "நீங்கள் இதுவரை எந்த பயனர்களையும் முடக்கியிருக்கவில்லை.",
   "empty_column.notifications": "உங்களிடம் எந்த அறிவிப்புகளும் இல்லை. உரையாடலைத் தொடங்க பிறருடன் தொடர்புகொள்ளவும்.",
   "empty_column.public": "இங்கே எதுவும் இல்லை! பகிரங்கமாக ஒன்றை எழுதவும் அல்லது மற்ற நிகழ்வுகளிலிருந்து பயனர்களை அதை நிரப்புவதற்கு கைமுறையாக பின்பற்றவும்",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "மென்பொருள் பழுதுனாலோ அல்லது உங்கள் இணை உலாவியின் பொருந்தாதன்மையினாலோ இந்தப் பக்கத்தை சரியாகக் காண்பிக்க முடியவில்லை.",
+  "error.unexpected_crash.next_steps": "பக்கத்தை புதுப்பித்துப் பார்க்கவும். வேலை செய்யவில்லையெனில், வேறு ஒரு உலாவியில் இருந்தோ அல்லது உங்கள் கருவிக்கு பொருத்தமான வேறு செயலியில் இருந்தோ மச்டோடனைப் பயன்படுத்தவும்.",
+  "errors.unexpected_crash.copy_stacktrace": "பழுசெய்தியை பிடிப்புப் பலகைக்கு நகல் எடு",
+  "errors.unexpected_crash.report_issue": "புகாரளி",
   "follow_request.authorize": "அதிகாரமளி",
   "follow_request.reject": "விலக்கு",
   "getting_started.developers": "உருவாக்குநர்கள்",
   "getting_started.directory": "சுயவிவர அடைவு",
-  "getting_started.documentation": "Documentation",
+  "getting_started.documentation": "ஆவணங்கள்",
   "getting_started.heading": "தொடங்குதல்",
   "getting_started.invite": "நபர்களை அழைக்கவும்",
   "getting_started.open_source_notice": "Mastodon திறந்த மூல மென்பொருள். GitHub இல் நீங்கள் பங்களிக்கவோ அல்லது புகார் அளிக்கவோ முடியும் {github}.",
@@ -182,11 +182,11 @@
   "intervals.full.hours": "{number, plural, one {# hour} மற்ற {# hours}}",
   "intervals.full.minutes": "{number, plural, one {# minute} மற்ற {# minutes}}",
   "introduction.federation.action": "அடுத்த",
-  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.headline": "கூட்டமைந்த",
   "introduction.federation.federated.text": "கூட்டமைப்பின் பிற சேவையகங்களிலிருந்து பொது பதிவுகள் கூட்டப்பட்ட காலக்கெடுவில் தோன்றும்.",
-  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.headline": "முகப்பு",
   "introduction.federation.home.text": "நீங்கள் பின்பற்றும் நபர்களின் இடுகைகள் உங்கள் வீட்டு ஊட்டத்தில் தோன்றும். நீங்கள் எந்த சர்வரில் யாரையும் பின்பற்ற முடியும்!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "அருகாமை",
   "introduction.federation.local.text": "உள்ளூர் சேவையகத்தில் தோன்றும் அதே சர்வரில் உள்ளவர்களின் பொது இடுகைகள்.",
   "introduction.interactions.action": "பயிற்சி முடிக்க!",
   "introduction.interactions.favourite.headline": "விருப்பத்துக்குகந்த",
@@ -198,15 +198,15 @@
   "introduction.welcome.action": "போகலாம்!",
   "introduction.welcome.headline": "முதல் படிகள்",
   "introduction.welcome.text": "கூட்டாளிக்கு வருக! ஒரு சில நிமிடங்களில், பலவிதமான சேவையகங்களில் செய்திகளை உரையாட மற்றும் உங்கள் நண்பர்களிடம் பேச முடியும். ஆனால் இந்த சர்வர், {domain}, சிறப்பு - இது உங்கள் சுயவிவரத்தை வழங்குகிறது, எனவே அதன் பெயரை நினைவில் கொள்ளுங்கள்.",
-  "keyboard_shortcuts.back": "மீண்டும் செல்லவும்",
+  "keyboard_shortcuts.back": "பின் செல்வதற்கு",
   "keyboard_shortcuts.blocked": "தடுக்கப்பட்ட பயனர்களின் பட்டியலைத் திறக்க",
   "keyboard_shortcuts.boost": "அதிகரிக்கும்",
   "keyboard_shortcuts.column": "நெடுவரிசைகளில் ஒன்றில் நிலைக்கு கவனம் செலுத்த வேண்டும்",
   "keyboard_shortcuts.compose": "தொகு உரைப்பகுதியை கவனத்தில் கொள்ளவும்",
-  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.description": "விவரம்",
   "keyboard_shortcuts.direct": "நேரடி செய்திகள் பத்தி திறக்க",
   "keyboard_shortcuts.down": "பட்டியலில் கீழே நகர்த்த",
-  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.enter": "பதிவைத்திறக்க",
   "keyboard_shortcuts.favourite": "பிடித்தது",
   "keyboard_shortcuts.favourites": "பிடித்தவை பட்டியலை திறக்க",
   "keyboard_shortcuts.federated": "ஒருங்கிணைந்த நேரத்தை திறக்க",
@@ -226,24 +226,24 @@
   "keyboard_shortcuts.search": "தேடல் கவனம் செலுத்த",
   "keyboard_shortcuts.start": "'தொடங்குவதற்கு' நெடுவரிசை திறக்க",
   "keyboard_shortcuts.toggle_hidden": "CW க்கு பின்னால் உரையை மறைக்க / மறைக்க",
-  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toggle_sensitivity": "படிமங்களைக் காட்ட/மறைக்க",
   "keyboard_shortcuts.toot": "தொடங்க ஒரு புதிய toot",
   "keyboard_shortcuts.unfocus": "உரை பகுதியை / தேடலை கவனம் செலுத்த வேண்டும்",
   "keyboard_shortcuts.up": "பட்டியலில் மேலே செல்ல",
   "lightbox.close": "நெருக்கமாக",
   "lightbox.next": "அடுத்த",
   "lightbox.previous": "சென்ற",
-  "lightbox.view_context": "View context",
+  "lightbox.view_context": "சூழலைக் பார்",
   "lists.account.add": "பட்டியலில் சேர்",
   "lists.account.remove": "பட்டியலில் இருந்து அகற்று",
-  "lists.delete": "Delete list",
+  "lists.delete": "பட்டியலை நீக்கு",
   "lists.edit": "பட்டியலை திருத்து",
   "lists.edit.submit": "தலைப்பு மாற்றவும்",
   "lists.new.create": "பட்டியலில் சேர்",
   "lists.new.title_placeholder": "புதிய பட்டியல் தலைப்பு",
   "lists.search": "நீங்கள் பின்தொடரும் நபர்கள் மத்தியில் தேடுதல்",
   "lists.subheading": "உங்கள் பட்டியல்கள்",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural,one {# புதியது}other {# புதியவை}}",
   "loading_indicator.label": "ஏற்றுதல்...",
   "media_gallery.toggle_visible": "நிலைமாற்று தெரியும்",
   "missing_indicator.label": "கிடைக்கவில்லை",
@@ -260,19 +260,19 @@
   "navigation_bar.favourites": "விருப்பத்துக்குகந்த",
   "navigation_bar.filters": "முடக்கப்பட்ட வார்த்தைகள்",
   "navigation_bar.follow_requests": "கோரிக்கைகளை பின்பற்றவும்",
-  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.follows_and_followers": "பின்பற்றல்கள் மற்றும் பின்பற்றுபவர்கள்",
   "navigation_bar.info": "இந்த நிகழ்வு பற்றி",
   "navigation_bar.keyboard_shortcuts": "சுருக்குவிசைகள்",
   "navigation_bar.lists": "குதிரை வீர்ர்கள்",
   "navigation_bar.logout": "விடு பதிகை",
   "navigation_bar.mutes": "முடக்கப்பட்ட பயனர்கள்",
-  "navigation_bar.personal": "Personal",
+  "navigation_bar.personal": "தனிப்பட்டவை",
   "navigation_bar.pins": "பொருத்தப்பட்டன toots",
   "navigation_bar.preferences": "விருப்பங்கள்",
   "navigation_bar.public_timeline": "கூட்டாட்சி காலக்கெடு",
   "navigation_bar.security": "பத்திரம்",
   "notification.favourite": "{name} ஆர்வம் கொண்டவர், உங்கள் நிலை",
-  "notification.follow": "{name} நீங்கள் தொடர்ந்து வந்தீர்கள்",
+  "notification.follow": "{name} உங்களைப் பின்தொடர்கிறார்",
   "notification.mention": "{name} நீங்கள் குறிப்பிட்டுள்ளீர்கள்",
   "notification.poll": "நீங்கள் வாக்களித்த வாக்கெடுப்பு முடிவடைந்தது",
   "notification.reblog": "{name} உங்கள் நிலை அதிகரித்தது",
@@ -286,7 +286,7 @@
   "notifications.column_settings.follow": "புதிய பின்பற்றுபவர்கள்:",
   "notifications.column_settings.mention": "குறிப்பிடுகிறது:",
   "notifications.column_settings.poll": "கருத்துக்கணிப்பு முடிவுகள்:",
-  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.push": "தள் அறிவிப்புகள்",
   "notifications.column_settings.reblog": "மதிப்பை உயர்த்து:",
   "notifications.column_settings.show": "பத்தியில் காண்பி",
   "notifications.column_settings.sound": "ஒலி விளையாட",
@@ -296,13 +296,13 @@
   "notifications.filter.follows": "பின்பற்று",
   "notifications.filter.mentions": "குறிப்பிடுகிறார்",
   "notifications.filter.polls": "கருத்துக்கணிப்பு முடிவுகள்",
-  "notifications.group": "{count} notifications",
+  "notifications.group": "{count} அறிவிப்புகள்",
   "poll.closed": "மூடிய",
   "poll.refresh": "பத்துயிர்ப்ப?ட்டு",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# நபர்} other {# நபர்கள்}}",
   "poll.total_votes": "{count, plural, one {# vote} மற்ற {# votes}}",
   "poll.vote": "வாக்களி",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "உங்கள் தேர்வு",
   "poll_button.add_poll": "வாக்கெடுப்பைச் சேர்க்கவும்",
   "poll_button.remove_poll": "வாக்கெடுப்பை அகற்று",
   "privacy.change": "நிலை தனியுரிமை",
@@ -311,43 +311,43 @@
   "privacy.private.long": "பின்தொடர்பவர்களுக்கு மட்டுமே இடுகை",
   "privacy.private.short": "பின்பற்றுபவர்கள் மட்டும்",
   "privacy.public.long": "பொது நேரங்களுக்கான இடுகை",
-  "privacy.public.short": "Public",
+  "privacy.public.short": "பொது",
   "privacy.unlisted.long": "Do not show in public timelines",
   "privacy.unlisted.short": "பட்டியலிடப்படாத",
-  "refresh": "Refresh",
+  "refresh": "புதுப்பி",
   "regeneration_indicator.label": "சுமையேற்றம்…",
   "regeneration_indicator.sublabel": "உங்கள் வீட்டு ஊட்டம் தயார் செய்யப்படுகிறது!",
-  "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
+  "relative_time.days": "{number}நா",
+  "relative_time.hours": "{number}ம",
   "relative_time.just_now": "இப்பொழுது",
-  "relative_time.minutes": "{number}m",
-  "relative_time.seconds": "{number}s",
+  "relative_time.minutes": "{number}நி",
+  "relative_time.seconds": "{number}வி",
   "reply_indicator.cancel": "எதிராணை",
   "report.forward": "முன்னோக்கி {target}",
   "report.forward_hint": "கணக்கு மற்றொரு சேவையகத்திலிருந்து வருகிறது. அறிக்கையின் அநாமதேய பிரதி ஒன்றை அனுப்பவும்.?",
   "report.hint": "அறிக்கை உங்கள் மாதிரியாக மாற்றியமைக்கப்படும். கீழே உள்ள கணக்கை நீங்கள் ஏன் புகாரளிக்கிறீர்கள் என்பதற்கான விளக்கத்தை வழங்கலாம்:",
   "report.placeholder": "கூடுதல் கருத்துரைகள்",
-  "report.submit": "Submit",
+  "report.submit": "சமர்ப்பி",
   "report.target": "Report {target}",
   "search.placeholder": "தேடு",
   "search_popout.search_format": "மேம்பட்ட தேடல் வடிவம்",
   "search_popout.tips.full_text": "எளிமையான உரை நீங்கள் எழுதப்பட்ட, புகழ், அதிகரித்தது, அல்லது குறிப்பிட்டுள்ள, அதே போல் பயனர் பெயர்கள், காட்சி பெயர்கள், மற்றும் ஹேஸ்டேகைகளை கொண்டுள்ளது என்று நிலைகளை கொடுக்கிறது.",
   "search_popout.tips.hashtag": "ஹேஸ்டேக்",
-  "search_popout.tips.status": "status",
+  "search_popout.tips.status": "நிலைமை",
   "search_popout.tips.text": "எளிய உரை காட்சி பெயர்கள், பயனர்பெயர்கள் மற்றும் ஹாஷ்டேட்களுடன் பொருந்துகிறது",
-  "search_popout.tips.user": "user",
-  "search_results.accounts": "People",
+  "search_popout.tips.user": "பயனர்",
+  "search_results.accounts": "மக்கள்",
   "search_results.hashtags": "ஹாஷ்டேக்குகளைச்",
-  "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.statuses": "டூட்டுகள்",
+  "search_results.statuses_fts_disabled": "டூட்டுகளின் வார்த்தைகளைக்கொண்டு தேடுவது இந்த மச்டோடன் வழங்கியில் இயல்விக்கப்படவில்லை.",
   "search_results.total": "{count, number} {count, plural, one {result} மற்ற {results}}",
   "status.admin_account": "மிதமான இடைமுகத்தை திறக்க @{name}",
   "status.admin_status": "மிதமான இடைமுகத்தில் இந்த நிலையை திறக்கவும்",
-  "status.block": "Block @{name}",
+  "status.block": "@{name} -ஐத் தடு",
   "status.cancel_reblog_private": "இல்லை பூஸ்ட்",
   "status.cannot_reblog": "இந்த இடுகை அதிகரிக்க முடியாது",
   "status.copy": "நிலைக்கு இணைப்பை நகலெடு",
-  "status.delete": "Delete",
+  "status.delete": "நீக்கு",
   "status.detailed_status": "விரிவான உரையாடல் காட்சி",
   "status.direct": "நேரடி செய்தி @{name}",
   "status.embed": "கிடத்து",
@@ -370,7 +370,7 @@
   "status.redraft": "நீக்கு மற்றும் மீண்டும் வரைவு",
   "status.reply": "பதில்",
   "status.replyAll": "நூலுக்கு பதிலளிக்கவும்",
-  "status.report": "Report @{name}",
+  "status.report": "@{name} மீது புகாரளி",
   "status.sensitive_warning": "உணர்திறன் உள்ளடக்கம்",
   "status.share": "பங்கிடு",
   "status.show_less": "குறைவாகக் காண்பி",
@@ -378,15 +378,15 @@
   "status.show_more": "மேலும் காட்ட",
   "status.show_more_all": "அனைவருக்கும் மேலும் காட்டு",
   "status.show_thread": "நூல் காட்டு",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "கிடைக்கவில்லை",
   "status.unmute_conversation": "ஊமையாக உரையாடல் இல்லை",
   "status.unpin": "சுயவிவரத்திலிருந்து நீக்கவும்",
   "suggestions.dismiss": "பரிந்துரை விலக்க",
   "suggestions.header": "நீங்கள் ஆர்வமாக இருக்கலாம் …",
-  "tabs_bar.federated_timeline": "Federated",
-  "tabs_bar.home": "Home",
-  "tabs_bar.local_timeline": "Local",
-  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.federated_timeline": "கூட்டமைந்த",
+  "tabs_bar.home": "முகப்பு",
+  "tabs_bar.local_timeline": "உள்ளூர்",
+  "tabs_bar.notifications": "அறிவிப்புகள்",
   "tabs_bar.search": "தேடு",
   "time_remaining.days": "{number, plural, one {# day} மற்ற {# days}} left",
   "time_remaining.hours": "{number, plural, one {# hour} மற்ற {# hours}} left",
@@ -394,30 +394,30 @@
   "time_remaining.moments": "தருணங்கள் மீதமுள்ளன",
   "time_remaining.seconds": "{number, plural, one {# second} மற்ற {# seconds}} left",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} மற்ற {people}} உரையாடு",
-  "trends.trending_now": "Trending now",
+  "trends.trending_now": "இப்போது செல்திசையில் இருப்பவை",
   "ui.beforeunload": "நீங்கள் வெளியே சென்றால் உங்கள் வரைவு இழக்கப்படும் மஸ்தோடோன்.",
   "upload_area.title": "பதிவேற்ற & இழுக்கவும்",
   "upload_button.label": "மீடியாவைச் சேர்க்கவும் (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "கோப்பு பதிவேற்ற வரம்பு மீறப்பட்டது.",
   "upload_error.poll": "கோப்பு பதிவேற்றம் அனுமதிக்கப்படவில்லை.",
   "upload_form.description": "பார்வையற்ற விவரிக்கவும்",
-  "upload_form.edit": "Edit",
-  "upload_form.undo": "Delete",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_form.edit": "தொகு",
+  "upload_form.undo": "நீக்கு",
+  "upload_modal.analyzing_picture": "படம் ஆராயப்படுகிறது…",
+  "upload_modal.apply": "உபயோகி",
+  "upload_modal.description_placeholder": "பொருள் விளக்கம்",
+  "upload_modal.detect_text": "படத்தில் இருக்கும் எழுத்தை கண்டறி",
+  "upload_modal.edit_media": "படத்தைத் தொகு",
+  "upload_modal.hint": "எல்லா வில்லைப்பட்த்திலும் தெரியவேண்டிய, படத்தின் முக்கிய குவியப்புள்ளிக்கு, வட்டத்தை சொடுக்கி இழுத்துச்செல்லவும்.",
+  "upload_modal.preview_label": "முன்னோட்டம் ({ratio})",
   "upload_progress.label": "ஏற்றுகிறது ...",
   "video.close": "வீடியோவை மூடு",
   "video.exit_fullscreen": "முழு திரையில் இருந்து வெளியேறவும்",
   "video.expand": "வீடியோவை விரிவாக்கு",
-  "video.fullscreen": "Full screen",
+  "video.fullscreen": "முழுத்திரை",
   "video.hide": "வீடியோவை மறை",
   "video.mute": "ஒலி முடக்கவும்",
-  "video.pause": "Pause",
+  "video.pause": "இடைநிறுத்து",
   "video.play": "விளையாடு",
   "video.unmute": "ஒலி மெளனமாக இல்லை"
 }
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index a9278fdd0..7db168338 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -1,9 +1,9 @@
 {
   "account.add_or_remove_from_list": "เพิ่มหรือเอาออกจากรายการ",
   "account.badges.bot": "บอต",
-  "account.block": "ปิดกั้น @{name}",
+  "account.block": "บล็อค @{name}",
   "account.block_domain": "ซ่อนทุกอย่างจาก {domain}",
-  "account.blocked": "ปิดกั้นอยู่",
+  "account.blocked": "ถูกบล็อค",
   "account.cancel_follow_request": "ยกเลิกคำขอติดตาม",
   "account.direct": "ส่งข้อความโดยตรงถึง @{name}",
   "account.domain_blocked": "ซ่อนโดเมนอยู่",
@@ -38,8 +38,8 @@
   "account.unfollow": "เลิกติดตาม",
   "account.unmute": "เลิกปิดเสียง @{name}",
   "account.unmute_notifications": "เลิกปิดเสียงการแจ้งเตือนจาก @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.message": "โปรดลองใหม่หลังจาก {retry_time, time, medium}",
+  "alert.rate_limited.title": "เข้าใช้งานบ่อยเกินไป",
   "alert.unexpected.message": "เกิดข้อผิดพลาดที่ไม่คาดคิด",
   "alert.unexpected.title": "อุปส์!",
   "autosuggest_hashtag.per_week": "{count} ต่อสัปดาห์",
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "ออกจากระบบ",
   "confirmations.logout.message": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?",
   "confirmations.mute.confirm": "ปิดเสียง",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "การกระทำนี้จะซ่อนโพสต์ของเขาและโพสต์ที่มีการกล่าวถึงเขา แต่ยังอนุญาตให้เขาเห็นโพสต์ของคุณและติดตามคุณได้",
   "confirmations.mute.message": "คุณแน่ใจหรือไม่ว่าต้องการปิดเสียง {name}?",
   "confirmations.redraft.confirm": "ลบแล้วร่างใหม่",
   "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบสถานะนี้แล้วร่างใหม่? รายการโปรดและการดันจะหายไป และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน",
@@ -117,8 +117,8 @@
   "conversation.with": "กับ {names}",
   "directory.federated": "จากเฟดิเวิร์สที่รู้จัก",
   "directory.local": "จาก {domain} เท่านั้น",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "directory.new_arrivals": "มาใหม่",
+  "directory.recently_active": "ใช้งานล่าสุด",
   "embed.instructions": "ฝังสถานะนี้ในเว็บไซต์ของคุณโดยคัดลอกโค้ดด้านล่าง",
   "embed.preview": "นี่คือลักษณะที่จะปรากฏ:",
   "emoji_button.activity": "กิจกรรม",
@@ -152,9 +152,9 @@
   "empty_column.mutes": "คุณยังไม่ได้ปิดเสียงผู้ใช้ใด ๆ",
   "empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ โต้ตอบกับผู้อื่นเพื่อเริ่มการสนทนา",
   "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมให้เต็ม",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "error.unexpected_crash.explanation": "หน้านี้ไม่สามารถแสดงผลได้อย่างถูกต้อง เนื่องจากบั๊กในโค้ดของเราหรือปัญหาความเข้ากับได้กับเบราเซอร์",
+  "error.unexpected_crash.next_steps": "ลองรีเฟรชหน้านี้ หากไม่สามารถช่วยได้ คุณอาจจะยังคงใช้ Mastodon ผ่านเบราเซอร์อื่นหรือผ่านแอปได้",
+  "errors.unexpected_crash.copy_stacktrace": "คัดลอกการติดตามสแตกไปยังคลิปบอร์ด",
   "errors.unexpected_crash.report_issue": "รายงานปัญหา",
   "follow_request.authorize": "อนุญาต",
   "follow_request.reject": "ปฏิเสธ",
@@ -190,14 +190,14 @@
   "introduction.federation.local.text": "โพสต์สาธารณะจากผู้คนในเซิร์ฟเวอร์เดียวกันกับคุณจะปรากฏในเส้นเวลาในเว็บ",
   "introduction.interactions.action": "เสร็จสิ้นบทช่วยสอน!",
   "introduction.interactions.favourite.headline": "ชื่นชอบ",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.favourite.text": "คุณสามารถบันทึกโพสต์เพื่ออ่านทีหลัง และแจ้งให้ผู้เขียนโพสต์ทราบว่าคุณชอบโพสต์นั้นโดยการชื่นชอบโพสต์",
   "introduction.interactions.reblog.headline": "ดัน",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reblog.text": "คุณสามารถแชร์โพสต์ของผู้อื่นให้กับผู้ติดตามของคุณได้โดยการดันโพสต์",
   "introduction.interactions.reply.headline": "ตอบกลับ",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.interactions.reply.text": "คุณสามารถตอบกลับโพสต์ของผู้อื่นและโพสต์ของคุณได้ ซึ่งจะถูกรวมเข้าด้วยกันเป็นบทสนทนา",
   "introduction.welcome.action": "ไปกันเลย!",
   "introduction.welcome.headline": "ขั้นตอนแรก",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.welcome.text": "ยินดีต้อนรับสู่เฟดิเวิร์ส! ในอีกสักครู่คุณจะได้เผยแพร่ข้อความและคุยกับเพื่อนของคุณในหลากหลายเซิร์ฟเวอร์ แต่เซิร์ฟเวอร์ {domain} นี้มีความพิเศษ เพราะเป็นที่ที่โปรไฟล์ของคุณตั้งอยู่ จำชื่อไว้ด้วยนะ",
   "keyboard_shortcuts.back": "เพื่อนำทางย้อนกลับ",
   "keyboard_shortcuts.blocked": "เพื่อเปิดรายการผู้ใช้ที่ปิดกั้นอยู่",
   "keyboard_shortcuts.boost": "เพื่อดัน",
@@ -249,7 +249,7 @@
   "missing_indicator.label": "ไม่พบ",
   "missing_indicator.sublabel": "ไม่พบทรัพยากรนี้",
   "mute_modal.hide_notifications": "ซ่อนการแจ้งเตือนจากผู้ใช้นี้?",
-  "navigation_bar.apps": "แอปสำหรับมือถือ",
+  "navigation_bar.apps": "แอปมือถือ",
   "navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
   "navigation_bar.community_timeline": "เส้นเวลาในเว็บ",
   "navigation_bar.compose": "เขียนโพสต์ใหม่",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} การแจ้งเตือน",
   "poll.closed": "ปิดแล้ว",
   "poll.refresh": "รีเฟรช",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, other {# คน}}",
   "poll.total_votes": "{count, plural, other {# การลงคะแนน}}",
   "poll.vote": "ลงคะแนน",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "คุณได้ลงคะแนนให้กับคำตอบนี้",
   "poll_button.add_poll": "เพิ่มโพล",
   "poll_button.remove_poll": "เอาโพลออก",
   "privacy.change": "ปรับเปลี่ยนความเป็นส่วนตัวของสถานะ",
@@ -339,7 +339,7 @@
   "search_results.accounts": "ผู้คน",
   "search_results.hashtags": "แฮชแท็ก",
   "search_results.statuses": "โพสต์",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.statuses_fts_disabled": "การค้นหาเนื้อหาในโพสต์ถูกปิดบนเซิร์ฟเวอร์ Mastodon นี้",
   "search_results.total": "{count, number} {count, plural, other {ผลลัพธ์}}",
   "status.admin_account": "เปิดส่วนติดต่อการควบคุมสำหรับ @{name}",
   "status.admin_status": "เปิดสถานะนี้ในส่วนติดต่อการควบคุม",
@@ -378,7 +378,7 @@
   "status.show_more": "แสดงเพิ่มเติม",
   "status.show_more_all": "แสดงเพิ่มเติมทั้งหมด",
   "status.show_thread": "แสดงกระทู้",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "ไม่สามารถดูได้",
   "status.unmute_conversation": "เลิกปิดเสียงการสนทนา",
   "status.unpin": "ถอนหมุดจากโปรไฟล์",
   "suggestions.dismiss": "ยกเลิกข้อเสนอแนะ",
@@ -406,9 +406,9 @@
   "upload_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…",
   "upload_modal.apply": "นำไปใช้",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.detect_text": "ตรวจจับข้อความจากรูปภาพ",
   "upload_modal.edit_media": "แก้ไขสื่อ",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.hint": "คลิกหรือลากวงกลมในภาพเพื่อเลือกจุดโฟกัส ซึ่งจะทำให้ส่วนนั้นอยู่ในกรอบของภาพขนาดย่อตลอดเวลา",
   "upload_modal.preview_label": "ตัวอย่าง ({ratio})",
   "upload_progress.label": "กำลังอัปโหลด...",
   "video.close": "ปิดวิดีโอ",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 5ceefa182..89efafd1d 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Listeye ekle veya kaldır",
+  "account.add_or_remove_from_list": "Listelere ekle veya kaldır",
   "account.badges.bot": "Bot",
   "account.block": "@{name} adlı kişiyi engelle",
   "account.block_domain": "{domain} alanından her şeyi gizle",
@@ -26,8 +26,8 @@
   "account.mute_notifications": "@{name} adlı kişinin bildirimlerini kapat",
   "account.muted": "Susturuldu",
   "account.never_active": "Asla",
-  "account.posts": "Gönderi",
-  "account.posts_with_replies": "Gönderiler ve yanıtlar",
+  "account.posts": "Toot",
+  "account.posts_with_replies": "Tootlar ve cevaplar",
   "account.report": "@{name} adlı kişiyi bildir",
   "account.requested": "Onay Bekleniyor. Takip isteğini iptal etmek için tıklayın",
   "account.share": "@{name} kullanıcısının profilini paylaş",
@@ -61,7 +61,7 @@
   "column.lists": "Listeler",
   "column.mutes": "Susturulmuş kullanıcılar",
   "column.notifications": "Bildirimler",
-  "column.pins": "Sabitlenmiş gönderi",
+  "column.pins": "Sabitlenmiş tootlar",
   "column.public": "Federe zaman tüneli",
   "column_back_button.label": "Geri",
   "column_header.hide_settings": "Ayarları gizle",
@@ -72,9 +72,9 @@
   "column_header.unpin": "Sabitlemeyi kaldır",
   "column_subheading.settings": "Ayarlar",
   "community.column_settings.media_only": "Sadece medya",
-  "compose_form.direct_message_warning": "Bu gönderi sadece belirtilen kullanıcılara gönderilecektir.",
+  "compose_form.direct_message_warning": "Bu toot sadece belirtilen kullanıcılara gönderilecektir.",
   "compose_form.direct_message_warning_learn_more": "Daha fazla bilgi edinin",
-  "compose_form.hashtag_warning": "Bu paylaşım liste dışı olduğu için hiç bir hashtag'de yer almayacak. Sadece herkese açık gönderiler hashtaglerde bulunabilir.",
+  "compose_form.hashtag_warning": "Bu toot liste dışı olduğu için hiç bir etikette yer almayacak. Sadece herkese açık tootlar etiketlerde bulunabilir.",
   "compose_form.lock_disclaimer": "Hesabınız {locked} değil. Sadece takipçilerle paylaştığınız gönderileri görebilmek için sizi herhangi bir kullanıcı takip edebilir.",
   "compose_form.lock_disclaimer.lock": "kilitli",
   "compose_form.placeholder": "Aklınızdan ne geçiyor?",
@@ -82,7 +82,7 @@
   "compose_form.poll.duration": "Anket süresi",
   "compose_form.poll.option_placeholder": "Seçim {number}",
   "compose_form.poll.remove_option": "Bu seçimi kaldır",
-  "compose_form.publish": "Gönder",
+  "compose_form.publish": "Tootla",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Medyayı hassas olarak işaretle",
   "compose_form.sensitive.marked": "Medya hassas olarak işaretlendi",
@@ -135,14 +135,14 @@
   "emoji_button.search_results": "Arama sonuçları",
   "emoji_button.symbols": "Semboller",
   "emoji_button.travel": "Seyahat ve Yerler",
-  "empty_column.account_timeline": "Burada hiç gönderi yok!",
+  "empty_column.account_timeline": "Burada hiç toot yok!",
   "empty_column.account_unavailable": "Profil kullanılamıyor",
   "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.",
   "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!",
   "empty_column.direct": "Henüz doğrudan mesajınız yok. Bir tane gönderdiğinizde veya aldığınızda burada görünecektir.",
   "empty_column.domain_blocks": "Henüz hiçbir gizli alan adı yok.",
-  "empty_column.favourited_statuses": "Hiç favori gönderiminiz yok. Bir tane olursa burada görünecek.",
-  "empty_column.favourites": "Kimse bu gönderiyi favorilerine eklememiş. Biri eklerse burada görünecek.",
+  "empty_column.favourited_statuses": "Hiç favori tootunuz yok. Bir tane olduğunda burada görünecek.",
+  "empty_column.favourites": "Kimse bu tootu favorilerine eklememiş. Biri eklediğinde burada görünecek.",
   "empty_column.follow_requests": "Hiç takip isteğiniz yok. Bir tane aldığınızda burada görünecek.",
   "empty_column.hashtag": "Henüz bu hashtag’e sahip hiçbir gönderi yok.",
   "empty_column.home": "Henüz kimseyi takip etmiyorsunuz. {public} ziyaret edebilir veya arama kısmını kullanarak diğer kullanıcılarla iletişime geçebilirsiniz.",
@@ -190,11 +190,11 @@
   "introduction.federation.local.text": "Aynı sunucudaki kişilerin gönderileri yerel zaman tünelinde gözükecektir.",
   "introduction.interactions.action": "Öğreticiyi bitirin!",
   "introduction.interactions.favourite.headline": "Favori",
-  "introduction.interactions.favourite.text": "Bir gönderiyi favorilerinize alarak sonrası için saklayabilirsiniz ve yazara gönderiyi beğendiğinizi söyleyebilirsiniz.",
+  "introduction.interactions.favourite.text": "Bir tootu favorilerinize alarak sonrası için saklayabilirsiniz ve yazara tootu beğendiğinizi söyleyebilirsiniz.",
   "introduction.interactions.reblog.headline": "Yinele",
-  "introduction.interactions.reblog.text": "Başkalarının gönderilerini boostlayarak kendi takipçilerinizle paylaşabillirsiniz.",
+  "introduction.interactions.reblog.text": "Başkalarının tootlarını yineleyerek onları kendi takipçilerinizle paylaşabillirsiniz.",
   "introduction.interactions.reply.headline": "Yanıt",
-  "introduction.interactions.reply.text": "Başkalarının gönderilerini ve kendi gönderilerinizi yanıtlayabilirsiniz. Bir konuşmada zincirli bir şekilde olacaklardır.",
+  "introduction.interactions.reply.text": "Başkalarının ve kendinizin tootlarına cevap verebilirsiniz. Bu, onları bir konuşmada zincirli bir şekilde gösterecektir.",
   "introduction.welcome.action": "Hadi gidelim!",
   "introduction.welcome.headline": "İlk adımlar",
   "introduction.welcome.text": "Krallığa hoş geldiniz! Az sonra, geniş bir sunucu yelpazesinde mesaj gönderip arkadaşlarınızla konuşabileceksiniz. Ama bu sunucu, {domain}, özel (profilinizi barındırır, bu yüzden adresini hatırlayın).",
@@ -219,7 +219,7 @@
   "keyboard_shortcuts.muted": "susturulmuş kullanıcı listesini açmak için",
   "keyboard_shortcuts.my_profile": "profilinizi açmak için",
   "keyboard_shortcuts.notifications": "bildirimler sütununu açmak için",
-  "keyboard_shortcuts.pinned": "sabitlenmiş gönderiler listesini açmak için",
+  "keyboard_shortcuts.pinned": "sabitlenmiş tootların listesini açmak için",
   "keyboard_shortcuts.profile": "yazarın profilini açmak için",
   "keyboard_shortcuts.reply": "cevaplamak için",
   "keyboard_shortcuts.requests": "takip istekleri listesini açmak için",
@@ -227,7 +227,7 @@
   "keyboard_shortcuts.start": "\"başlayın\" sütununu açmak için",
   "keyboard_shortcuts.toggle_hidden": "CW'den önceki yazıyı göstermek/gizlemek için",
   "keyboard_shortcuts.toggle_sensitivity": "medyayı göstermek/gizlemek için",
-  "keyboard_shortcuts.toot": "yeni bir gönderiye başlamak için",
+  "keyboard_shortcuts.toot": "yeni bir toot başlatmak için",
   "keyboard_shortcuts.unfocus": "aramada bir gönderiye odaklanmamak için",
   "keyboard_shortcuts.up": "listede yukarıya çıkmak için",
   "lightbox.close": "Kapat",
@@ -252,7 +252,7 @@
   "navigation_bar.apps": "Mobil uygulamalar",
   "navigation_bar.blocks": "Engellenen kullanıcılar",
   "navigation_bar.community_timeline": "Yerel zaman tüneli",
-  "navigation_bar.compose": "Yeni bir gönderi yazın",
+  "navigation_bar.compose": "Yeni toot oluştur",
   "navigation_bar.direct": "Direkt Mesajlar",
   "navigation_bar.discover": "Keşfet",
   "navigation_bar.domain_blocks": "Gizli alan adları",
@@ -267,7 +267,7 @@
   "navigation_bar.logout": "Çıkış",
   "navigation_bar.mutes": "Sessize alınmış kullanıcılar",
   "navigation_bar.personal": "Kişisel",
-  "navigation_bar.pins": "Sabitlenmiş gönderiler",
+  "navigation_bar.pins": "Sabitlenmiş tootlar",
   "navigation_bar.preferences": "Tercihler",
   "navigation_bar.public_timeline": "Federe zaman tüneli",
   "navigation_bar.security": "Güvenlik",
@@ -338,8 +338,8 @@
   "search_popout.tips.user": "kullanıcı",
   "search_results.accounts": "İnsanlar",
   "search_results.hashtags": "Hashtagler",
-  "search_results.statuses": "Gönderiler",
-  "search_results.statuses_fts_disabled": "Bu Mastodon sunucusunda gönderi içeriğine göre arama etkin değil.",
+  "search_results.statuses": "Tootlar",
+  "search_results.statuses_fts_disabled": "Bu Mastodon sunucusunda toot içeriğine göre arama etkin değil.",
   "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuçlar}}",
   "status.admin_account": "@{name} için denetim arayüzünü açın",
   "status.admin_status": "Denetim arayüzünde bu durumu açın",
@@ -361,12 +361,12 @@
   "status.mute_conversation": "Yazışmayı sustur",
   "status.open": "Bu gönderiyi genişlet",
   "status.pin": "Profile sabitle",
-  "status.pinned": "Sabitlenmiş gönderi",
+  "status.pinned": "Sabitlenmiş toot",
   "status.read_more": "Daha dazla oku",
   "status.reblog": "Boostla",
   "status.reblog_private": "Orjinal kitleye yinele",
   "status.reblogged_by": "{name} boost etti",
-  "status.reblogs.empty": "Kimse bu gönderiyi boostlamadı. Biri yaptığında burada gözükecek.",
+  "status.reblogs.empty": "Henüz kimse bu tootu yinelemedi. Biri yaptığında burada görünecek.",
   "status.redraft": "Sil & tekrar taslakla",
   "status.reply": "Cevapla",
   "status.replyAll": "Konuşmayı cevapla",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 6501c0283..c3b3e45b9 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -8,7 +8,7 @@
   "account.direct": "Пряме повідомлення @{name}",
   "account.domain_blocked": "Домен приховано",
   "account.edit_profile": "Редагувати профіль",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Публікувати у профілі",
   "account.follow": "Підписатися",
   "account.followers": "Підписники",
   "account.followers.empty": "Ніхто ще не підписався на цього користувача.",
@@ -34,7 +34,7 @@
   "account.show_reblogs": "Показати передмухи від @{name}",
   "account.unblock": "Розблокувати @{name}",
   "account.unblock_domain": "Розблокувати {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Не публікувати у профілі",
   "account.unfollow": "Відписатися",
   "account.unmute": "Зняти глушення з @{name}",
   "account.unmute_notifications": "Показувати сповіщення від @{name}",
@@ -103,7 +103,7 @@
   "confirmations.logout.confirm": "Вийти",
   "confirmations.logout.message": "Ви впевнені, що хочете вийти?",
   "confirmations.mute.confirm": "Заглушити",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Це приховає пости від них і пости зі згадками про них, проте вони все одно матимуть змогу бачити ваші пости і підписуватися на вас.",
   "confirmations.mute.message": "Ви впевнені, що хочете заглушити {name}?",
   "confirmations.redraft.confirm": "Видалити та перестворити",
   "confirmations.redraft.message": "Ви впевнені, що хочете видалити допис і перестворити його? Ви втратите всі відповіді, передмухи та вподобайки допису.",
@@ -114,7 +114,7 @@
   "conversation.delete": "Видалити цю бесіду",
   "conversation.mark_as_read": "Позначити як прочитане",
   "conversation.open": "Переглянути бесіду",
-  "conversation.with": "With {names}",
+  "conversation.with": "З {names}",
   "directory.federated": "З відомого федесвіту",
   "directory.local": "Тільки з домену {domain}",
   "directory.new_arrivals": "Нові надходження",
@@ -152,10 +152,10 @@
   "empty_column.mutes": "Ви ще не заглушили жодного користувача.",
   "empty_column.notifications": "У вас ще немає сповіщень. Переписуйтесь з іншими користувачами, щоб почати розмову.",
   "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших інстанцій, щоб заповнити стрічку",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "Ця сторінка не може бути коректно відображена через баґ у нашому коді або через проблему сумісності браузера.",
+  "error.unexpected_crash.next_steps": "Спробуйте перезавантажити сторінку. Якщо це не допоможе, ви все ще зможете використовувати Mastodon через інший браузер або рідний додаток.",
+  "errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
+  "errors.unexpected_crash.report_issue": "Повідомити про проблему",
   "follow_request.authorize": "Авторизувати",
   "follow_request.reject": "Відмовити",
   "getting_started.developers": "Розробникам",
@@ -299,10 +299,10 @@
   "notifications.group": "{count} сповіщень",
   "poll.closed": "Закрито",
   "poll.refresh": "Оновити",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# особа} other {# осіб}}",
   "poll.total_votes": "{count, plural, one {# голос} few {# голоси} many {# голосів} other {# голосів}}",
   "poll.vote": "Проголосувати",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "Ви голосували за цю відповідь",
   "poll_button.add_poll": "Додати опитування",
   "poll_button.remove_poll": "Видалити опитування",
   "privacy.change": "Змінити видимість допису",
@@ -374,9 +374,9 @@
   "status.sensitive_warning": "Дражливий зміст",
   "status.share": "Поділитися",
   "status.show_less": "Згорнути",
-  "status.show_less_all": "Show less for all",
+  "status.show_less_all": "Показувати менше для всіх",
   "status.show_more": "Розгорнути",
-  "status.show_more_all": "Show more for all",
+  "status.show_more_all": "Показувати більше для всіх",
   "status.show_thread": "Показати ланцюжок",
   "status.uncached_media_warning": "Недоступно",
   "status.unmute_conversation": "Зняти глушення з діалогу",
@@ -391,7 +391,7 @@
   "time_remaining.days": "{number, plural, one {# день} few {# дні} other {# днів}}",
   "time_remaining.hours": "{number, plural, one {# година} few {# години} other {# годин}}",
   "time_remaining.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}",
-  "time_remaining.moments": "Moments remaining",
+  "time_remaining.moments": "Залишилось секунд",
   "time_remaining.seconds": "{number, plural, one {# секунда} few {# секунди} other {# секунд}}",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {людина} few {людини} many {людей} other {людей}} обговорюють це",
   "trends.trending_now": "Актуальні",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
new file mode 100644
index 000000000..39ca86a0c
--- /dev/null
+++ b/app/javascript/mastodon/locales/ur.json
@@ -0,0 +1,423 @@
+{
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Bot",
+  "account.block": "Block @{name}",
+  "account.block_domain": "Hide everything from {domain}",
+  "account.blocked": "Blocked",
+  "account.cancel_follow_request": "Cancel follow request",
+  "account.direct": "Direct message @{name}",
+  "account.domain_blocked": "Domain hidden",
+  "account.edit_profile": "Edit profile",
+  "account.endorse": "Feature on profile",
+  "account.follow": "Follow",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.follows": "Follows",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.last_status": "Last active",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "Media",
+  "account.mention": "Mention @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.never_active": "Never",
+  "account.posts": "Toots",
+  "account.posts_with_replies": "Toots and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unhide {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Rate limited",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "autosuggest_hashtag.per_week": "{count} per week",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.body": "Something went wrong while loading this component.",
+  "bundle_column_error.retry": "Try again",
+  "bundle_column_error.title": "Network error",
+  "bundle_modal_error.close": "Close",
+  "bundle_modal_error.message": "Something went wrong while loading this component.",
+  "bundle_modal_error.retry": "Try again",
+  "column.blocks": "Blocked users",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.directory": "Browse profiles",
+  "column.domain_blocks": "Hidden domains",
+  "column.favourites": "Favourites",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Home",
+  "column.lists": "Lists",
+  "column.mutes": "Muted users",
+  "column.notifications": "Notifications",
+  "column.pins": "Pinned toot",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Back",
+  "column_header.hide_settings": "Hide settings",
+  "column_header.moveLeft_settings": "Move column to the left",
+  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.pin": "Pin",
+  "column_header.show_settings": "Show settings",
+  "column_header.unpin": "Unpin",
+  "column_subheading.settings": "Settings",
+  "community.column_settings.media_only": "Media only",
+  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.poll.add_option": "Add a choice",
+  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.option_placeholder": "Choice {number}",
+  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.hide": "Mark media as sensitive",
+  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.confirm": "Block",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "conversation.delete": "Delete conversation",
+  "conversation.mark_as_read": "Mark as read",
+  "conversation.open": "View conversation",
+  "conversation.with": "With {names}",
+  "directory.federated": "From known fediverse",
+  "directory.local": "From {domain} only",
+  "directory.new_arrivals": "New arrivals",
+  "directory.recently_active": "Recently active",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_unavailable": "Profile unavailable",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
+  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Report issue",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "getting_started.developers": "Developers",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Documentation",
+  "getting_started.heading": "Getting started",
+  "getting_started.invite": "Invite people",
+  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.security": "Security",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "and {additional}",
+  "hashtag.column_header.tag_mode.any": "or {additional}",
+  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.pinned": "to open pinned toots list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lightbox.view_context": "View context",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Toggle visibility",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
+  "notifications.group": "{count} notifications",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+  "poll.vote": "Vote",
+  "poll.voted": "You voted for this answer",
+  "poll_button.add_poll": "Add a poll",
+  "poll_button.remove_poll": "Remove poll",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Post to mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Post to followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Post to public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Do not show in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "refresh": "Refresh",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "reply_indicator.cancel": "Cancel",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost to original audience",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.uncached_media_warning": "Not available",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "time_remaining.moments": "Moments remaining",
+  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media ({formats})",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.edit": "Edit",
+  "upload_form.undo": "Delete",
+  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.apply": "Apply",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "video.close": "Close video",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/whitelist_kn.json b/app/javascript/mastodon/locales/whitelist_kn.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_kn.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/whitelist_ml.json b/app/javascript/mastodon/locales/whitelist_ml.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_ml.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/whitelist_mr.json b/app/javascript/mastodon/locales/whitelist_mr.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_mr.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/whitelist_ur.json b/app/javascript/mastodon/locales/whitelist_ur.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_ur.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 2804b2724..550810680 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -16,7 +16,7 @@
   "account.follows.empty": "此用户目前尚未关注任何人。",
   "account.follows_you": "关注了你",
   "account.hide_reblogs": "隐藏来自 @{name} 的转嘟",
-  "account.last_status": "Last active",
+  "account.last_status": "最近活动",
   "account.link_verified_on": "此链接的所有权已在 {date} 检查",
   "account.locked_info": "此账户已锁嘟。账户的主人会手动审核关注者。",
   "account.media": "媒体",
@@ -25,7 +25,7 @@
   "account.mute": "隐藏 @{name}",
   "account.mute_notifications": "隐藏来自 @{name} 的通知",
   "account.muted": "已隐藏",
-  "account.never_active": "Never",
+  "account.never_active": "从未活跃",
   "account.posts": "嘟文",
   "account.posts_with_replies": "嘟文和回复",
   "account.report": "举报 @{name}",
@@ -38,8 +38,8 @@
   "account.unfollow": "取消关注",
   "account.unmute": "不再隐藏 @{name}",
   "account.unmute_notifications": "不再隐藏来自 @{name} 的通知",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.message": "请在 {retry_time, time, medium} 后重试。",
+  "alert.rate_limited.title": "频率受限",
   "alert.unexpected.message": "发生了意外错误。",
   "alert.unexpected.title": "哎呀!",
   "autosuggest_hashtag.per_week": "每星期 {count} 条",
@@ -53,9 +53,9 @@
   "column.blocks": "已屏蔽的用户",
   "column.community": "本站时间轴",
   "column.direct": "私信",
-  "column.directory": "Browse profiles",
+  "column.directory": "浏览用户资料",
   "column.domain_blocks": "已屏蔽的网站",
-  "column.favourites": "收藏",
+  "column.favourites": "喜欢",
   "column.follow_requests": "关注请求",
   "column.home": "主页",
   "column.lists": "列表",
@@ -100,25 +100,25 @@
   "confirmations.delete_list.message": "你确定要永久删除这个列表吗?",
   "confirmations.domain_block.confirm": "隐藏整个网站的内容",
   "confirmations.domain_block.message": "你真的确定要隐藏所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该网站的内容将不再出现在你的任何公共时间轴或通知列表里。来自该网站的关注者将会被移除。",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.logout.confirm": "登出",
+  "confirmations.logout.message": "您确定要登出吗?",
   "confirmations.mute.confirm": "隐藏",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "这将隐藏他们的嘟文以及提到他们的嘟文,但他们仍可以看到你的嘟文并关注你。",
   "confirmations.mute.message": "你确定要隐藏 {name} 吗?",
   "confirmations.redraft.confirm": "删除并重新编辑",
-  "confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和收藏都会被清除,回复将会失去关联。",
+  "confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和喜欢都会被清除,回复将会失去关联。",
   "confirmations.reply.confirm": "回复",
   "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?",
   "confirmations.unfollow.confirm": "取消关注",
   "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "conversation.delete": "删除对话",
+  "conversation.mark_as_read": "标记为已读",
+  "conversation.open": "查看对话",
+  "conversation.with": "与 {names}",
+  "directory.federated": "来自联邦宇宙的已知部分",
+  "directory.local": "仅来自 {domain}",
+  "directory.new_arrivals": "新来者",
+  "directory.recently_active": "最近活跃",
   "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。",
   "embed.preview": "它会像这样显示出来:",
   "emoji_button.activity": "活动",
@@ -141,8 +141,8 @@
   "empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!",
   "empty_column.direct": "你还没有使用过私信。当你发出或者收到私信时,它会在这里显示。",
   "empty_column.domain_blocks": "目前没有被隐藏的站点。",
-  "empty_column.favourited_statuses": "你还没有收藏过任何嘟文。收藏过的嘟文会显示在这里。",
-  "empty_column.favourites": "没有人收藏过这条嘟文。如果有人收藏了,就会显示在这里。",
+  "empty_column.favourited_statuses": "你还没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。",
+  "empty_column.favourites": "没有人喜欢过这条嘟文。如果有人喜欢了,就会显示在这里。",
   "empty_column.follow_requests": "你没有收到新的关注请求。收到了之后就会显示在这里。",
   "empty_column.hashtag": "这个话题标签下暂时没有内容。",
   "empty_column.home": "你还没有关注任何用户。快看看{public},向其他人问个好吧。",
@@ -152,10 +152,10 @@
   "empty_column.mutes": "你没有隐藏任何用户。",
   "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。",
   "empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "此页面无法正确现实,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。",
+  "error.unexpected_crash.next_steps": "刷新一下页面试试。如果没用,您可以换个浏览器或者用本地应用。",
+  "errors.unexpected_crash.copy_stacktrace": "把堆栈跟踪信息复制到剪贴板",
+  "errors.unexpected_crash.report_issue": "报告问题",
   "follow_request.authorize": "同意",
   "follow_request.reject": "拒绝",
   "getting_started.developers": "开发",
@@ -189,8 +189,8 @@
   "introduction.federation.local.headline": "本站",
   "introduction.federation.local.text": "你所关注的用户的动态会显示在主页里,你可以关注任何服务器上的任何人。",
   "introduction.interactions.action": "教程结束!",
-  "introduction.interactions.favourite.headline": "收藏",
-  "introduction.interactions.favourite.text": "你可以保存嘟文以便以后阅读。或者通过收藏功能告诉作者你点了个赞。",
+  "introduction.interactions.favourite.headline": "喜欢",
+  "introduction.interactions.favourite.text": "通过喜欢一条嘟文,你可以保存它以便以后阅读,并且告诉作者你喜欢它。",
   "introduction.interactions.reblog.headline": "转嘟",
   "introduction.interactions.reblog.text": "通过转嘟,你可以向你的关注者分享其他人的嘟文。",
   "introduction.interactions.reply.headline": "回复",
@@ -207,8 +207,8 @@
   "keyboard_shortcuts.direct": "打开私信栏",
   "keyboard_shortcuts.down": "在列表中让光标下移",
   "keyboard_shortcuts.enter": "展开嘟文",
-  "keyboard_shortcuts.favourite": "收藏嘟文",
-  "keyboard_shortcuts.favourites": "打开收藏列表",
+  "keyboard_shortcuts.favourite": "喜欢嘟文",
+  "keyboard_shortcuts.favourites": "打开喜欢的嘟文列表",
   "keyboard_shortcuts.federated": "打开跨站时间轴",
   "keyboard_shortcuts.heading": "快捷键列表",
   "keyboard_shortcuts.home": "打开主页时间轴",
@@ -257,7 +257,7 @@
   "navigation_bar.discover": "发现",
   "navigation_bar.domain_blocks": "已屏蔽的网站",
   "navigation_bar.edit_profile": "修改个人资料",
-  "navigation_bar.favourites": "收藏的内容",
+  "navigation_bar.favourites": "喜欢",
   "navigation_bar.filters": "屏蔽关键词",
   "navigation_bar.follow_requests": "关注请求",
   "navigation_bar.follows_and_followers": "关注管理",
@@ -271,7 +271,7 @@
   "navigation_bar.preferences": "首选项",
   "navigation_bar.public_timeline": "跨站公共时间轴",
   "navigation_bar.security": "安全",
-  "notification.favourite": "{name} 收藏了你的嘟文",
+  "notification.favourite": "{name} 喜欢了你的嘟文",
   "notification.follow": "{name} 开始关注你",
   "notification.mention": "{name} 提及了你",
   "notification.poll": "你参与的一个投票已经结束",
@@ -279,7 +279,7 @@
   "notifications.clear": "清空通知列表",
   "notifications.clear_confirmation": "你确定要永久清空通知列表吗?",
   "notifications.column_settings.alert": "桌面通知",
-  "notifications.column_settings.favourite": "当你的嘟文被收藏时:",
+  "notifications.column_settings.favourite": "当你的嘟文被喜欢时:",
   "notifications.column_settings.filter_bar.advanced": "显示所有类别",
   "notifications.column_settings.filter_bar.category": "快速过滤栏",
   "notifications.column_settings.filter_bar.show": "显示",
@@ -292,17 +292,17 @@
   "notifications.column_settings.sound": "播放音效",
   "notifications.filter.all": "全部",
   "notifications.filter.boosts": "转嘟",
-  "notifications.filter.favourites": "收藏",
+  "notifications.filter.favourites": "喜欢",
   "notifications.filter.follows": "关注",
   "notifications.filter.mentions": "提及",
   "notifications.filter.polls": "投票结果",
   "notifications.group": "{count} 条通知",
   "poll.closed": "已关闭",
   "poll.refresh": "刷新",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# 人} other {# 人}}",
   "poll.total_votes": "{count} 票",
   "poll.vote": "投票",
-  "poll.voted": "You voted for this answer",
+  "poll.voted": "您已经对这个答案投过票了",
   "poll_button.add_poll": "发起投票",
   "poll_button.remove_poll": "移除投票",
   "privacy.change": "设置嘟文可见范围",
@@ -314,7 +314,7 @@
   "privacy.public.short": "公开",
   "privacy.unlisted.long": "所有人可见,但不会出现在公共时间轴上",
   "privacy.unlisted.short": "不公开",
-  "refresh": "Refresh",
+  "refresh": "刷新",
   "regeneration_indicator.label": "加载中……",
   "regeneration_indicator.sublabel": "你的主页时间轴正在准备中!",
   "relative_time.days": "{number}天",
@@ -331,7 +331,7 @@
   "report.target": "举报 {target}",
   "search.placeholder": "搜索",
   "search_popout.search_format": "高级搜索格式",
-  "search_popout.tips.full_text": "输入关键词检索所有你发送、收藏、转嘟过或提及到你的嘟文,以及其他用户公开的用户名、昵称和话题标签。",
+  "search_popout.tips.full_text": "输入关键词检索所有你发送、喜欢、转嘟过或提及到你的嘟文,以及其他用户公开的用户名、昵称和话题标签。",
   "search_popout.tips.hashtag": "话题标签",
   "search_popout.tips.status": "嘟文",
   "search_popout.tips.text": "输入关键词检索昵称、用户名和话题标签",
@@ -351,7 +351,7 @@
   "status.detailed_status": "对话详情",
   "status.direct": "发送私信给 @{name}",
   "status.embed": "嵌入",
-  "status.favourite": "收藏",
+  "status.favourite": "喜欢",
   "status.filtered": "已过滤",
   "status.load_more": "加载更多",
   "status.media_hidden": "隐藏媒体内容",
@@ -378,7 +378,7 @@
   "status.show_more": "显示内容",
   "status.show_more_all": "显示所有内容",
   "status.show_thread": "显示全部对话",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "不可用",
   "status.unmute_conversation": "不再隐藏此对话",
   "status.unpin": "在个人资料页面取消置顶",
   "suggestions.dismiss": "关闭建议",
diff --git a/app/javascript/mastodon/reducers/status_lists.js b/app/javascript/mastodon/reducers/status_lists.js
index 6c5f33557..9f8f28dee 100644
--- a/app/javascript/mastodon/reducers/status_lists.js
+++ b/app/javascript/mastodon/reducers/status_lists.js
@@ -7,12 +7,22 @@ import {
   FAVOURITED_STATUSES_EXPAND_FAIL,
 } from '../actions/favourites';
 import {
+  BOOKMARKED_STATUSES_FETCH_REQUEST,
+  BOOKMARKED_STATUSES_FETCH_SUCCESS,
+  BOOKMARKED_STATUSES_FETCH_FAIL,
+  BOOKMARKED_STATUSES_EXPAND_REQUEST,
+  BOOKMARKED_STATUSES_EXPAND_SUCCESS,
+  BOOKMARKED_STATUSES_EXPAND_FAIL,
+} from '../actions/bookmarks';
+import {
   PINNED_STATUSES_FETCH_SUCCESS,
 } from '../actions/pin_statuses';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 import {
   FAVOURITE_SUCCESS,
   UNFAVOURITE_SUCCESS,
+  BOOKMARK_SUCCESS,
+  UNBOOKMARK_SUCCESS,
   PIN_SUCCESS,
   UNPIN_SUCCESS,
 } from '../actions/interactions';
@@ -23,6 +33,11 @@ const initialState = ImmutableMap({
     loaded: false,
     items: ImmutableList(),
   }),
+  bookmarks: ImmutableMap({
+    next: null,
+    loaded: false,
+    items: ImmutableList(),
+  }),
   pins: ImmutableMap({
     next: null,
     loaded: false,
@@ -71,10 +86,24 @@ export default function statusLists(state = initialState, action) {
     return normalizeList(state, 'favourites', action.statuses, action.next);
   case FAVOURITED_STATUSES_EXPAND_SUCCESS:
     return appendToList(state, 'favourites', action.statuses, action.next);
+  case BOOKMARKED_STATUSES_FETCH_REQUEST:
+  case BOOKMARKED_STATUSES_EXPAND_REQUEST:
+    return state.setIn(['bookmarks', 'isLoading'], true);
+  case BOOKMARKED_STATUSES_FETCH_FAIL:
+  case BOOKMARKED_STATUSES_EXPAND_FAIL:
+    return state.setIn(['bookmarks', 'isLoading'], false);
+  case BOOKMARKED_STATUSES_FETCH_SUCCESS:
+    return normalizeList(state, 'bookmarks', action.statuses, action.next);
+  case BOOKMARKED_STATUSES_EXPAND_SUCCESS:
+    return appendToList(state, 'bookmarks', action.statuses, action.next);
   case FAVOURITE_SUCCESS:
     return prependOneToList(state, 'favourites', action.status);
   case UNFAVOURITE_SUCCESS:
     return removeOneFromList(state, 'favourites', action.status);
+  case BOOKMARK_SUCCESS:
+    return prependOneToList(state, 'bookmarks', action.status);
+  case UNBOOKMARK_SUCCESS:
+    return removeOneFromList(state, 'bookmarks', action.status);
   case PINNED_STATUSES_FETCH_SUCCESS:
     return normalizeList(state, 'pins', action.statuses, action.next);
   case PIN_SUCCESS:
diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js
index 372673bc0..772f98bcb 100644
--- a/app/javascript/mastodon/reducers/statuses.js
+++ b/app/javascript/mastodon/reducers/statuses.js
@@ -4,6 +4,8 @@ import {
   FAVOURITE_REQUEST,
   FAVOURITE_FAIL,
   UNFAVOURITE_SUCCESS,
+  BOOKMARK_REQUEST,
+  BOOKMARK_FAIL,
 } from '../actions/interactions';
 import {
   STATUS_MUTE_SUCCESS,
@@ -43,6 +45,10 @@ export default function statuses(state = initialState, action) {
     return state.setIn([action.status.get('id'), 'favourites_count'], favouritesCount - 1);
   case FAVOURITE_FAIL:
     return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], false);
+  case BOOKMARK_REQUEST:
+    return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], true);
+  case BOOKMARK_FAIL:
+    return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], false);
   case REBLOG_REQUEST:
     return state.setIn([action.status.get('id'), 'reblogged'], true);
   case REBLOG_FAIL:
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 732e42a45..3ba53f406 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -1592,6 +1592,10 @@ a.account__display-name {
   color: $gold-star;
 }
 
+.bookmark-icon.active {
+  color: $red-bookmark;
+}
+
 .no-reduce-motion .icon-button.star-icon {
   &.activate {
     & > .fa-star {
diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss
index a82c44229..8602c3dde 100644
--- a/app/javascript/styles/mastodon/variables.scss
+++ b/app/javascript/styles/mastodon/variables.scss
@@ -6,6 +6,8 @@ $error-red: #df405a !default;        // Cerise
 $warning-red: #ff5050 !default;      // Sunset Orange
 $gold-star: #ca8f04 !default;        // Dark Goldenrod
 
+$red-bookmark: $warning-red;
+
 // Values from the classic Mastodon UI
 $classic-base-color: #282c37;         // Midnight Express
 $classic-primary-color: #9baec8;      // Echo Blue
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index d109d991c..cdb8383df 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -168,7 +168,7 @@ class FeedManager
       crutches = build_crutches(account.id, statuses)
 
       statuses.each do |status|
-        next if filter_from_home?(status, account, crutches)
+        next if filter_from_home?(status, account.id, crutches)
 
         add_to_feed(:home, account.id, status, aggregate)
       end
diff --git a/app/models/bookmark.rb b/app/models/bookmark.rb
index 916261a17..01dc48ee7 100644
--- a/app/models/bookmark.rb
+++ b/app/models/bookmark.rb
@@ -3,11 +3,11 @@
 #
 # Table name: bookmarks
 #
-#  id         :bigint(8)        not null, primary key
-#  account_id :bigint(8)        not null
-#  status_id  :bigint(8)        not null
+#  id         :integer          not null, primary key
 #  created_at :datetime         not null
 #  updated_at :datetime         not null
+#  account_id :integer          not null
+#  status_id  :integer          not null
 #
 
 class Bookmark < ApplicationRecord
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 640c60fd4..29880e8d8 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -39,6 +39,12 @@ class FetchLinkCardService < BaseService
   def process_url
     @card ||= PreviewCard.new(url: @url)
 
+    attempt_oembed || attempt_opengraph
+  end
+
+  def html
+    return @html if defined?(@html)
+
     Request.new(:get, @url).perform do |res|
       if res.code == 200 && res.mime_type == 'text/html'
         @html = res.body_with_limit
@@ -48,10 +54,6 @@ class FetchLinkCardService < BaseService
         @html_charset = nil
       end
     end
-
-    return if @html.nil?
-
-    attempt_oembed || attempt_opengraph
   end
 
   def attach_card
@@ -88,12 +90,17 @@ class FetchLinkCardService < BaseService
   end
 
   def attempt_oembed
-    service = FetchOEmbedService.new
-    embed   = service.call(@url, html: @html)
-    url     = Addressable::URI.parse(service.endpoint_url)
+    service         = FetchOEmbedService.new
+    url_domain      = Addressable::URI.parse(@url).normalized_host
+    cached_endpoint = Rails.cache.read("oembed_endpoint:#{url_domain}")
+
+    embed   = service.call(@url, cached_endpoint: cached_endpoint) unless cached_endpoint.nil?
+    embed ||= service.call(@url, html: html) unless html.nil?
 
     return false if embed.nil?
 
+    url = Addressable::URI.parse(service.endpoint_url)
+
     @card.type          = embed[:type]
     @card.title         = embed[:title]         || ''
     @card.author_name   = embed[:author_name]   || ''
@@ -127,6 +134,8 @@ class FetchLinkCardService < BaseService
   end
 
   def attempt_opengraph
+    return if html.nil?
+
     detector = CharlockHolmes::EncodingDetector.new
     detector.strip_tags = true
 
diff --git a/app/services/fetch_oembed_service.rb b/app/services/fetch_oembed_service.rb
index 10176cfb9..4f8498c62 100644
--- a/app/services/fetch_oembed_service.rb
+++ b/app/services/fetch_oembed_service.rb
@@ -1,13 +1,20 @@
 # frozen_string_literal: true
 
 class FetchOEmbedService
+  ENDPOINT_CACHE_EXPIRES_IN = 24.hours.freeze
+
   attr_reader :url, :options, :format, :endpoint_url
 
   def call(url, options = {})
     @url     = url
     @options = options
 
-    discover_endpoint!
+    if @options[:cached_endpoint]
+      parse_cached_endpoint!
+    else
+      discover_endpoint!
+    end
+
     fetch!
   end
 
@@ -32,10 +39,32 @@ class FetchOEmbedService
     return if @endpoint_url.blank?
 
     @endpoint_url = (Addressable::URI.parse(@url) + @endpoint_url).to_s
+
+    cache_endpoint!
   rescue Addressable::URI::InvalidURIError
     @endpoint_url = nil
   end
 
+  def parse_cached_endpoint!
+    cached = @options[:cached_endpoint]
+
+    return if cached[:endpoint].nil? || cached[:format].nil?
+
+    @endpoint_url = Addressable::Template.new(cached[:endpoint]).expand(url: @url).to_s
+    @format       = cached[:format]
+  end
+
+  def cache_endpoint!
+    url_domain = Addressable::URI.parse(@url).normalized_host
+
+    endpoint_hash = {
+      endpoint: @endpoint_url.gsub(URI.encode_www_form_component(@url), '{url}'),
+      format: @format,
+    }
+
+    Rails.cache.write("oembed_endpoint:#{url_domain}", endpoint_hash, expires_in: ENDPOINT_CACHE_EXPIRES_IN)
+  end
+
   def fetch!
     return if @endpoint_url.blank?
 
diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb
index aa883597a..4e971a4b8 100644
--- a/app/services/resolve_url_service.rb
+++ b/app/services/resolve_url_service.rb
@@ -24,6 +24,12 @@ class ResolveURLService < BaseService
       status = FetchRemoteStatusService.new.call(resource_url, body, protocol)
       authorize_with @on_behalf_of, status, :show? unless status.nil?
       status
+    elsif fetched_resource.nil? && @on_behalf_of.present?
+      # It may happen that the resource is a private toot, and thus not fetchable,
+      # but we can return the toot if we already know about it.
+      status = Status.find_by(uri: @url) || Status.find_by(url: @url)
+      authorize_with @on_behalf_of, status, :show? unless status.nil?
+      status
     end
   end