about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2022-05-26 18:34:27 +0200
committerClaire <claire.github-309c@sitedethib.com>2022-05-26 18:34:27 +0200
commitf13d910f3ea3af1e6b5ff2ebfa084a86b1d7dfde (patch)
tree6e373aa9ced74f68ee366cc50e23d14a524c36f9 /app
parent444b65009411a08ddab95ec60b86b3cf63086c2e (diff)
parent088dc0ec5a383006952c0b15508af882a4c1109c (diff)
Merge branch 'main' into glitch-soc/merge-upstream
Diffstat (limited to 'app')
-rw-r--r--app/controllers/api/v1/accounts_controller.rb10
-rw-r--r--app/javascript/mastodon/locales/ckb.json88
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json4
-rw-r--r--app/javascript/mastodon/locales/en.json2
-rw-r--r--app/javascript/mastodon/locales/eo.json8
-rw-r--r--app/javascript/mastodon/locales/et.json84
-rw-r--r--app/javascript/mastodon/locales/gd.json10
-rw-r--r--app/javascript/mastodon/locales/hy.json8
-rw-r--r--app/javascript/mastodon/locales/io.json54
-rw-r--r--app/models/account.rb9
-rw-r--r--app/models/poll.rb5
-rw-r--r--app/models/status.rb2
-rw-r--r--app/services/process_mentions_service.rb3
13 files changed, 152 insertions, 135 deletions
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 5134bfb94..5537cc9b0 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -9,6 +9,8 @@ class Api::V1::AccountsController < Api::BaseController
 
   before_action :require_user!, except: [:show, :create]
   before_action :set_account, except: [:create]
+  before_action :check_account_approval, except: [:create]
+  before_action :check_account_confirmation, except: [:create]
   before_action :check_enabled_registrations, only: [:create]
 
   skip_before_action :require_authenticated_user!, only: :create
@@ -74,6 +76,14 @@ class Api::V1::AccountsController < Api::BaseController
     @account = Account.find(params[:id])
   end
 
+  def check_account_approval
+    raise(ActiveRecord::RecordNotFound) if @account.local? && @account.user_pending?
+  end
+
+  def check_account_confirmation
+    raise(ActiveRecord::RecordNotFound) if @account.local? && !@account.user_confirmed?
+  end
+
   def relationships(**options)
     AccountRelationshipsPresenter.new([@account.id], current_user.account_id, **options)
   end
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
index 1ade0d5ef..a642c8a81 100644
--- a/app/javascript/mastodon/locales/ckb.json
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -19,7 +19,7 @@
   "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
   "account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
   "account.following": "دواکەوتن",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
   "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
   "account.follows_you": "شوێنکەوتووەکانت",
   "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
@@ -48,9 +48,9 @@
   "account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}",
   "account.unmute_short": "بێدەنگی مەکە",
   "account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
-  "admin.dashboard.retention.average": "Average",
+  "admin.dashboard.daily_retention": "ڕێژەی مانەوەی بەکارهێنەر بەپێی ڕۆژ دوای ناو تۆمارکردن",
+  "admin.dashboard.monthly_retention": "ڕێژەی مانەوەی بەکارهێنەر بەپێی مانگ دوای ناو تۆمارکردن",
+  "admin.dashboard.retention.average": "ڕێژە",
   "admin.dashboard.retention.cohort": "چوونەژوورەوەی مانگانە",
   "admin.dashboard.retention.cohort_size": "ئەندامی نوێ",
   "alert.rate_limited.message": "تکایە هەوڵبدەرەوە دوای {retry_time, time, medium}.",
@@ -123,8 +123,8 @@
   "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
   "confirmations.delete_list.confirm": "سڕینەوە",
   "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
-  "confirmations.discard_edit_media.confirm": "Discard",
-  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.discard_edit_media.confirm": "ڕەتکردنەوە",
+  "confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟",
   "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە",
   "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
   "confirmations.logout.confirm": "چوونە دەرەوە",
@@ -149,7 +149,7 @@
   "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
   "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
   "emoji_button.activity": "چالاکی",
-  "emoji_button.clear": "Clear",
+  "emoji_button.clear": "ڕوون",
   "emoji_button.custom": "ئاسایی",
   "emoji_button.flags": "ئاڵاکان",
   "emoji_button.food": "خواردن& خواردنەوە",
@@ -169,12 +169,12 @@
   "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
   "empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
   "empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.direct": "تا ئێستا هیچ نامەیەکی ڕاستەوخۆت نییە. کاتێک یەکێکیان دەنێری یان وەریدەگریت، لێرە دەردەکەوێت.",
   "empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.explore_statuses": "لە ئێستادا هیچ شتێک ترێند نییە. دواتر سەیری بکە!",
   "empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.",
   "empty_column.favourites": "کەس ئەم توتەی دڵخواز نەکردووە،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
-  "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+  "empty_column.follow_recommendations": "پێدەچێت هیچ پێشنیارێک بۆ تۆ دروست نەکرێت. دەتوانیت هەوڵبدەیت گەڕان بەکاربهێنیت بۆ گەڕان بەدوای ئەو کەسانەی کە ڕەنگە بیانناسیت یان بەدوای هاشتاگە ڕەوتەکاندا بگەڕێیت.",
   "empty_column.follow_requests": "تۆ هێشتا هیچ داواکارییەکی بەدواداچووت نیە. کاتێک یەکێکت بۆ هات، لێرە دەرئەکەویت.",
   "empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.",
   "empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.",
@@ -267,8 +267,8 @@
   "lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە",
   "lightbox.next": "داهاتوو",
   "lightbox.previous": "پێشوو",
-  "limited_account_hint.action": "Show profile anyway",
-  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
+  "limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە",
+  "limited_account_hint.title": "ئەم پرۆفایلییە لەلایەن بەڕێوەبەرانی سێرڤەرەکەتەوە شاراوەتەوە.",
   "lists.account.add": "زیادکردن بۆ لیست",
   "lists.account.remove": "لابردن لە لیست",
   "lists.delete": "سڕینەوەی لیست",
@@ -282,7 +282,7 @@
   "lists.replies_policy.title": "پیشاندانی وەڵامەکان بۆ:",
   "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": "شاردنەوەی {number, plural, one {image} other {images}}",
   "missing_indicator.label": "نەدۆزرایەوە",
@@ -341,22 +341,22 @@
   "notifications.column_settings.show": "لە ستووندا پیشان بدە",
   "notifications.column_settings.sound": "لێدانی دەنگ",
   "notifications.column_settings.status": "توتەکانی نوێ:",
-  "notifications.column_settings.unread_notifications.category": "Unread notifications",
-  "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.unread_notifications.category": "ئاگاداریی نەبینراو",
+  "notifications.column_settings.unread_notifications.highlight": "تیشک بخە سەر ئاگاداری نەخوێنراو",
   "notifications.column_settings.update": "دەستکاری:",
   "notifications.filter.all": "هەموو",
   "notifications.filter.boosts": "دووبارەتوتەکان",
   "notifications.filter.favourites": "دڵخوازەکان",
-  "notifications.filter.follows": "شوێنکەوتن",
+  "notifications.filter.follows": "بەدواداچوون",
   "notifications.filter.mentions": "ئاماژەکان",
   "notifications.filter.polls": "ئەنجامەکانی ڕاپرسی",
   "notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت",
-  "notifications.grant_permission": "Grant permission.",
+  "notifications.grant_permission": "مۆڵەت بدە.",
   "notifications.group": "{count} ئاگانامە",
   "notifications.mark_as_read": "هەموو ئاگانامەکان وەک خوێندراوەتەوە نیشان بکە",
   "notifications.permission_denied": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت وەک ڕێپێدان ڕەتکرایەوە.",
   "notifications.permission_denied_alert": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت، چونکە پێشتر مۆڵەتی وێبگەڕ ڕەتکرایەوە",
-  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "notifications.permission_required": "ئاگادارکردنەوەکانی سەر مێز بەردەست نین چونکە مۆڵەتی پێویست نەدراوە.",
   "notifications_permission_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ",
   "notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.",
   "notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە",
@@ -367,27 +367,27 @@
   "poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n",
   "poll.vote": "دەنگ",
   "poll.voted": "تۆ دەنگت بەو وەڵامە دا",
-  "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+  "poll.votes": "{votes, plural, one {# دەنگ} other {# دەنگ}}",
   "poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
   "poll_button.remove_poll": "ده‌نگدان بسڕه‌وه‌‌",
   "privacy.change": "ڕێکخستنی تایبەتمەندی توت",
   "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "تەنها کەسانی باس کراو",
   "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "تەنیا شوێنکەوتووان",
+  "privacy.public.long": "بۆ هەمووان دیارە",
   "privacy.public.short": "گشتی",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە تایبەتمەندییەکانی دۆزینەوە دەرچووە",
   "privacy.unlisted.short": "لە لیست نەکراو",
   "refresh": "نوێکردنەوە",
   "regeneration_indicator.label": "بارکردن…",
   "regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!",
   "relative_time.days": "{number}ڕۆژ",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە",
+  "relative_time.full.hours": "{number, plural, one {# کاتژمێر} other {# کاتژمێر}} ماوە",
+  "relative_time.full.just_now": "ئێستا",
+  "relative_time.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}} ماوە",
+  "relative_time.full.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
   "relative_time.hours": "{number}کات",
   "relative_time.just_now": "ئێستا",
   "relative_time.minutes": "{number}کات",
@@ -418,19 +418,19 @@
   "report.reasons.spam": "ئەوە سپامە",
   "report.reasons.spam_description": "لینکە خراپەکان، بەشداری ساختە، یان وەڵامدانەوەی دووبارە",
   "report.reasons.violation": "یاساکانی سێرڤەر پێشێل دەکات",
-  "report.reasons.violation_description": "You are aware that it breaks specific rules",
-  "report.rules.subtitle": "Select all that apply",
-  "report.rules.title": "Which rules are being violated?",
-  "report.statuses.subtitle": "Select all that apply",
-  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.reasons.violation_description": "ئاگاداری ئەوەن کە یاسا تایبەتەکان دەشکێنێت",
+  "report.rules.subtitle": "هەموو ئەوانەی کە کاریان پێدەکرێت هەڵبژێرە",
+  "report.rules.title": "کام یاسا پێشێل دەکرێت؟",
+  "report.statuses.subtitle": "هەموو ئەوانەی کە کاریان پێدەکرێت هەڵبژێرە",
+  "report.statuses.title": "ئایا هیچ پۆستێک هەیە کە پشتگیری ئەم ڕاپۆرتە بکات؟",
   "report.submit": "ناردن",
   "report.target": "گوزارشتکردنی{target}",
-  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
-  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
-  "report.thanks.title": "Don't want to see this?",
-  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
-  "report.unfollow": "Unfollow @{name}",
-  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "report.thanks.take_action": "لێرەدا بژاردەکانت بۆ کۆنترۆڵکردنی ئەو شتانە دەخەینەڕوو کە لە ماستۆدۆن دەیبینیت:",
+  "report.thanks.take_action_actionable": "لە کاتێکدا ئێمە پێداچوونەوە بەم بابەتە دەکەین، دەتوانیت ڕێوشوێن بگریتەبەر دژی @{name}:",
+  "report.thanks.title": "ناتەوێت ئەمە ببینیت؟",
+  "report.thanks.title_actionable": "سوپاس بۆ ڕاپۆرتکردن، ئێمە سەیری ئەم بابەتە دەکەین.",
+  "report.unfollow": "بەدوادانەچوو@{name}",
+  "report.unfollow_explanation": "تۆ شوێنکەوتووی ئەم هەژماررەی دەکەیت. بۆ ئەوەی چیتر نووسراوەکانیان لە هۆم فیدی خۆت نەبینی، بەدوایان مەچۆ.",
   "search.placeholder": "گەڕان",
   "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو",
   "search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.",
@@ -457,12 +457,12 @@
   "status.direct": "پەیامی ڕاستەوخۆ @{name}",
   "status.edit": "دەستکاری",
   "status.edited": "بەشداری {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
   "status.embed": "نیشتەجێ بکە",
   "status.favourite": "دڵخواز",
   "status.filtered": "پاڵاوتن",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} دروستکراوە لە{date}",
+  "status.history.edited": "{name} دروستکاریکراوە لە{date}",
   "status.load_more": "زیاتر بار بکە",
   "status.media_hidden": "میدیای شاراوە",
   "status.mention": "ناوبنێ @{name}",
@@ -520,14 +520,14 @@
   "upload_error.poll": "فایل و ڕاپرسی پێکەوە ڕێپێنەدراون.",
   "upload_form.audio_description": "پەیامەکەت بۆ نابیستەکان",
   "upload_form.description": "پەیامەکەت بۆ نابیناکان",
-  "upload_form.description_missing": "No description added",
+  "upload_form.description_missing": "هیچ وەسفێک زیاد نەکراوە",
   "upload_form.edit": "دەستکاری",
   "upload_form.thumbnail": "گۆڕانی وینۆچکە",
   "upload_form.undo": "بیسڕەوە",
   "upload_form.video_description": "پەیامەکەت بۆ نابیست و نابیناکان",
   "upload_modal.analyzing_picture": "وێنەکە شی دەکرێتەوە…",
   "upload_modal.apply": "بیسەپێنە",
-  "upload_modal.applying": "Applying…",
+  "upload_modal.applying": "داواکاری…",
   "upload_modal.choose_image": "وێنە هەڵبژێرە",
   "upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا",
   "upload_modal.detect_text": "نووسینی ناو وێنەکە دەستنیشان بکە",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index ffaf05605..56266e9e2 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1546,7 +1546,7 @@
         "id": "compose_form.hashtag_warning"
       },
       {
-        "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+        "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.",
         "id": "compose_form.encryption_warning"
       },
       {
@@ -3724,4 +3724,4 @@
     ],
     "path": "app/javascript/mastodon/features/video/index.json"
   }
-]
\ No newline at end of file
+]
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 1efa93967..6a361a265 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -99,7 +99,7 @@
   "compose.language.change": "Change language",
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.",
   "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts 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",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 0eb9ee682..917994561 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -18,7 +18,7 @@
   "account.followers": "Sekvantoj",
   "account.followers.empty": "Ankoraŭ neniu sekvas tiun uzanton.",
   "account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}",
-  "account.following": "Following",
+  "account.following": "Sekvantaj",
   "account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}",
   "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.",
   "account.follows_you": "Sekvas vin",
@@ -149,7 +149,7 @@
   "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.",
   "embed.preview": "Ĝi aperos tiel:",
   "emoji_button.activity": "Agadoj",
-  "emoji_button.clear": "Clear",
+  "emoji_button.clear": "Forviŝi",
   "emoji_button.custom": "Propraj",
   "emoji_button.flags": "Flagoj",
   "emoji_button.food": "Manĝi kaj trinki",
@@ -267,7 +267,7 @@
   "lightbox.expand": "Pligrandigi bildan vidkeston",
   "lightbox.next": "Sekva",
   "lightbox.previous": "Antaŭa",
-  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.action": "Montru profilon ĉiukaze",
   "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Aldoni al la listo",
   "lists.account.remove": "Forigi de la listo",
@@ -331,7 +331,7 @@
   "notifications.column_settings.favourite": "Stelumoj:",
   "notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn",
   "notifications.column_settings.filter_bar.category": "Rapida filtra breto",
-  "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+  "notifications.column_settings.filter_bar.show_bar": "Montru filtrilon",
   "notifications.column_settings.follow": "Novaj sekvantoj:",
   "notifications.column_settings.follow_request": "Novaj petoj de sekvado:",
   "notifications.column_settings.mention": "Mencioj:",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 8c25a6af5..e7c153681 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Märge",
   "account.add_or_remove_from_list": "Lisa või Eemalda nimekirjadest",
   "account.badges.bot": "Robot",
   "account.badges.group": "Grupp",
@@ -8,7 +8,7 @@
   "account.blocked": "Blokeeritud",
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Tühista jälgimistaotlus",
-  "account.direct": "Otsesõnum @{name}",
+  "account.direct": "Saada otsesõnum @{name}'ile",
   "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domeen peidetud",
   "account.edit_profile": "Muuda profiili",
@@ -17,28 +17,28 @@
   "account.follow": "Jälgi",
   "account.followers": "Jälgijad",
   "account.followers.empty": "Keegi ei jälgi seda kasutajat veel.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.followers_counter": "{count, plural, one {{counter} jälgija} other {{counter} jälgijat}}",
   "account.following": "Following",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.following_counter": "{count, plural, one {{counter} jälgitav} other {{counter} jälgitavat}}",
   "account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
   "account.follows_you": "Jälgib Teid",
   "account.hide_reblogs": "Peida upitused kasutajalt @{name}",
-  "account.joined": "Joined {date}",
+  "account.joined": "Liitus {date}",
   "account.link_verified_on": "Selle lingi autorsust kontrolliti {date}",
   "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.mention": "Maini @{name}'i",
   "account.moved_to": "{name} on kolinud:",
   "account.mute": "Vaigista @{name}",
   "account.mute_notifications": "Vaigista teated kasutajalt @{name}",
   "account.muted": "Vaigistatud",
-  "account.posts": "Tuututused",
-  "account.posts_with_replies": "Tuututused ja vastused",
+  "account.posts": "Postitused",
+  "account.posts_with_replies": "Postitused ja vastused",
   "account.report": "Raporteeri @{name}",
   "account.requested": "Ootab kinnitust. Klõpsa jälgimise soovi tühistamiseks",
   "account.share": "Jaga @{name} profiili",
   "account.show_reblogs": "Näita kasutaja @{name} upitusi",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} postitus} other {{counter} postitust}}",
   "account.unblock": "Eemalda blokeering @{name}",
   "account.unblock_domain": "Tee {domain} nähtavaks",
   "account.unblock_short": "Unblock",
@@ -47,7 +47,7 @@
   "account.unmute": "Ära vaigista @{name}",
   "account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}",
   "account.unmute_short": "Unmute",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Klõpsa märkme lisamiseks",
   "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
   "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
   "admin.dashboard.retention.average": "Average",
@@ -99,14 +99,14 @@
   "compose_form.hashtag_warning": "Seda tuuti ei kuvata ühegi sildi all, sest see on kirjendamata. Ainult avalikud tuutid on sildi järgi otsitavad.",
   "compose_form.lock_disclaimer": "Teie konto ei ole {locked}. Igaüks saab Teid jälgida ja näha Teie ainult-jälgijatele postitusi.",
   "compose_form.lock_disclaimer.lock": "lukus",
-  "compose_form.placeholder": "Millest mõtlete?",
+  "compose_form.placeholder": "Millest mõtled?",
   "compose_form.poll.add_option": "Lisa valik",
   "compose_form.poll.duration": "Küsitluse kestus",
   "compose_form.poll.option_placeholder": "Valik {number}",
   "compose_form.poll.remove_option": "Eemalda see valik",
   "compose_form.poll.switch_to_multiple": "Muuda küsitlust lubamaks mitut valikut",
   "compose_form.poll.switch_to_single": "Muuda küsitlust lubamaks ainult ühte valikut",
-  "compose_form.publish": "Tuut",
+  "compose_form.publish": "Tuututa",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Märgista meedia tundlikuks",
@@ -152,7 +152,7 @@
   "emoji_button.clear": "Clear",
   "emoji_button.custom": "Mugandatud",
   "emoji_button.flags": "Lipud",
-  "emoji_button.food": "Toit & Jook",
+  "emoji_button.food": "Toit & jook",
   "emoji_button.label": "Sisesta emoji",
   "emoji_button.nature": "Loodus",
   "emoji_button.not_found": "Ei ole emojosi!! (╯°□°)╯︵ ┻━┻",
@@ -162,7 +162,7 @@
   "emoji_button.search": "Otsi...",
   "emoji_button.search_results": "Otsitulemused",
   "emoji_button.symbols": "Sümbolid",
-  "emoji_button.travel": "Reisimine & Kohad",
+  "emoji_button.travel": "Reisimine & kohad",
   "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Siin tuute ei ole!",
   "empty_column.account_unavailable": "Profiil pole saadaval",
@@ -171,11 +171,11 @@
   "empty_column.community": "Kohalik ajajoon on tühi. Kirjutage midagi avalikult, et pall veerema ajada!",
   "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": "Siin ei ole veel peidetud domeene.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.explore_statuses": "Ükski postitus pole hetkel populaarne. Tule hiljem tagasi!",
   "empty_column.favourited_statuses": "Teil pole veel lemmikuid tuute. Kui märgite mõne, näete neid siin.",
   "empty_column.favourites": "Keegi pole veel seda tuuti lemmikuks märkinud. Kui seegi seda teeb, näed seda siin.",
   "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
-  "empty_column.follow_requests": "Teil pole veel ühtegi jälgimise taotlust. Kui saate mõne, näete neid siin.",
+  "empty_column.follow_requests": "Teil pole hetkel ühtegi jälgimistaotlust. Kui saate mõne, näete neid siin.",
   "empty_column.hashtag": "Selle sildiga pole veel midagi.",
   "empty_column.home": "Teie kodu ajajoon on tühi! Külastage {public} või kasutage otsingut alustamaks ja kohtamaks teisi kasutajaid.",
   "empty_column.home.suggestions": "See some suggestions",
@@ -190,12 +190,12 @@
   "error.unexpected_crash.next_steps_addons": "Try disabling them and 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": "Kopeeri stacktrace lõikelauale",
   "errors.unexpected_crash.report_issue": "Teavita veast",
-  "explore.search_results": "Search results",
-  "explore.suggested_follows": "For you",
-  "explore.title": "Explore",
-  "explore.trending_links": "News",
-  "explore.trending_statuses": "Posts",
-  "explore.trending_tags": "Hashtags",
+  "explore.search_results": "Otsingutulemused",
+  "explore.suggested_follows": "Sinu jaoks",
+  "explore.title": "Avasta",
+  "explore.trending_links": "Uudised",
+  "explore.trending_statuses": "Postitused",
+  "explore.trending_tags": "Sildid",
   "follow_recommendations.done": "Done",
   "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
   "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -236,7 +236,7 @@
   "keyboard_shortcuts.description": "Kirjeldus",
   "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "liikumaks nimstus alla",
-  "keyboard_shortcuts.enter": "staatuse avamiseks",
+  "keyboard_shortcuts.enter": "Ava postitus",
   "keyboard_shortcuts.favourite": "lemmikuks märkimiseks",
   "keyboard_shortcuts.favourites": "avamaks lemmikute nimistut",
   "keyboard_shortcuts.federated": "avamaks föderatsiooni ajajoont",
@@ -284,13 +284,13 @@
   "lists.subheading": "Teie nimistud",
   "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}",
   "loading_indicator.label": "Laeb..",
-  "media_gallery.toggle_visible": "Lülita nähtavus",
+  "media_gallery.toggle_visible": "{number, plural, one {Varja pilt} other {Varja pildid}}",
   "missing_indicator.label": "Ei leitud",
   "missing_indicator.sublabel": "Seda ressurssi ei leitud",
   "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?",
   "mute_modal.indefinite": "Indefinite",
-  "navigation_bar.apps": "Mobiilrakendused",
+  "navigation_bar.apps": "Mobiilirakendused",
   "navigation_bar.blocks": "Blokeeritud kasutajad",
   "navigation_bar.bookmarks": "Järjehoidjad",
   "navigation_bar.community_timeline": "Kohalik ajajoon",
@@ -299,7 +299,7 @@
   "navigation_bar.discover": "Avasta",
   "navigation_bar.domain_blocks": "Peidetud domeenid",
   "navigation_bar.edit_profile": "Muuda profiili",
-  "navigation_bar.explore": "Explore",
+  "navigation_bar.explore": "Avasta",
   "navigation_bar.favourites": "Lemmikud",
   "navigation_bar.filters": "Vaigistatud sõnad",
   "navigation_bar.follow_requests": "Jälgimistaotlused",
@@ -364,13 +364,13 @@
   "poll.closed": "Suletud",
   "poll.refresh": "Värskenda",
   "poll.total_people": "{count, plural,one {# inimene} other {# inimest}}",
-  "poll.total_votes": "{count, plural, one {# hääl} other {# hääli}}",
+  "poll.total_votes": "{count, plural, one {# hääl} other {# häält}}",
   "poll.vote": "Hääleta",
   "poll.voted": "Teie hääletasite selle poolt",
-  "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+  "poll.votes": "{votes, plural, one {# hääl} other {# häält}}",
   "poll_button.add_poll": "Lisa küsitlus",
   "poll_button.remove_poll": "Eemalda küsitlus",
-  "privacy.change": "Muuda staatuse privaatsust",
+  "privacy.change": "Muuda postituse nähtavust",
   "privacy.direct.long": "Postita ainult mainitud kasutajatele",
   "privacy.direct.short": "Direct",
   "privacy.private.long": "Postita ainult jälgijatele",
@@ -384,7 +384,7 @@
   "regeneration_indicator.sublabel": "Teie kodu voog on ettevalmistamisel!",
   "relative_time.days": "{number}p",
   "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+  "relative_time.full.hours": "{number, plural, one {# tund} other {# tundi}} tagasi",
   "relative_time.full.just_now": "just now",
   "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
   "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
@@ -439,7 +439,7 @@
   "search_popout.tips.text": "Lihtne tekst toob esile kattuvad kuvanimed, kasutajanimed ning sildid",
   "search_popout.tips.user": "kasutaja",
   "search_results.accounts": "Inimesed",
-  "search_results.all": "All",
+  "search_results.all": "Kõik",
   "search_results.hashtags": "Sildid",
   "search_results.nothing_found": "Could not find anything for these search terms",
   "search_results.statuses": "Tuudid",
@@ -451,10 +451,10 @@
   "status.bookmark": "Järjehoidja",
   "status.cancel_reblog_private": "Äraupita",
   "status.cannot_reblog": "Seda postitust ei saa upitada",
-  "status.copy": "Kopeeri link staatusesse",
+  "status.copy": "Kopeeri postituse link",
   "status.delete": "Kustuta",
   "status.detailed_status": "Detailne vestluskuva",
-  "status.direct": "Otsesõnum @{name}",
+  "status.direct": "Saada otsesõnum @{name}'ile",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
@@ -463,13 +463,13 @@
   "status.filtered": "Filtreeritud",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
-  "status.load_more": "Lae veel",
+  "status.load_more": "Lae rohkem",
   "status.media_hidden": "Meedia peidetud",
-  "status.mention": "Mainimine @{name}",
+  "status.mention": "Maini @{name}'i",
   "status.more": "Veel",
   "status.mute": "Vaigista @{name}",
   "status.mute_conversation": "Vaigista vestlus",
-  "status.open": "Laienda see staatus",
+  "status.open": "Laienda see postitus",
   "status.pin": "Kinnita profiilile",
   "status.pinned": "Kinnitatud tuut",
   "status.read_more": "Loe veel",
@@ -481,7 +481,7 @@
   "status.remove_bookmark": "Eemalda järjehoidja",
   "status.reply": "Vasta",
   "status.replyAll": "Vasta lõimele",
-  "status.report": "Raport @{name}",
+  "status.report": "Raporteeri @{name}",
   "status.sensitive_warning": "Tundlik sisu",
   "status.share": "Jaga",
   "status.show_less": "Näita vähem",
@@ -499,17 +499,17 @@
   "tabs_bar.local_timeline": "Kohalik",
   "tabs_bar.notifications": "Teated",
   "tabs_bar.search": "Otsi",
-  "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} left",
-  "time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} left",
-  "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} left",
+  "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} jäänud",
+  "time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} jäänud",
+  "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} jäänud",
   "time_remaining.moments": "Hetked jäänud",
-  "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left",
+  "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} jäänud",
   "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
   "timeline_hint.resources.followers": "Followers",
   "timeline_hint.resources.follows": "Follows",
   "timeline_hint.resources.statuses": "Older toots",
   "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
-  "trends.trending_now": "Praegu populaarne",
+  "trends.trending_now": "Hetkel populaarne",
   "ui.beforeunload": "Teie mustand läheb kaotsi, kui lahkute Mastodonist.",
   "units.short.billion": "{count}B",
   "units.short.million": "{count}M",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index 0f5ffab04..4294cee84 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -92,8 +92,8 @@
   "community.column_settings.local_only": "Feadhainn ionadail a-mhàin",
   "community.column_settings.media_only": "Meadhanan a-mhàin",
   "community.column_settings.remote_only": "Feadhainn chèin a-mhàin",
-  "compose.language.change": "Change language",
-  "compose.language.search": "Search languages...",
+  "compose.language.change": "Atharraich an cànan",
+  "compose.language.search": "Lorg cànan…",
   "compose_form.direct_message_warning_learn_more": "Barrachd fiosrachaidh",
   "compose_form.encryption_warning": "Chan eil crioptachadh ceann gu ceann air postaichean Mhastodon. Na co-roinn fiosrachadh cunnartach idir le Mastodon.",
   "compose_form.hashtag_warning": "Cha nochd am post seo fon taga hais on a tha e falaichte o liostaichean. Cha ghabh ach postaichean poblach a lorg a-rèir an tagaichean hais.",
@@ -149,7 +149,7 @@
   "embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a’ dèanamh lethbhreac dhen chòd gu h-ìosal.",
   "embed.preview": "Seo an coltas a bhios air:",
   "emoji_button.activity": "Gnìomhachd",
-  "emoji_button.clear": "Clear",
+  "emoji_button.clear": "Falamhaich",
   "emoji_button.custom": "Gnàthaichte",
   "emoji_button.flags": "Brataichean",
   "emoji_button.food": "Biadh ⁊ deoch",
@@ -206,7 +206,7 @@
   "getting_started.developers": "Luchd-leasachaidh",
   "getting_started.directory": "Eòlaire nam pròifil",
   "getting_started.documentation": "Docamaideadh",
-  "getting_started.heading": "Dèan toiseach-tòiseachaidh",
+  "getting_started.heading": "Toiseach",
   "getting_started.invite": "Thoir cuireadh do dhaoine",
   "getting_started.open_source_notice": "’S e bathar-bog le bun-tùs fosgailte a th’ ann am Mastodon. ’S urrainn dhut cuideachadh leis no aithris a dhèanamh air duilgheadasan air GitHub fo {github}.",
   "getting_started.security": "Roghainnean a’ chunntais",
@@ -256,7 +256,7 @@
   "keyboard_shortcuts.requests": "Fosgail liosta nan iarrtasan leantainn",
   "keyboard_shortcuts.search": "Cuir am fòcas air a’ bhàr-luirg",
   "keyboard_shortcuts.spoilers": "Seall/Falaich raon an rabhaidh susbainte",
-  "keyboard_shortcuts.start": "Fosgail an colbh “dèan toiseach-tòiseachaidh”",
+  "keyboard_shortcuts.start": "Fosgail an colbh “Toiseach”",
   "keyboard_shortcuts.toggle_hidden": "Seall/Falaich an teacsa fo rabhadh susbainte",
   "keyboard_shortcuts.toggle_sensitivity": "Seall/Falaich na meadhanan",
   "keyboard_shortcuts.toot": "Tòisich air post ùr",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 493deba27..1285403fc 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -70,7 +70,7 @@
   "column.blocks": "Արգելափակուած օգտատէրեր",
   "column.bookmarks": "Էջանիշեր",
   "column.community": "Տեղական հոսք",
-  "column.direct": "Direct messages",
+  "column.direct": "Հասցէագրուած",
   "column.directory": "Զննել անձնական էջերը",
   "column.domain_blocks": "Թաքցուած տիրոյթները",
   "column.favourites": "Հաւանածներ",
@@ -95,7 +95,7 @@
   "compose.language.change": "Change language",
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Իմանալ աւելին",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Մաստոդոնում գրառումները ծայրից-ծայր գաղտնագրուող չեն։ Գաղտնիք պարունակող նամակներ մի ուղարկէք։",
   "compose_form.hashtag_warning": "Այս գրառումը չի հաշուառուի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարաւոր է որոնել պիտակներով։",
   "compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։",
   "compose_form.lock_disclaimer.lock": "փակ",
@@ -169,7 +169,7 @@
   "empty_column.blocks": "Դու դեռ ոչ մէկի չես արգելափակել։",
   "empty_column.bookmarked_statuses": "Դու դեռ չունես որեւէ էջանշուած գրառում։ Երբ էջանշես, դրանք կը երեւան այստեղ։",
   "empty_column.community": "Տեղական հոսքը դատարկ է։ Հրապարակային մի բան գրի՛ր շարժիչը գործարկելու համար։",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.direct": "Դու դեռ չունես ոչ մի հասցէագրուած հաղորդագրութիւն։ Երբ ուղարկես կամ ստանաս որեւէ անձնական նամակ, այն կերեւայ այստեղ։",
   "empty_column.domain_blocks": "Թաքցուած տիրոյթներ դեռ չկան։",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Դու դեռ չունես որեւէ հաւանած գրառում։ Երբ հաւանես, դրանք կերեւան այստեղ։",
@@ -295,7 +295,7 @@
   "navigation_bar.bookmarks": "Էջանիշեր",
   "navigation_bar.community_timeline": "Տեղական հոսք",
   "navigation_bar.compose": "Ստեղծել նոր գրառում",
-  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.direct": "Հասցէագրուած նամակներ",
   "navigation_bar.discover": "Բացայայտել",
   "navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ",
   "navigation_bar.edit_profile": "Խմբագրել անձնական էջը",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 27dc52ce9..bb13779f3 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -6,7 +6,7 @@
   "account.block": "Blokusar @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Restriktita",
-  "account.browse_more_on_origin_server": "Videz plu che originala profilo",
+  "account.browse_more_on_origin_server": "Videz pluse che originala profilo",
   "account.cancel_follow_request": "Removez sequodemando",
   "account.direct": "Direct Message @{name}",
   "account.disable_notifications": "Cesez avizar me kande @{name} postas",
@@ -94,7 +94,7 @@
   "community.column_settings.remote_only": "Fora nur",
   "compose.language.change": "Chanjez linguo",
   "compose.language.search": "Trovez linguo...",
-  "compose_form.direct_message_warning_learn_more": "Lernez plu",
+  "compose_form.direct_message_warning_learn_more": "Lernez pluse",
   "compose_form.encryption_warning": "Posti di Mastodon ne intersequante chifrigesas. Ne partigez irga danjera informo che Mastodon.",
   "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": "Vua konto ne esas {locked}. Irgu povas sequar vu por vidar vua sequanto-nura posti.",
@@ -109,14 +109,14 @@
   "compose_form.publish": "Siflar",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Sparez chanji",
-  "compose_form.sensitive.hide": "{count, plural,one {Markigez medii quale privata} other {Markigez medii quale privata}}",
-  "compose_form.sensitive.marked": "{count, plural,one {Medii markigesis quale privata} other {Medii markigesis quale privata}}",
-  "compose_form.sensitive.unmarked": "{count, plural,one {Medii ne markigesis quale privata} other {Medii ne markigesis quale privata}}",
+  "compose_form.sensitive.hide": "{count, plural,one {Markizez medii quale privata} other {Markizez medii quale privata}}",
+  "compose_form.sensitive.marked": "{count, plural,one {Medii markizesis quale privata} other {Medii markizesis quale privata}}",
+  "compose_form.sensitive.unmarked": "{count, plural,one {Medii ne markizesis quale privata} other {Medii ne markizesis quale privata}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Averto di kontenajo",
-  "confirmation_modal.cancel": "Extingez",
-  "confirmations.block.block_and_report": "Restriktez e Raportigez",
+  "confirmation_modal.cancel": "Anulez",
+  "confirmations.block.block_and_report": "Restriktez e Raportizez",
   "confirmations.block.confirm": "Restriktez",
   "confirmations.block.message": "Ka vu certe volas restrikar {name}?",
   "confirmations.delete.confirm": "Efacez",
@@ -139,7 +139,7 @@
   "confirmations.unfollow.confirm": "Desequez",
   "confirmations.unfollow.message": "Ka vu certe volas desequar {name}?",
   "conversation.delete": "Efacez konverso",
-  "conversation.mark_as_read": "Markigez quale lektita",
+  "conversation.mark_as_read": "Markizez quale lektita",
   "conversation.open": "Videz konverso",
   "conversation.with": "Kun {names}",
   "directory.federated": "De savita fediverso",
@@ -184,7 +184,7 @@
   "empty_column.mutes": "Vu ne silencigis irga uzanti til nun.",
   "empty_column.notifications": "Tu havas ankore nula savigo. Komunikez kun altri por debutar la konverso.",
   "empty_column.public": "Esas nulo hike! Skribez ulo publike, o manuale sequez uzeri de altra instaluri por plenigar ol.",
-  "error.unexpected_crash.explanation": "Pro eroro en nia numero o vidilkonciliebloproblemo, ca pagino ne povas korekte montresar.",
+  "error.unexpected_crash.explanation": "Pro eroro en nia kodexo o vidilkonciliebloproblemo, ca pagino ne povas korekte montresar.",
   "error.unexpected_crash.explanation_addons": "Ca pagino ne povas korekte montresar. Ca eroro posible kauzigesas vidilplusajo o automata tradukutensili.",
   "error.unexpected_crash.next_steps": "Probez rifreshar pagino. Se to ne helpas, vu forsan ankore povas uzar Mastodon per diferenta vidilo o provizita softwaro.",
   "error.unexpected_crash.next_steps_addons": "Probez desaktivigar e rifreshar pagino. Se to ne helpas, vu forsan ankore povas uzar Mastodon per diferenta vidilo o provizita softwaro.",
@@ -286,11 +286,11 @@
   "loading_indicator.label": "Kargante...",
   "media_gallery.toggle_visible": "Chanjar videbleso",
   "missing_indicator.label": "Ne trovita",
-  "missing_indicator.sublabel": "Ca resurso ne existas",
+  "missing_indicator.sublabel": "Ca moyeno ne existas",
   "mute_modal.duration": "Durado",
   "mute_modal.hide_notifications": "Celez avizi de ca uzanto?",
   "mute_modal.indefinite": "Nedefinitiva",
-  "navigation_bar.apps": "Telefonprogrami",
+  "navigation_bar.apps": "Smartfonsoftwari",
   "navigation_bar.blocks": "Blokusita uzeri",
   "navigation_bar.bookmarks": "Libromarki",
   "navigation_bar.community_timeline": "Lokala tempolineo",
@@ -353,7 +353,7 @@
   "notifications.filter.statuses": "Niuz de personi quon vu sequas",
   "notifications.grant_permission": "Donez permiso.",
   "notifications.group": "{count} avizi",
-  "notifications.mark_as_read": "Markigez singla avizi quale lektita",
+  "notifications.mark_as_read": "Markizez singla avizi quale lektita",
   "notifications.permission_denied": "Desktopavizi esas nedisplonebla pro antea refuzita vidilpermisdemando",
   "notifications.permission_denied_alert": "Desktopavizi ne povas aktivigesar pro ke vidilpermiso refuzesis",
   "notifications.permission_required": "Desktopavizi esas nedisplonebla pro ke bezonata permiso ne donesis.",
@@ -398,7 +398,7 @@
   "report.block_explanation": "Vu ne vidos olia posti. Oli ne povas vidar vua posti o sequar vu. Oli savos ke oli restriktesis.",
   "report.categories.other": "Altra",
   "report.categories.spam": "Spamo",
-  "report.categories.violation": "Kontenaj nesequas 1 o plu servilreguli",
+  "report.categories.violation": "Kontenaj nesequas servilregulo",
   "report.category.subtitle": "Selektez maxim bona parigato",
   "report.category.title": "Savigez ni pri quo eventas kun ca {type}",
   "report.category.title_account": "profilo",
@@ -428,11 +428,11 @@
   "report.thanks.take_action": "Co esas vua opcioni por regularar quo vu vidas che Mastodon:",
   "report.thanks.take_action_actionable": "Dum ke ni kontrolas co, vu povas demarshar kontra @{name}:",
   "report.thanks.title": "Ka vu ne volas vidar co?",
-  "report.thanks.title_actionable": "Danko por raportigar, ni kontrolos co.",
+  "report.thanks.title_actionable": "Danko por raportizar, ni kontrolos co.",
   "report.unfollow": "Desequez @{name}",
-  "report.unfollow_explanation": "Vu sequas ca konto. Por ne vidar olia posti en vua hemniuzeto plu, desequez oli.",
+  "report.unfollow_explanation": "Vu sequas ca konto. Por ne vidar olia posti en vua hemniuzeto pluse, desequez oli.",
   "search.placeholder": "Serchez",
-  "search_popout.search_format": "Avance trovformato",
+  "search_popout.search_format": "Avancata trovformato",
   "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": "hashtago",
   "search_popout.tips.status": "status",
@@ -466,13 +466,13 @@
   "status.load_more": "Kargar pluse",
   "status.media_hidden": "Kontenajo celita",
   "status.mention": "Mencionar @{name}",
-  "status.more": "Plu",
+  "status.more": "Pluse",
   "status.mute": "Silencigez @{name}",
   "status.mute_conversation": "Silencigez konverso",
   "status.open": "Detaligar ca mesajo",
   "status.pin": "Pinglagez che profilo",
   "status.pinned": "Pinned toot",
-  "status.read_more": "Lektez plu",
+  "status.read_more": "Lektez pluse",
   "status.reblog": "Repetar",
   "status.reblog_private": "Bustez kun originala videbleso",
   "status.reblogged_by": "{name} repetita",
@@ -487,7 +487,7 @@
   "status.show_less": "Montrar mine",
   "status.show_less_all": "Montrez min por omno",
   "status.show_more": "Montrar plue",
-  "status.show_more_all": "Montrez plu por omno",
+  "status.show_more_all": "Montrez pluse por omno",
   "status.show_thread": "Montrez postaro",
   "status.uncached_media_warning": "Nedisplonebla",
   "status.unmute_conversation": "Desilencigez konverso",
@@ -516,23 +516,23 @@
   "units.short.thousand": "{count}K",
   "upload_area.title": "Tranar faligar por kargar",
   "upload_button.label": "Adjuntar kontenajo",
-  "upload_error.limit": "Failcharglimito ecesesis.",
-  "upload_error.poll": "Failchargo ne permisesas kun votposti.",
-  "upload_form.audio_description": "Deskriptez por personi kun min audkapableso",
-  "upload_form.description": "Deskriptez por personi kun min vidkapableso",
+  "upload_error.limit": "Failadcharglimito ecesesis.",
+  "upload_error.poll": "Failadchargo ne permisesas kun votposti.",
+  "upload_form.audio_description": "Deskriptez por personi kun audnekapableso",
+  "upload_form.description": "Deskriptez por personi kun vidnekapableso",
   "upload_form.description_missing": "Deskriptajo ne insertesis",
   "upload_form.edit": "Modifikez",
-  "upload_form.thumbnail": "Chanjez mikroimajo",
+  "upload_form.thumbnail": "Chanjez imajeto",
   "upload_form.undo": "Desfacar",
-  "upload_form.video_description": "Deskriptez por personi kun min audkapableso o min vidkapableso",
+  "upload_form.video_description": "Deskriptez por personi kun audnekapableso o vidnekapableso",
   "upload_modal.analyzing_picture": "Analizas imajo…",
   "upload_modal.apply": "Aplikez",
   "upload_modal.applying": "Aplikas…",
   "upload_modal.choose_image": "Selektez imajo",
-  "upload_modal.description_placeholder": "Rapida bruna foxo saltas super indolenta hundo",
+  "upload_modal.description_placeholder": "Rapida bruna foxo saltas super la indolenta hundo",
   "upload_modal.detect_text": "Deskovrez texto de imajo",
   "upload_modal.edit_media": "Modifikez medii",
-  "upload_modal.hint": "Kliktez o tirez cirklo che prevido por selektar central punto quo sempre montresas kun omna mikroimaji.",
+  "upload_modal.hint": "Kliktez o tirez cirklo che prevido por selektar centrala punto quo sempre montresas kun omna imajeti.",
   "upload_modal.preparing_ocr": "Preparas OCR…",
   "upload_modal.preview_label": "Previdez ({ratio})",
   "upload_progress.label": "Kargante...",
diff --git a/app/models/account.rb b/app/models/account.rb
index f4fc32153..7c81e07d9 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -113,7 +113,8 @@ class Account < ApplicationRecord
   scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) }
   scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
   scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
-  scope :searchable, -> { without_suspended.where(moved_to_account_id: nil) }
+  scope :without_unapproved, -> { left_outer_joins(:user).remote.or(left_outer_joins(:user).merge(User.approved.confirmed)) }
+  scope :searchable, -> { without_unapproved.without_suspended.where(moved_to_account_id: nil) }
   scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).left_outer_joins(:account_stat) }
   scope :followable_by, ->(account) { joins(arel_table.join(Follow.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(Follow.arel_table[:target_account_id]).and(Follow.arel_table[:account_id].eq(account.id))).join_sources).where(Follow.arel_table[:id].eq(nil)).joins(arel_table.join(FollowRequest.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(FollowRequest.arel_table[:target_account_id]).and(FollowRequest.arel_table[:account_id].eq(account.id))).join_sources).where(FollowRequest.arel_table[:id].eq(nil)) }
   scope :by_recent_status, -> { order(Arel.sql('(case when account_stats.last_status_at is null then 1 else 0 end) asc, account_stats.last_status_at desc, accounts.id desc')) }
@@ -197,7 +198,7 @@ class Account < ApplicationRecord
   end
 
   def searchable?
-    !(suspended? || moved?)
+    !(suspended? || moved?) && (!local? || (approved? && confirmed?))
   end
 
   def possibly_stale?
@@ -463,9 +464,11 @@ class Account < ApplicationRecord
           accounts.*,
           ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank
         FROM accounts
+        LEFT JOIN users ON accounts.id = users.account_id
         WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH}
           AND accounts.suspended_at IS NULL
           AND accounts.moved_to_account_id IS NULL
+          AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL))
         ORDER BY rank DESC
         LIMIT :limit OFFSET :offset
       SQL
@@ -541,9 +544,11 @@ class Account < ApplicationRecord
             (count(f.id) + 1) * ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank
           FROM accounts
           LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = :id) OR (accounts.id = f.target_account_id AND f.account_id = :id)
+          LEFT JOIN users ON accounts.id = users.account_id
           WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH}
             AND accounts.suspended_at IS NULL
             AND accounts.moved_to_account_id IS NULL
+            AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL))
           GROUP BY accounts.id
           ORDER BY rank DESC
           LIMIT :limit OFFSET :offset
diff --git a/app/models/poll.rb b/app/models/poll.rb
index ba08309a1..1a326e452 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -39,13 +39,12 @@ class Poll < ApplicationRecord
 
   before_validation :prepare_options, if: :local?
   before_validation :prepare_votes_count
-
-  after_initialize :prepare_cached_tallies
+  before_validation :prepare_cached_tallies
 
   after_commit :reset_parent_cache, on: :update
 
   def loaded_options
-    options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? cached_tallies[key] : nil) }
+    options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? (cached_tallies[key] || 0) : nil) }
   end
 
   def possibly_stale?
diff --git a/app/models/status.rb b/app/models/status.rb
index 21a574a71..3efa23ae2 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -511,7 +511,7 @@ class Status < ApplicationRecord
   end
 
   def set_poll_id
-    update_column(:poll_id, poll.id) unless poll.nil?
+    update_column(:poll_id, poll.id) if association(:poll).loaded? && poll.present?
   end
 
   def set_visibility
diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb
index 9d239fc65..8c63b611d 100644
--- a/app/services/process_mentions_service.rb
+++ b/app/services/process_mentions_service.rb
@@ -37,6 +37,9 @@ class ProcessMentionsService < BaseService
 
       mentioned_account = Account.find_remote(username, domain)
 
+      # Unapproved and unconfirmed accounts should not be mentionable
+      next if mentioned_account&.local? && !(mentioned_account.user_confirmed? && mentioned_account.user_approved?)
+
       # If the account cannot be found or isn't the right protocol,
       # first try to resolve it
       if mention_undeliverable?(mentioned_account)