about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorThibaut Girka <thib@sitedethib.com>2018-05-27 13:20:15 +0200
committerThibaut Girka <thib@sitedethib.com>2018-05-27 13:20:15 +0200
commit659b8a12ece7110608ee84748e57647c08d1dbda (patch)
tree1d8350cdad20ad1eb8c67a4d17a18ff7183f22e5 /app
parentc2e528916cae422baee3d72a3b4409a23c476b3f (diff)
parent63c7b9157274f57c496399a1a5c728b32415034c (diff)
Merge branch 'master' into glitch-soc/merge-upstream
Conflicts:
	config/locales/ca.yml
	config/locales/nl.yml
	config/locales/oc.yml
	config/locales/pt-BR.yml

Resolved conflicts by removing upstream-specific changes
Diffstat (limited to 'app')
-rw-r--r--app/controllers/application_controller.rb5
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json21
-rw-r--r--app/javascript/mastodon/locales/el.json114
-rw-r--r--app/javascript/mastodon/locales/eo.json10
-rw-r--r--app/javascript/mastodon/locales/eu.json430
-rw-r--r--app/javascript/mastodon/locales/fa.json88
-rw-r--r--app/javascript/mastodon/locales/fr.json8
-rw-r--r--app/javascript/mastodon/locales/it.json24
-rw-r--r--app/javascript/mastodon/locales/ja.json10
-rw-r--r--app/javascript/mastodon/locales/nl.json4
-rw-r--r--app/javascript/mastodon/locales/oc.json6
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json6
-rw-r--r--app/javascript/mastodon/locales/sv.json6
-rw-r--r--app/javascript/mastodon/service_worker/web_push_notifications.js20
-rw-r--r--app/javascript/styles/mastodon-light/diff.scss55
-rw-r--r--app/javascript/styles/mastodon-light/variables.scss7
-rw-r--r--app/javascript/styles/mastodon/accounts.scss4
-rw-r--r--app/javascript/styles/mastodon/components.scss9
-rw-r--r--app/javascript/styles/mastodon/variables.scss8
-rw-r--r--app/models/user.rb1
-rw-r--r--app/validators/email_mx_validator.rb25
21 files changed, 478 insertions, 383 deletions
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 27ebc3333..cc92894a5 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -21,6 +21,7 @@ class ApplicationController < ActionController::Base
   rescue_from ActionController::RoutingError, with: :not_found
   rescue_from ActiveRecord::RecordNotFound, with: :not_found
   rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity
+  rescue_from ActionController::UnknownFormat, with: :not_acceptable
   rescue_from Mastodon::NotPermittedError, with: :forbidden
 
   before_action :store_current_location, except: :raise_not_found, unless: :devise_controller?
@@ -143,6 +144,10 @@ class ApplicationController < ActionController::Base
     respond_with_error(422)
   end
 
+  def not_acceptable
+    respond_with_error(406)
+  end
+
   def single_user_mode?
     @single_user_mode ||= Rails.configuration.x.single_user_mode && Account.exists?
   end
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 48dd3d1e7..ef2a796a3 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -593,16 +593,21 @@
   {
     "descriptors": [
       {
-        "defaultMessage": "Local timeline",
-        "id": "column.community"
-      },
-      {
         "defaultMessage": "Toots",
         "id": "timeline.posts"
       },
       {
         "defaultMessage": "Media",
         "id": "timeline.media"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/community_timeline/components/section_headline.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Local timeline",
+        "id": "column.community"
       },
       {
         "defaultMessage": "The local timeline is empty. Write something publicly to get the ball rolling!",
@@ -1402,14 +1407,6 @@
         "id": "column.public"
       },
       {
-        "defaultMessage": "Toots",
-        "id": "timeline.posts"
-      },
-      {
-        "defaultMessage": "Media",
-        "id": "timeline.media"
-      },
-      {
         "defaultMessage": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
         "id": "empty_column.public"
       }
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 1e7707b4a..bb48fe93f 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -11,16 +11,16 @@
   "account.followers": "Ακόλουθοι",
   "account.follows": "Ακολουθεί",
   "account.follows_you": "Σε ακολουθεί",
-  "account.hide_reblogs": "Απόκρυψη προωθήσεων από τον/την @{name}",
+  "account.hide_reblogs": "Απόκρυψη προωθήσεων από @{name}",
   "account.media": "Πολυμέσα",
-  "account.mention": "Ανέφερε τον/την @{name}",
-  "account.moved_to": "{name} μετακόμισε στο:",
+  "account.mention": "Ανάφερε @{name}",
+  "account.moved_to": "{name} μεταφέρθηκε στο:",
   "account.mute": "Σώπασε τον/την @{name}",
   "account.mute_notifications": "Σώπασε τις ειδοποιήσεις από τον/την @{name}",
   "account.muted": "Αποσιωπημένος/η",
   "account.posts": "Τουτ",
   "account.posts_with_replies": "Τουτ και απαντήσεις",
-  "account.report": "Ανέφερε τον/την @{name}",
+  "account.report": "Κατάγγειλε τον/την @{name}",
   "account.requested": "Εκκρεμεί έγκριση. Κάνε κλικ για να ακυρώσεις το αίτημα ακολούθησης",
   "account.share": "Μοιράσου το προφίλ του/της @{name}",
   "account.show_reblogs": "Δείξε τις προωθήσεις του/της @{name}",
@@ -44,7 +44,7 @@
   "column.direct": "Απευθείας μηνύματα",
   "column.domain_blocks": "Κρυμμένοι τομείς",
   "column.favourites": "Αγαπημένα",
-  "column.follow_requests": "Αιτήματα παρακολούθησης",
+  "column.follow_requests": "Αιτήματα ακολούθησης",
   "column.home": "Αρχική",
   "column.lists": "Λίστες",
   "column.mutes": "Αποσιωπημένοι χρήστες",
@@ -60,9 +60,9 @@
   "column_header.unpin": "Ξεκαρφίτσωμα",
   "column_subheading.navigation": "Πλοήγηση",
   "column_subheading.settings": "Ρυθμίσεις",
-  "compose_form.direct_message_warning": "Αυτό το τουτ θα εμφανίζεται μόνο σε όλους τους αναφερόμενους χρήστες.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.hashtag_warning": "Αυτό το τουτ δεν θα εμφανίζεται κάτω από καμία ταμπέλα καθώς είναι αφανές. Μόνο τα δημόσια τουτ μπορούν να αναζητηθούν ανά ταμπέλα.",
+  "compose_form.direct_message_warning": "Αυτό το τουτ θα σταλεί μόνο στους αναφερόμενους χρήστες.",
+  "compose_form.direct_message_warning_learn_more": "Μάθετε περισσότερα",
+  "compose_form.hashtag_warning": "Αυτό το τουτ δεν θα εμφανίζεται κάτω από κανένα hashtag καθώς είναι αφανές. Μόνο τα δημόσια τουτ μπορούν να αναζητηθούν ανά hashtag.",
   "compose_form.lock_disclaimer": "Ο λογαριασμός σου δεν είναι {locked}. Οποιοσδήποτε μπορεί να σε ακολουθήσει για να δει τις δημοσιεύσεις σας προς τους ακολούθους σας.",
   "compose_form.lock_disclaimer.lock": "κλειδωμένος",
   "compose_form.placeholder": "Τι σκέφτεσαι;",
@@ -107,16 +107,16 @@
   "empty_column.hashtag": "Δεν υπάρχει ακόμα κάτι για αυτή την ταμπέλα.",
   "empty_column.home": "Η τοπική σου ροή είναι κενή! Πήγαινε στο {public} ή κάνε αναζήτηση για να ξεκινήσεις και να γνωρίσεις άλλους χρήστες.",
   "empty_column.home.public_timeline": "η δημόσια ροή",
-  "empty_column.list": "Δεν υπάρχει τίποτα σε αυτή τη λίστα ακόμα. Όταν τα μέλη της δημοσιεύσουν νέες καταστάσεις, θα εμφανιστούν εδώ",
+  "empty_column.list": "Δεν υπάρχει τίποτα σε αυτή τη λίστα ακόμα. Όταν τα μέλη της δημοσιεύσουν νέες καταστάσεις, θα εμφανιστούν εδώ.",
   "empty_column.notifications": "Δεν έχεις ειδοποιήσεις ακόμα. Αλληλεπίδρασε με άλλους χρήστες για να ξεκινήσεις την κουβέντα.",
-  "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλα instances για να το γεμίσεις",
+  "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλα instances για να τη γεμίσεις",
   "follow_request.authorize": "Ενέκρινε",
   "follow_request.reject": "Απέρριψε",
   "getting_started.appsshort": "Εφαρμογές",
   "getting_started.faq": "Συχνές Ερωτήσεις",
   "getting_started.heading": "Ξεκινώντας",
   "getting_started.open_source_notice": "Το Mastodon είναι ελεύθερο λογισμικό. Μπορείς να συνεισφέρεις ή να αναφέρεις ζητήματα στο GitHub στο {github}.",
-  "getting_started.userguide": "Οδηγός Χρηστών",
+  "getting_started.userguide": "Οδηγός Χρήσης",
   "home.column_settings.advanced": "Προχωρημένα",
   "home.column_settings.basic": "Βασικά",
   "home.column_settings.filter_regex": "Φιλτράρετε μέσω regular expressions",
@@ -139,58 +139,58 @@
   "keyboard_shortcuts.search": "για εστίαση αναζήτησης",
   "keyboard_shortcuts.toggle_hidden": "για εμφάνιση/απόκρυψη κειμένου πίσω από την προειδοποίηση",
   "keyboard_shortcuts.toot": "για δημιουργία ολοκαίνουριου τουτ",
-  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
-  "keyboard_shortcuts.up": "to move up in the list",
+  "keyboard_shortcuts.unfocus": "για την απο-εστίαση του πεδίου σύνθεσης/αναζήτησης",
+  "keyboard_shortcuts.up": "για να ανέβεις στη λίστα",
   "lightbox.close": "Close",
-  "lightbox.next": "Next",
-  "lightbox.previous": "Previous",
-  "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
+  "lightbox.next": "Επόμενο",
+  "lightbox.previous": "Προηγούμενο",
+  "lists.account.add": "Πρόσθεσε στη λίστα",
+  "lists.account.remove": "Αφαίρεσε από τη λίστα",
   "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
-  "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
-  "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.blocks": "Blocked users",
+  "lists.edit": "Τροποποίησε τη λίστα",
+  "lists.new.create": "Πρόσθεσε λίστα",
+  "lists.new.title_placeholder": "Τίτλος νέας λίστα",
+  "lists.search": "Αναζήτησε ανάμεσα σε όσους/όσες ακολουθείς",
+  "lists.subheading": "Οι λίστες σου",
+  "loading_indicator.label": "Φορτώνει...",
+  "media_gallery.toggle_visible": "Αντιστροφή ορατότητας",
+  "missing_indicator.label": "Δε βρέθηκε",
+  "missing_indicator.sublabel": "Αυτό το υλικό δε βρέθηκε",
+  "mute_modal.hide_notifications": "Απόκρυψη ειδοποιήσεων αυτού του χρήστη;",
+  "navigation_bar.blocks": "Αποκλεισμένοι χρήστες",
   "navigation_bar.community_timeline": "Local timeline",
-  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.direct": "Απευθείας μηνύματα",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
   "navigation_bar.favourites": "Favourites",
   "navigation_bar.follow_requests": "Follow requests",
   "navigation_bar.info": "Extended information",
-  "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
+  "navigation_bar.keyboard_shortcuts": "Συντομεύσεις πληκτρολογίου",
   "navigation_bar.lists": "Lists",
-  "navigation_bar.logout": "Logout",
+  "navigation_bar.logout": "Αποσύνδεση",
   "navigation_bar.mutes": "Muted users",
   "navigation_bar.pins": "Pinned toots",
-  "navigation_bar.preferences": "Preferences",
-  "navigation_bar.public_timeline": "Federated timeline",
-  "notification.favourite": "{name} favourited your status",
-  "notification.follow": "{name} followed you",
-  "notification.mention": "{name} mentioned you",
-  "notification.reblog": "{name} boosted your status",
+  "navigation_bar.preferences": "Προτιμήσεις",
+  "navigation_bar.public_timeline": "Ομοσπονδιακή ροή",
+  "notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου",
+  "notification.follow": "Ο/Η {name} σε ακολούθησε",
+  "notification.mention": "Ο/Η {name} σε ανέφερε",
+  "notification.reblog": "Ο/Η {name} προώθησε την κατάστασή σου",
   "notifications.clear": "Καθαρισμός ειδοποιήσεων",
-  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.clear_confirmation": "Σίγουρα θέλεις να καθαρίσεις όλες τις ειδοποιήσεις σου;",
   "notifications.column_settings.alert": "Desktop notifications",
-  "notifications.column_settings.favourite": "Favourites:",
-  "notifications.column_settings.follow": "New followers:",
-  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.favourite": "Αγαπημένα:",
+  "notifications.column_settings.follow": "Νέοι ακόλουθοι:",
+  "notifications.column_settings.mention": "Αναφορές:",
   "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.push_meta": "This device",
-  "notifications.column_settings.reblog": "Boosts:",
-  "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.push_meta": "Αυτή η συσκευή",
+  "notifications.column_settings.reblog": "Προωθήσεις:",
+  "notifications.column_settings.show": "Εμφάνισε σε στήλη",
+  "notifications.column_settings.sound": "Ηχητική ειδοποίηση",
   "notifications.group": "{count} notifications",
-  "onboarding.done": "Done",
-  "onboarding.next": "Next",
-  "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
+  "onboarding.done": "Έγινε",
+  "onboarding.next": "Επόμενο",
+  "onboarding.page_five.public_timelines": "Η τοπική ροή δείχνει τις δημόσιες δημοσιεύσεις από όσους εδρεύουν στον κόμβο {domain}. Η ομοσπονδιακή ροή δείχνει τις δημόσιες δημοσιεύσεις εκείνων που οι χρήστες του {domain} ακολουθούν. Αυτές οι είναι Δημόσιες Ροές, ένας ωραίος τρόπος να ανακαλύψεις καινούριους ανθρώπους.",
   "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
   "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
   "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
@@ -201,7 +201,7 @@
   "onboarding.page_six.almost_done": "Almost done...",
   "onboarding.page_six.appetoot": "Bon Appetoot!",
   "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
-  "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.github": "Το Mastodon είναι ελεύθερο λογισμικό. Μπορείς να αναφέρεις σφάλματα, να αιτηθείς νέες λειτουργίες ή να συνεισφέρεις κώδικα στο {github}.",
   "onboarding.page_six.guidelines": "community guidelines",
   "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
   "onboarding.page_six.various_app": "mobile apps",
@@ -227,13 +227,13 @@
   "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 instance moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.forward_hint": "Ο λογαριασμός είναι από διαφορετικό διακομιστή. Να σταλεί ανώνυμο αντίγραφο της καταγγελίας κι εκεί;",
+  "report.hint": "Η καταγγελία θα σταλεί στους διαχειριστές του κόμβου σου. Μπορείς να περιγράψεις γιατί καταγγέλεις το λογαριασμό παρακάτω:",
   "report.placeholder": "Additional comments",
   "report.submit": "Submit",
-  "report.target": "Report {target}",
+  "report.target": "Καταγγελία {target}",
   "search.placeholder": "Search",
-  "search_popout.search_format": "Advanced search format",
+  "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",
@@ -247,7 +247,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
-  "status.delete": "Delete",
+  "status.delete": "Διαγραφή",
   "status.direct": "Direct message @{name}",
   "status.embed": "Embed",
   "status.favourite": "Favourite",
@@ -265,7 +265,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
-  "status.report": "Report @{name}",
+  "status.report": "Καταγγελία @{name}",
   "status.sensitive_toggle": "Click to view",
   "status.sensitive_warning": "Sensitive content",
   "status.share": "Share",
@@ -275,7 +275,7 @@
   "status.show_more_all": "Show more for all",
   "status.unmute_conversation": "Unmute conversation",
   "status.unpin": "Unpin from profile",
-  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.federated_timeline": "Ομοσπονδιακή",
   "tabs_bar.home": "Home",
   "tabs_bar.local_timeline": "Local",
   "tabs_bar.notifications": "Notifications",
@@ -287,7 +287,7 @@
   "upload_button.label": "Add media",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
-  "upload_form.undo": "Undo",
+  "upload_form.undo": "Διαγραφή",
   "upload_progress.label": "Uploading...",
   "video.close": "Close video",
   "video.exit_fullscreen": "Exit full screen",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 04d9dc8d5..bb27099b7 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -60,8 +60,8 @@
   "column_header.unpin": "Depingli",
   "column_subheading.navigation": "Navigado",
   "column_subheading.settings": "Agordado",
-  "compose_form.direct_message_warning": "Tiu mesaĝo videblos nur por ĉiuj menciitaj uzantoj.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.direct_message_warning": "Tiu mesaĝo estos sendita nur al menciitaj uzantoj.",
+  "compose_form.direct_message_warning_learn_more": "Lerni pli",
   "compose_form.hashtag_warning": "Ĉi tiu mesaĝo ne estos listigita per ajna kradvorto. Nur publikaj mesaĝoj estas serĉeblaj per kradvortoj.",
   "compose_form.lock_disclaimer": "Via konta ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn, kiuj estas nur por sekvantoj.",
   "compose_form.lock_disclaimer.lock": "ŝlosita",
@@ -187,7 +187,7 @@
   "notifications.column_settings.reblog": "Diskonigoj:",
   "notifications.column_settings.show": "Montri en kolumno",
   "notifications.column_settings.sound": "Eligi sonon",
-  "notifications.group": "{count} notifications",
+  "notifications.group": "{count} sciigoj",
   "onboarding.done": "Farita",
   "onboarding.next": "Sekva",
   "onboarding.page_five.public_timelines": "La loka tempolinio montras publikajn mesaĝojn de ĉiuj en {domain}. La fratara tempolinio montras publikajn mesaĝojn de ĉiuj, kiuj estas sekvataj de homoj en {domain}. Tio estas la publikaj tempolinioj, kio estas bona maniero por malkovri novajn homojn.",
@@ -280,8 +280,8 @@
   "tabs_bar.local_timeline": "Loka tempolinio",
   "tabs_bar.notifications": "Sciigoj",
   "tabs_bar.search": "Serĉi",
-  "timeline.media": "Media",
-  "timeline.posts": "Toots",
+  "timeline.media": "Aŭdovidaĵoj",
+  "timeline.posts": "Mesaĝoj",
   "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.",
   "upload_area.title": "Altreni kaj lasi por alŝuti",
   "upload_button.label": "Aldoni aŭdovidaĵon",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index a6b1f8e83..636c51f6f 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -1,9 +1,9 @@
 {
   "account.badges.bot": "Bot",
   "account.block": "Blokeatu @{name}",
-  "account.block_domain": "{domain}(e)ko guztia ezkutatu",
+  "account.block_domain": "Ezkutatu {domain} domeinuko guztia",
   "account.blocked": "Blokeatuta",
-  "account.direct": "@{name}(e)ri mezu zuzena bidali",
+  "account.direct": "Mezu zuzena @{name} erabiltzaileari",
   "account.disclaimer_full": "Baliteke beheko informazioak erabiltzailearen profilaren zati bat baino ez erakustea.",
   "account.domain_blocked": "Ezkutatutako domeinua",
   "account.edit_profile": "Profila aldatu",
@@ -11,291 +11,291 @@
   "account.followers": "Jarraitzaileak",
   "account.follows": "Jarraitzen",
   "account.follows_you": "Jarraitzen dizu",
-  "account.hide_reblogs": "@{name}(e)k sustatutakoak ezkutatu",
+  "account.hide_reblogs": "Ezkutatu @{name} erabiltzailearen bultzadak",
   "account.media": "Media",
   "account.mention": "@{name} aipatu",
   "account.moved_to": "{name} hona lekualdatu da:",
   "account.mute": "@{name} isilarazi",
-  "account.mute_notifications": "@{name}(e)ren jakinarazpenak isilarazi",
+  "account.mute_notifications": "Mututu @{name} erabiltzailearen jakinarazpenak",
   "account.muted": "Isilarazita",
-  "account.posts": "Toots",
-  "account.posts_with_replies": "Toots and replies",
+  "account.posts": "Toot-ak",
+  "account.posts_with_replies": "Toot eta erantzunak",
   "account.report": "@{name} salatu",
   "account.requested": "Onarpenaren zain. Klikatu jarraitzeko eskaera ezeztatzeko",
   "account.share": "@{name}(e)ren profila elkarbanatu",
-  "account.show_reblogs": "@{name}(e)k sustatutakoak erakutsi",
-  "account.unblock": "@{name} desblokeatu",
+  "account.show_reblogs": "Erakutsi @{name} erabiltzailearen bultzadak",
+  "account.unblock": "Desblokeatu @{name}",
   "account.unblock_domain": "Berriz erakutsi {domain}",
   "account.unfollow": "Jarraitzeari utzi",
-  "account.unmute": "Unmute @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
-  "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",
+  "account.unmute": "Desmututu @{name}",
+  "account.unmute_notifications": "Desmututu @{name} erabiltzailearen jakinarazpenak",
+  "account.view_full_profile": "Ikusi profil osoa",
+  "alert.unexpected.message": "Ustekabeko errore bat gertatu da.",
+  "alert.unexpected.title": "Ene!",
+  "boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko",
+  "bundle_column_error.body": "Zerbait okerra gertatu da osagai hau kargatzean.",
+  "bundle_column_error.retry": "Saiatu berriro",
   "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.domain_blocks": "Hidden domains",
-  "column.favourites": "Favourites",
-  "column.follow_requests": "Follow requests",
+  "bundle_modal_error.close": "Itxi",
+  "bundle_modal_error.message": "Zerbait okerra gertatu da osagai hau kargatzean.",
+  "bundle_modal_error.retry": "Saiatu berriro",
+  "column.blocks": "Blokeatutako erabiltzaileak",
+  "column.community": "Denbora-lerro lokala",
+  "column.direct": "Mezu zuzenak",
+  "column.domain_blocks": "Domeinu ezkutuak",
+  "column.favourites": "Gogokoak",
+  "column.follow_requests": "Jarraitzeko eskariak",
   "column.home": "Home",
-  "column.lists": "Lists",
-  "column.mutes": "Muted users",
-  "column.notifications": "Notifications",
+  "column.lists": "Zerrendak",
+  "column.mutes": "Mutututako erabiltzaileak",
+  "column.notifications": "Jakinarazpenak",
   "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.public": "Federatutako denbora-lerroa",
+  "column_back_button.label": "Atzera",
+  "column_header.hide_settings": "Ezkutatu ezarpenak",
+  "column_header.moveLeft_settings": "Eraman zutabea ezkerrera",
+  "column_header.moveRight_settings": "Eraman zutabea eskuinera",
+  "column_header.pin": "Finkatu",
+  "column_header.show_settings": "Erakutsi ezarpenak",
+  "column_header.unpin": "Desfinkatu",
   "column_subheading.navigation": "Navigation",
-  "column_subheading.settings": "Settings",
-  "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.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?",
+  "column_subheading.settings": "Ezarpenak",
+  "compose_form.direct_message_warning": "Toot hau aipatutako erabiltzaileei besterik ez zaie bidaliko.",
+  "compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
+  "compose_form.hashtag_warning": "Toot hau ez da traoletan agertuko zerrendatu gabekoa baita. Traoletan toot publikoak besterik ez dira agertzen.",
+  "compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren mezuak ikusteko.",
+  "compose_form.lock_disclaimer.lock": "blokeatuta",
+  "compose_form.placeholder": "Zer duzu buruan?",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "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",
+  "compose_form.sensitive.marked": "Multimedia mingarri gisa markatu da",
+  "compose_form.sensitive.unmarked": "Multimedia ez da mingarri gisa markatu",
+  "compose_form.spoiler.marked": "Testua abisu batek ezkutatzen du",
+  "compose_form.spoiler.unmarked": "Testua ez dago ezkutatuta",
+  "compose_form.spoiler_placeholder": "Idatzi zure abisua hemen",
+  "confirmation_modal.cancel": "Utzi",
   "confirmations.block.confirm": "Block",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.block.message": "Ziur {name} blokeatu nahi duzula?",
   "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.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?",
+  "confirmations.domain_block.confirm": "Ezkutatu domeinu osoa",
   "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.",
-  "confirmations.mute.confirm": "Mute",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "confirmations.mute.confirm": "Mututu",
+  "confirmations.mute.message": "Ziur {name} mututu nahi duzula?",
+  "confirmations.unfollow.confirm": "Utzi jarraitzeari",
+  "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?",
   "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",
+  "embed.preview": "Hau da izango duen itxura:",
+  "emoji_button.activity": "Jarduera",
+  "emoji_button.custom": "Pertsonalizatua",
+  "emoji_button.flags": "Banderak",
+  "emoji_button.food": "Janari eta edaria",
   "emoji_button.label": "Insert emoji",
-  "emoji_button.nature": "Nature",
+  "emoji_button.nature": "Natura",
   "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": "Objektuak",
+  "emoji_button.people": "Jendea",
+  "emoji_button.recent": "Maiz erabiliak",
+  "emoji_button.search": "Bilatu...",
+  "emoji_button.search_results": "Bilaketaren emaitzak",
+  "emoji_button.symbols": "Sinboloak",
+  "emoji_button.travel": "Bidaiak eta tokiak",
   "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.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.hashtag": "Ez dago ezer traola honetan oraindik.",
   "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": "denbora-lerro publikoa",
   "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
   "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 instances to fill it up",
-  "follow_request.authorize": "Authorize",
-  "follow_request.reject": "Reject",
-  "getting_started.appsshort": "Apps",
+  "follow_request.authorize": "Baimendu",
+  "follow_request.reject": "Ukatu",
+  "getting_started.appsshort": "Aplikazioak",
   "getting_started.faq": "FAQ",
-  "getting_started.heading": "Getting started",
+  "getting_started.heading": "Lehen urratsak",
   "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
-  "getting_started.userguide": "User Guide",
-  "home.column_settings.advanced": "Advanced",
-  "home.column_settings.basic": "Basic",
-  "home.column_settings.filter_regex": "Filter out by regular expressions",
-  "home.column_settings.show_reblogs": "Show boosts",
-  "home.column_settings.show_replies": "Show replies",
-  "home.settings": "Column settings",
-  "keyboard_shortcuts.back": "to navigate back",
-  "keyboard_shortcuts.boost": "to boost",
+  "getting_started.userguide": "Erabiltzaile gida",
+  "home.column_settings.advanced": "Aurreratua",
+  "home.column_settings.basic": "Oinarrizkoa",
+  "home.column_settings.filter_regex": "Iragazi adierazpen erregularren bidez",
+  "home.column_settings.show_reblogs": "Erakutsi bultzadak",
+  "home.column_settings.show_replies": "Erakutsi erantzunak",
+  "home.settings": "Zutabearen ezarpenak",
+  "keyboard_shortcuts.back": "atzera nabigatzeko",
+  "keyboard_shortcuts.boost": "bultzada ematea",
   "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.down": "to move down in the list",
+  "keyboard_shortcuts.down": "zerrendan behera mugitzea",
   "keyboard_shortcuts.enter": "to open status",
-  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourite": "gogoko egitea",
   "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.hotkey": "Hotkey",
-  "keyboard_shortcuts.legend": "to display this legend",
-  "keyboard_shortcuts.mention": "to mention author",
-  "keyboard_shortcuts.reply": "to reply",
-  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.hotkey": "Laster-tekla",
+  "keyboard_shortcuts.legend": "legenda hau bistaratzea",
+  "keyboard_shortcuts.mention": "egilea aipatzea",
+  "keyboard_shortcuts.reply": "erantzutea",
+  "keyboard_shortcuts.search": "bilaketan fokua jartzea",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
-  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.toot": "toot berria hastea",
   "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",
-  "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
+  "keyboard_shortcuts.up": "zerrendan gora mugitzea",
+  "lightbox.close": "Itxi",
+  "lightbox.next": "Hurrengoa",
+  "lightbox.previous": "Aurrekoa",
+  "lists.account.add": "Gehitu zerrendara",
+  "lists.account.remove": "Kendu zerrendatik",
   "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
-  "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
-  "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.blocks": "Blocked users",
-  "navigation_bar.community_timeline": "Local timeline",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.domain_blocks": "Hidden domains",
-  "navigation_bar.edit_profile": "Edit profile",
-  "navigation_bar.favourites": "Favourites",
-  "navigation_bar.follow_requests": "Follow requests",
+  "lists.edit": "Editatu zerrenda",
+  "lists.new.create": "Gehitu zerrenda",
+  "lists.new.title_placeholder": "Zerrenda berriaren izena",
+  "lists.search": "Bilatu jarraitzen dituzun pertsonen artean",
+  "lists.subheading": "Zure zerrendak",
+  "loading_indicator.label": "Kargatzen...",
+  "media_gallery.toggle_visible": "Txandakatu ikusgaitasuna",
+  "missing_indicator.label": "Ez aurkitua",
+  "missing_indicator.sublabel": "Baliabide hau ezin izan da aurkitu",
+  "mute_modal.hide_notifications": "Ezkutatu erabiltzaile honen jakinarazpenak?",
+  "navigation_bar.blocks": "Blokeatutako erabiltzaileak",
+  "navigation_bar.community_timeline": "Denbora-lerro lokala",
+  "navigation_bar.direct": "Mezu zuzenak",
+  "navigation_bar.domain_blocks": "Domeinu ezkutuak",
+  "navigation_bar.edit_profile": "Editatu profila",
+  "navigation_bar.favourites": "Gogokoak",
+  "navigation_bar.follow_requests": "Jarraitzeko eskariak",
   "navigation_bar.info": "Extended information",
-  "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
-  "navigation_bar.lists": "Lists",
-  "navigation_bar.logout": "Logout",
-  "navigation_bar.mutes": "Muted users",
-  "navigation_bar.pins": "Pinned toots",
-  "navigation_bar.preferences": "Preferences",
-  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.keyboard_shortcuts": "Teklatu laster-bideak",
+  "navigation_bar.lists": "Zerrendak",
+  "navigation_bar.logout": "Amaitu saioa",
+  "navigation_bar.mutes": "Mutututako erabiltzaileak",
+  "navigation_bar.pins": "Finkatutako toot-ak",
+  "navigation_bar.preferences": "Hobespenak",
+  "navigation_bar.public_timeline": "Federatutako denbora-lerroa",
   "notification.favourite": "{name} favourited your status",
-  "notification.follow": "{name} followed you",
-  "notification.mention": "{name} mentioned you",
+  "notification.follow": "{name} erabiltzaileak jarraitzen zaitu",
+  "notification.mention": "{name} erabiltzaileak aipatu zaitu",
   "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.follow": "New followers:",
-  "notifications.column_settings.mention": "Mentions:",
-  "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.push_meta": "This device",
-  "notifications.column_settings.reblog": "Boosts:",
-  "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
-  "notifications.group": "{count} notifications",
-  "onboarding.done": "Done",
-  "onboarding.next": "Next",
+  "notifications.clear": "Garbitu jakinarazpenak",
+  "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?",
+  "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
+  "notifications.column_settings.favourite": "Gogokoak:",
+  "notifications.column_settings.follow": "Jarraitzaile berriak:",
+  "notifications.column_settings.mention": "Aipamenak:",
+  "notifications.column_settings.push": "Push jakinarazpenak",
+  "notifications.column_settings.push_meta": "Gailu hau",
+  "notifications.column_settings.reblog": "Bultzadak:",
+  "notifications.column_settings.show": "Erakutsi zutabean",
+  "notifications.column_settings.sound": "Jo soinua",
+  "notifications.group": "{count} jakinarazpen",
+  "onboarding.done": "Egina",
+  "onboarding.next": "Hurrengoa",
   "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
-  "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
-  "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
+  "onboarding.page_four.home": "Hasierako denbora-lerroak jarraitzen duzun jendearen mezuak erakusten ditu.",
+  "onboarding.page_four.notifications": "Jakinarazpenen  zutabeak besteek zurekin hasitako hartu-emanak erakusten ditu.",
   "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
-  "onboarding.page_one.full_handle": "Your full handle",
-  "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.",
-  "onboarding.page_one.welcome": "Welcome to Mastodon!",
-  "onboarding.page_six.admin": "Your instance's admin is {admin}.",
-  "onboarding.page_six.almost_done": "Almost done...",
+  "onboarding.page_one.full_handle": "Zure erabiltzaile-izen osoa",
+  "onboarding.page_one.handle_hint": "Hau da zure lagunei zu aurkitzeko emango zeniena.",
+  "onboarding.page_one.welcome": "Ongi etorri Mastodon-era!",
+  "onboarding.page_six.admin": "Zure instantziaren administratzailea {admin} da.",
+  "onboarding.page_six.almost_done": "Ia eginda...",
   "onboarding.page_six.appetoot": "Bon Appetoot!",
-  "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
+  "onboarding.page_six.apps_available": "{apps} eskuragarri daude iOS, Android eta beste plataformetarako.",
   "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
-  "onboarding.page_six.guidelines": "community guidelines",
-  "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
-  "onboarding.page_six.various_app": "mobile apps",
+  "onboarding.page_six.guidelines": "komunitatearen gida-lerroak",
+  "onboarding.page_six.read_guidelines": "Irakurri {domain} {guidelines} mesedez!",
+  "onboarding.page_six.various_app": "mugikorrerako aplikazioak",
   "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
   "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
   "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
-  "onboarding.skip": "Skip",
+  "onboarding.skip": "Saltatu",
   "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.direct.long": "Bidali aipatutako erabiltzaileei besterik ez",
+  "privacy.direct.short": "Zuzena",
+  "privacy.private.long": "Bidali jarraitzaileei besterik ez",
+  "privacy.private.short": "Jarraitzaileak soilik",
+  "privacy.public.long": "Bistaratu denbora-lerro publikoetan",
+  "privacy.public.short": "Publikoa",
   "privacy.unlisted.long": "Do not show in public timelines",
-  "privacy.unlisted.short": "Unlisted",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "privacy.unlisted.short": "Zerrendatu gabea",
+  "regeneration_indicator.label": "Kargatzen…",
+  "regeneration_indicator.sublabel": "Zure hasiera-jarioa prestatzen ari da!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
+  "relative_time.just_now": "orain",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
-  "reply_indicator.cancel": "Cancel",
-  "report.forward": "Forward to {target}",
+  "reply_indicator.cancel": "Utzi",
+  "report.forward": "Birbidali hona: {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 instance moderators. You can provide an explanation of why you are reporting this account below:",
-  "report.placeholder": "Additional comments",
+  "report.placeholder": "Iruzkin gehigarriak",
   "report.submit": "Submit",
   "report.target": "Report {target}",
-  "search.placeholder": "Search",
-  "search_popout.search_format": "Advanced search format",
+  "search.placeholder": "Bilatu",
+  "search_popout.search_format": "Bilaketa aurreratuaren formatua",
   "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": "traola",
   "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": "erabiltzailea",
+  "search_results.accounts": "Jendea",
+  "search_results.hashtags": "Traolak",
+  "search_results.statuses": "Toot-ak",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
+  "standalone.public_title": "Begiradatxo bat...",
   "status.block": "Block @{name}",
-  "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "This post cannot be boosted",
+  "status.cancel_reblog_private": "Kendu bultzada",
+  "status.cannot_reblog": "Mezu honi ezin zaio bultzada eman",
   "status.delete": "Delete",
-  "status.direct": "Direct message @{name}",
-  "status.embed": "Embed",
-  "status.favourite": "Favourite",
-  "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.direct": "Mezu zuzena @{name} erabiltzaileari",
+  "status.embed": "Txertatu",
+  "status.favourite": "Gogokoa",
+  "status.load_more": "Kargatu gehiago",
+  "status.media_hidden": "Multimedia ezkutatua",
+  "status.mention": "Aipatu @{name}",
+  "status.more": "Gehiago",
+  "status.mute": "Mututu @{name}",
+  "status.mute_conversation": "Mututu elkarrizketa",
   "status.open": "Expand this status",
-  "status.pin": "Pin on profile",
-  "status.pinned": "Pinned toot",
-  "status.reblog": "Boost",
-  "status.reblog_private": "Boost to original audience",
-  "status.reblogged_by": "{name} boosted",
-  "status.reply": "Reply",
-  "status.replyAll": "Reply to thread",
+  "status.pin": "Finkatu profilean",
+  "status.pinned": "Finkatutako toot-a",
+  "status.reblog": "Bultzada",
+  "status.reblog_private": "Bultzada jatorrizko hartzaileei",
+  "status.reblogged_by": "{name} erabiltzailearen bultzada",
+  "status.reply": "Erantzun",
+  "status.replyAll": "Erantzun harian",
   "status.report": "Report @{name}",
   "status.sensitive_toggle": "Click to view",
-  "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.unmute_conversation": "Unmute conversation",
-  "status.unpin": "Unpin from profile",
-  "tabs_bar.federated_timeline": "Federated",
+  "status.sensitive_warning": "Eduki mingarria",
+  "status.share": "Partekatu",
+  "status.show_less": "Erakutsi gutxiago",
+  "status.show_less_all": "Erakutsi denetarik gutxiago",
+  "status.show_more": "Erakutsi gehiago",
+  "status.show_more_all": "Erakutsi denetarik gehiago",
+  "status.unmute_conversation": "Desmututu elkarrizketa",
+  "status.unpin": "Desfinkatu profiletik",
+  "tabs_bar.federated_timeline": "Federatua",
   "tabs_bar.home": "Home",
   "tabs_bar.local_timeline": "Local",
-  "tabs_bar.notifications": "Notifications",
-  "tabs_bar.search": "Search",
+  "tabs_bar.notifications": "Jakinarazpenak",
+  "tabs_bar.search": "Bilatu",
   "timeline.media": "Media",
-  "timeline.posts": "Toots",
-  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
-  "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add media",
-  "upload_form.description": "Describe for the visually impaired",
-  "upload_form.focus": "Crop",
-  "upload_form.undo": "Undo",
-  "upload_progress.label": "Uploading...",
-  "video.close": "Close video",
-  "video.exit_fullscreen": "Exit full screen",
-  "video.expand": "Expand video",
+  "timeline.posts": "Toot-ak",
+  "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.",
+  "upload_area.title": "Arrastatu eta jaregin igotzeko",
+  "upload_button.label": "Gehitu multimedia",
+  "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat",
+  "upload_form.focus": "Moztu",
+  "upload_form.undo": "Ezabatu",
+  "upload_progress.label": "Igotzen...",
+  "video.close": "Itxi bideoa",
+  "video.exit_fullscreen": "Irten pantaila osotik",
+  "video.expand": "Hedatu bideoa",
   "video.fullscreen": "Full screen",
-  "video.hide": "Hide video",
-  "video.mute": "Mute sound",
+  "video.hide": "Ezkutatu bideoa",
+  "video.mute": "Mututu soinua",
   "video.pause": "Pause",
-  "video.play": "Play",
-  "video.unmute": "Unmute sound"
+  "video.play": "Jo",
+  "video.unmute": "Desmututu soinua"
 }
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index c45277d82..6c0f34a11 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -1,9 +1,9 @@
 {
-  "account.badges.bot": "Bot",
+  "account.badges.bot": "ربات",
   "account.block": "مسدودسازی @{name}",
   "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}",
   "account.blocked": "مسدودشده",
-  "account.direct": "Direct message @{name}",
+  "account.direct": "پیغام خصوصی به @{name}",
   "account.disclaimer_full": "اطلاعات زیر ممکن است نمایهٔ این کاربر را به تمامی نشان ندهد.",
   "account.domain_blocked": "دامین پنهان‌شده",
   "account.edit_profile": "ویرایش نمایه",
@@ -12,7 +12,7 @@
   "account.follows": "پی می‌گیرد",
   "account.follows_you": "پیگیر شماست",
   "account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}",
-  "account.media": "رسانه",
+  "account.media": "عکس و ویدیو",
   "account.mention": "نام‌بردن از @{name}",
   "account.moved_to": "{name} منتقل شده است به:",
   "account.mute": "بی‌صدا کردن @{name}",
@@ -30,8 +30,8 @@
   "account.unmute": "باصدا کردن @{name}",
   "account.unmute_notifications": "باصداکردن اعلان‌ها از طرف @{name}",
   "account.view_full_profile": "نمایش نمایهٔ کامل",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
+  "alert.unexpected.message": "خطای پیش‌بینی‌نشده‌ای رخ داد.",
+  "alert.unexpected.title": "ای وای!",
   "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید",
   "bundle_column_error.body": "هنگام بازکردن این بخش خطایی رخ داد.",
   "bundle_column_error.retry": "تلاش دوباره",
@@ -41,8 +41,8 @@
   "bundle_modal_error.retry": "تلاش دوباره",
   "column.blocks": "کاربران مسدودشده",
   "column.community": "نوشته‌های محلی",
-  "column.direct": "Direct messages",
-  "column.domain_blocks": "Hidden domains",
+  "column.direct": "پیغام‌های خصوصی",
+  "column.domain_blocks": "دامین‌های پنهان‌شده",
   "column.favourites": "پسندیده‌ها",
   "column.follow_requests": "درخواست‌های پیگیری",
   "column.home": "خانه",
@@ -60,18 +60,18 @@
   "column_header.unpin": "رهاکردن",
   "column_subheading.navigation": "گشت و گذار",
   "column_subheading.settings": "تنظیمات",
-  "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.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.direct_message_warning": "این بوق تنها به کاربرانی که از آن‌ها نام برده شده فرستاده خواهد شد.",
+  "compose_form.direct_message_warning_learn_more": "بیشتر بدانید",
+  "compose_form.hashtag_warning": "از آن‌جا که این بوق فهرست‌نشده است، در نتایج جستجوی هشتگ‌ها پیدا نخواهد شد. تنها بوق‌های عمومی را می‌توان با جستجوی هشتگ پیدا کرد.",
   "compose_form.lock_disclaimer": "حساب شما {locked} نیست. هر کسی می‌تواند پیگیر شما شود و نوشته‌های ویژهٔ پیگیران شما را ببیند.",
   "compose_form.lock_disclaimer.lock": "قفل",
   "compose_form.placeholder": "تازه چه خبر؟",
   "compose_form.publish": "بوق",
   "compose_form.publish_loud": "{publish}!",
-  "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.marked": "این تصویر به عنوان حساس علامت‌گذاری شده",
+  "compose_form.sensitive.unmarked": "این تصویر به عنوان حساس علامت‌گذاری نشده",
+  "compose_form.spoiler.marked": "نوشته پشت هشدار محتوا پنهان است",
+  "compose_form.spoiler.unmarked": "نوشته پنهان نیست",
   "compose_form.spoiler_placeholder": "هشدار محتوا",
   "confirmation_modal.cancel": "بی‌خیال",
   "confirmations.block.confirm": "مسدود کن",
@@ -103,7 +103,7 @@
   "emoji_button.symbols": "نمادها",
   "emoji_button.travel": "سفر و مکان",
   "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.hashtag": "هنوز هیچ چیزی با این هشتگ نیست.",
   "empty_column.home": "شما هنوز پیگیر کسی نیستید. {public} را ببینید یا چیزی را جستجو کنید تا کاربران دیگر را ببینید.",
   "empty_column.home.public_timeline": "فهرست نوشته‌های همه‌جا",
@@ -119,7 +119,7 @@
   "getting_started.userguide": "راهنمای کاربری",
   "home.column_settings.advanced": "پیشرفته",
   "home.column_settings.basic": "اصلی",
-  "home.column_settings.filter_regex": "با عبارت‌های باقاعده فیلتر کنید",
+  "home.column_settings.filter_regex": "با عبارت‌های باقاعده (regexp) فیلتر کنید",
   "home.column_settings.show_reblogs": "نمایش بازبوق‌ها",
   "home.column_settings.show_replies": "نمایش پاسخ‌ها",
   "home.settings": "تنظیمات ستون",
@@ -155,12 +155,12 @@
   "loading_indicator.label": "بارگیری...",
   "media_gallery.toggle_visible": "تغییر پیدایی",
   "missing_indicator.label": "پیدا نشد",
-  "missing_indicator.sublabel": "This resource could not be found",
+  "missing_indicator.sublabel": "این منبع پیدا نشد",
   "mute_modal.hide_notifications": "اعلان‌های این کاربر پنهان شود؟",
   "navigation_bar.blocks": "کاربران مسدودشده",
   "navigation_bar.community_timeline": "نوشته‌های محلی",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.direct": "پیغام‌های خصوصی",
+  "navigation_bar.domain_blocks": "دامین‌های پنهان‌شده",
   "navigation_bar.edit_profile": "ویرایش نمایه",
   "navigation_bar.favourites": "پسندیده‌ها",
   "navigation_bar.follow_requests": "درخواست‌های پیگیری",
@@ -187,15 +187,15 @@
   "notifications.column_settings.reblog": "بازبوق‌ها:",
   "notifications.column_settings.show": "نمایش در ستون",
   "notifications.column_settings.sound": "پخش صدا",
-  "notifications.group": "{count} notifications",
+  "notifications.group": "{count} اعلان",
   "onboarding.done": "پایان",
   "onboarding.next": "بعدی",
   "onboarding.page_five.public_timelines": "نوشته‌های محلی یعنی نوشته‌های همهٔ کاربران {domain}. نوشته‌های همه‌جا یعنی نوشته‌های همهٔ کسانی که کاربران {domain} آن‌ها را پی می‌گیرند. این فهرست‌های عمومی راه خوبی برای یافتن کاربران تازه هستند.",
   "onboarding.page_four.home": "ستون «خانه» نوشته‌های کسانی را نشان می‌دهد که شما پی می‌گیرید.",
   "onboarding.page_four.notifications": "ستون «اعلان‌ها» ارتباط‌های شما با دیگران را نشان می‌دهد.",
   "onboarding.page_one.federation": "ماستدون شبکه‌ای از سرورهای مستقل است که با پیوستن به یکدیگر یک شبکهٔ اجتماعی بزرگ را تشکیل می‌دهند.",
-  "onboarding.page_one.full_handle": "Your full handle",
-  "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.",
+  "onboarding.page_one.full_handle": "شناسهٔ کاربری کامل شما",
+  "onboarding.page_one.handle_hint": "این چیزی است که باید به دوستان خود بگویید تا بتوانند شما را پیدا کنند.",
   "onboarding.page_one.welcome": "به ماستدون خوش آمدید!",
   "onboarding.page_six.admin": "نشانی مسئول سرور شما {admin} است.",
   "onboarding.page_six.almost_done": "الان تقریباً آماده‌اید...",
@@ -218,50 +218,50 @@
   "privacy.public.short": "عمومی",
   "privacy.unlisted.long": "عمومی، ولی فهرست نکن",
   "privacy.unlisted.short": "فهرست‌نشده",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "regeneration_indicator.label": "در حال باز شدن…",
+  "regeneration_indicator.sublabel": "این فهرست دارد آماده می‌شود!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "الان",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "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 instance moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.forward": "فرستادن به {target}",
+  "report.forward_hint": "این حساب در سرور دیگری ثبت شده. آیا می‌خواهید رونوشتی از این گزارش به طور ناشناس به آن‌جا هم فرستاده شود؟",
+  "report.hint": "این گزارش به مدیران سرور شما فرستاده خواهد شد. می‌توانید دلیل گزارش‌دادن این حساب را در این‌جا بنویسید:",
   "report.placeholder": "توضیح اضافه",
   "report.submit": "بفرست",
   "report.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.full_text": "جستجوی متنی ساده می‌تواند بوق‌هایی که شما نوشته‌اید، پسندیده‌اید، بازبوقیده‌اید، یا در آن‌ها از شما نام برده شده است را پیدا کند. همچنین نام‌های کاربری، نام نمایش‌یافته، و هشتگ‌ها را هم شامل می‌شود.",
   "search_popout.tips.hashtag": "هشتگ",
   "search_popout.tips.status": "نوشته",
   "search_popout.tips.text": "جستجوی متنی ساده برای نام‌ها، نام‌های کاربری، و هشتگ‌ها",
   "search_popout.tips.user": "کاربر",
-  "search_results.accounts": "People",
-  "search_results.hashtags": "Hashtags",
-  "search_results.statuses": "Toots",
+  "search_results.accounts": "افراد",
+  "search_results.hashtags": "هشتگ‌ها",
+  "search_results.statuses": "بوق‌ها",
   "search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
   "standalone.public_title": "نگاهی به کاربران این سرور...",
-  "status.block": "Block @{name}",
-  "status.cancel_reblog_private": "Unboost",
+  "status.block": "مسدودسازی @{name}",
+  "status.cancel_reblog_private": "حذف بازبوق",
   "status.cannot_reblog": "این نوشته را نمی‌شود بازبوقید",
   "status.delete": "پاک‌کردن",
-  "status.direct": "Direct message @{name}",
+  "status.direct": "پیغام مستقیم به @{name}",
   "status.embed": "جاگذاری",
   "status.favourite": "پسندیدن",
   "status.load_more": "بیشتر نشان بده",
   "status.media_hidden": "تصویر پنهان شده",
   "status.mention": "نام‌بردن از @{name}",
   "status.more": "بیشتر",
-  "status.mute": "Mute @{name}",
+  "status.mute": "بی‌صدا کردن @{name}",
   "status.mute_conversation": "بی‌صداکردن گفتگو",
   "status.open": "این نوشته را باز کن",
   "status.pin": "نوشتهٔ ثابت نمایه",
-  "status.pinned": "Pinned toot",
+  "status.pinned": "بوق ثابت",
   "status.reblog": "بازبوقیدن",
-  "status.reblog_private": "Boost to original audience",
+  "status.reblog_private": "بازبوق به مخاطبان اولیه",
   "status.reblogged_by": "‫{name}‬ بازبوقید",
   "status.reply": "پاسخ",
   "status.replyAll": "به نوشته پاسخ دهید",
@@ -270,24 +270,24 @@
   "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.unmute_conversation": "باصداکردن گفتگو",
   "status.unpin": "برداشتن نوشتهٔ ثابت نمایه",
   "tabs_bar.federated_timeline": "همگانی",
   "tabs_bar.home": "خانه",
   "tabs_bar.local_timeline": "محلی",
   "tabs_bar.notifications": "اعلان‌ها",
-  "tabs_bar.search": "Search",
-  "timeline.media": "Media",
-  "timeline.posts": "Toots",
+  "tabs_bar.search": "جستجو",
+  "timeline.media": "عکس و ویدیو",
+  "timeline.posts": "بوق‌ها",
   "ui.beforeunload": "اگر از ماستدون خارج شوید پیش‌نویس شما پاک خواهد شد.",
   "upload_area.title": "برای بارگذاری به این‌جا بکشید",
   "upload_button.label": "افزودن تصویر",
   "upload_form.description": "نوشتهٔ توضیحی برای کم‌بینایان و نابینایان",
-  "upload_form.focus": "Crop",
-  "upload_form.undo": "واگردانی",
+  "upload_form.focus": "بریدن لبه‌ها",
+  "upload_form.undo": "حذف",
   "upload_progress.label": "بارگذاری...",
   "video.close": "بستن ویدیو",
   "video.exit_fullscreen": "خروج از حالت تمام صفحه",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 4c2bd39ca..24b771efa 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -3,7 +3,7 @@
   "account.block": "Bloquer @{name}",
   "account.block_domain": "Tout masquer venant de {domain}",
   "account.blocked": "Bloqué",
-  "account.direct": "Message direct @{name}",
+  "account.direct": "Message direct à @{name}",
   "account.disclaimer_full": "Les données ci-dessous peuvent ne pas refléter ce profil dans sa totalité.",
   "account.domain_blocked": "Domaine caché",
   "account.edit_profile": "Modifier le profil",
@@ -61,7 +61,7 @@
   "column_subheading.navigation": "Navigation",
   "column_subheading.settings": "Paramètres",
   "compose_form.direct_message_warning": "Ce pouet sera uniquement envoyé qu'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": "Learn more",
+  "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é",
@@ -248,7 +248,7 @@
   "status.cancel_reblog_private": "Dé-booster",
   "status.cannot_reblog": "Cette publication ne peut être boostée",
   "status.delete": "Effacer",
-  "status.direct": "Message direct @{name}",
+  "status.direct": "Message direct à @{name}",
   "status.embed": "Intégrer",
   "status.favourite": "Ajouter aux favoris",
   "status.load_more": "Charger plus",
@@ -281,7 +281,7 @@
   "tabs_bar.notifications": "Notifications",
   "tabs_bar.search": "Chercher",
   "timeline.media": "Media",
-  "timeline.posts": "Toots",
+  "timeline.posts": "Pouets",
   "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.",
   "upload_area.title": "Glissez et déposez pour envoyer",
   "upload_button.label": "Joindre un média",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 485fe0fad..cc0551b14 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -19,7 +19,7 @@
   "account.mute_notifications": "Silenzia notifiche da @{name}",
   "account.muted": "Silenziato",
   "account.posts": "Toot",
-  "account.posts_with_replies": "Toot con risposte",
+  "account.posts_with_replies": "Toot e risposte",
   "account.report": "Segnala @{name}",
   "account.requested": "In attesa di approvazione",
   "account.share": "Condividi il profilo di @{name}",
@@ -33,7 +33,7 @@
   "alert.unexpected.message": "Si è verificato un errore inatteso.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio la prossima volta",
-  "bundle_column_error.body": "C'è stato un errore mentre questo componente veniva caricato.",
+  "bundle_column_error.body": "E' avvenuto un errore durante il caricamento di questo componente.",
   "bundle_column_error.retry": "Riprova",
   "bundle_column_error.title": "Network error",
   "bundle_modal_error.close": "Chiudi",
@@ -60,8 +60,8 @@
   "column_header.unpin": "Non fissare in cima",
   "column_subheading.navigation": "Navigation",
   "column_subheading.settings": "Impostazioni",
-  "compose_form.direct_message_warning": "Questo toot sarà visibile solo a tutti gli utenti citati.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.direct_message_warning": "Questo toot sarà mandato solo a tutti gli utenti menzionati.",
+  "compose_form.direct_message_warning_learn_more": "Per saperne di piu'",
   "compose_form.hashtag_warning": "Questo toot non è listato, quindi non sarà trovato nelle ricerche per hashtag. Solo i toot pubblici possono essere cercati per hashtag.",
   "compose_form.lock_disclaimer": "Il tuo account non è {bloccato}. Chiunque può decidere di seguirti per vedere i tuoi post per soli seguaci.",
   "compose_form.lock_disclaimer.lock": "bloccato",
@@ -84,7 +84,7 @@
   "confirmations.domain_block.message": "Sei davvero sicuro che vuoi bloccare l'intero {domain}? Nella maggior parte dei casi, pochi blocchi o silenziamenti mirati sono sufficienti e preferibili.",
   "confirmations.mute.confirm": "Silenzia",
   "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?",
-  "confirmations.unfollow.confirm": "Non seguire più",
+  "confirmations.unfollow.confirm": "Smetti di seguire",
   "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?",
   "embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.",
   "embed.preview": "Ecco come apparirà:",
@@ -94,7 +94,7 @@
   "emoji_button.food": "Cibo e bevande",
   "emoji_button.label": "Inserisci emoji",
   "emoji_button.nature": "Natura",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "Nessun emojos!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Oggetti",
   "emoji_button.people": "Persone",
   "emoji_button.recent": "Usati di frequente",
@@ -187,7 +187,7 @@
   "notifications.column_settings.reblog": "Post condivisi:",
   "notifications.column_settings.show": "Mostra in colonna",
   "notifications.column_settings.sound": "Riproduci suono",
-  "notifications.group": "{count} notifications",
+  "notifications.group": "{count} notifiche",
   "onboarding.done": "Fatto",
   "onboarding.next": "Prossimo",
   "onboarding.page_five.public_timelines": "La timeline locale mostra i post pubblici di tutti gli utenti di {domain}. La timeline federata mostra i post pubblici di tutti gli utenti seguiti da quelli di {domain}. Queste sono le timeline pubbliche, che vi danno grandi possibilità di scoprire nuovi utenti.",
@@ -228,18 +228,18 @@
   "reply_indicator.cancel": "Annulla",
   "report.forward": "Inoltra a {target}",
   "report.forward_hint": "Questo account appartiene a un altro server. Mandare anche là una copia anonima del rapporto?",
-  "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.hint": "La segnalazione sara' invata ai tuoi moderatori di istanza. Di seguito, puoi fornire  il motivo per il quale stai segnalando questo account:",
   "report.placeholder": "Commenti aggiuntivi",
   "report.submit": "Invia",
-  "report.target": "Invio la segnalazione",
+  "report.target": "Invio la segnalazione {target}",
   "search.placeholder": "Cerca",
-  "search_popout.search_format": "Advanced search format",
+  "search_popout.search_format": "Formato di ricerca avanzato",
   "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_popout.tips.user": "utente",
+  "search_results.accounts": "Gente",
   "search_results.hashtags": "Hashtag",
   "search_results.statuses": "Toot",
   "search_results.total": "{count} {count, plural, one {risultato} other {risultati}}",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 488fb6020..8de92db16 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -63,11 +63,11 @@
   "column_subheading.lists": "リスト",
   "column_subheading.navigation": "ナビゲーション",
   "column_subheading.settings": "設定",
-  "compose_form.direct_message_warning": "このトゥートはメンションされた人にのみ送信されます。ただし送受信したインスタンスの管理者が検査するかもしれません。",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "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.lock": "非公開",
+  "compose_form.lock_disclaimer.lock": "承認制",
   "compose_form.placeholder": "今なにしてる?",
   "compose_form.publish": "トゥート",
   "compose_form.publish_loud": "{publish}!",
@@ -191,7 +191,7 @@
   "notifications.column_settings.reblog": "ブースト:",
   "notifications.column_settings.show": "カラムに表示",
   "notifications.column_settings.sound": "通知音を再生",
-  "notifications.group": "{count} notifications",
+  "notifications.group": "{count} 件の通知",
   "onboarding.done": "完了",
   "onboarding.next": "次へ",
   "onboarding.page_five.public_timelines": "連合タイムラインでは{domain}の人がフォローしているMastodon全体での公開投稿を表示します。同じくローカルタイムラインでは{domain}のみの公開投稿を表示します。",
@@ -285,7 +285,7 @@
   "tabs_bar.notifications": "通知",
   "tabs_bar.search": "検索",
   "timeline.media": "Media",
-  "timeline.posts": "Toots",
+  "timeline.posts": "投稿",
   "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。",
   "upload_area.title": "ドラッグ&ドロップでアップロード",
   "upload_button.label": "メディアを追加",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 1ead2011d..ee4d9de47 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -61,7 +61,7 @@
   "column_subheading.navigation": "Navigatie",
   "column_subheading.settings": "Instellingen",
   "compose_form.direct_message_warning": "Deze toot wordt alleen naar vermelde gebruikers verstuurd. Echter, de beheerders en moderatoren van jouw en de ontvangende Mastodonserver(s) kunnen dit bericht mogelijk wel bekijken.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.direct_message_warning_learn_more": "Meer leren",
   "compose_form.hashtag_warning": "Deze toot valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare toots kunnen via hashtags gevonden worden.",
   "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de toots zien die je alleen aan jouw volgers hebt gericht.",
   "compose_form.lock_disclaimer.lock": "besloten",
@@ -187,7 +187,7 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "In kolom tonen",
   "notifications.column_settings.sound": "Geluid afspelen",
-  "notifications.group": "{count} notifications",
+  "notifications.group": "{count} meldingen",
   "onboarding.done": "Klaar",
   "onboarding.next": "Volgende",
   "onboarding.page_five.public_timelines": "De lokale tijdlijn toont openbare toots van iedereen op {domain}. De globale tijdlijn toont openbare toots van iedereen die door gebruikers van {domain} worden gevolgd, dus ook mensen van andere Mastodonservers. Dit zijn de openbare tijdlijnen en vormen een uitstekende manier om nieuwe mensen te leren kennen.",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index e7bc148fa..3ad5b3d95 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -1,5 +1,5 @@
 {
-  "account.badges.bot": "Bot",
+  "account.badges.bot": "Robòt",
   "account.block": "Blocar @{name}",
   "account.block_domain": "Tot amagar del domeni {domain}",
   "account.blocked": "Blocat",
@@ -60,7 +60,7 @@
   "column_header.unpin": "Despenjar",
   "column_subheading.navigation": "Navigacion",
   "column_subheading.settings": "Paramètres",
-  "compose_form.direct_message_warning": "Aqueste tut serà pas que visibile pel monde mencionat.",
+  "compose_form.direct_message_warning": "Sols los mencionats poiràn veire aqueste tut.",
   "compose_form.direct_message_warning_learn_more": "Ne saber mai",
   "compose_form.hashtag_warning": "Aqueste tut serà pas ligat a cap d’etiqueta estant qu’es pas listat. Òm pas cercar que los tuts publics per etiqueta.",
   "compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo monde pòt vos sègre e veire los estatuts reservats als seguidors.",
@@ -281,7 +281,7 @@
   "tabs_bar.notifications": "Notificacions",
   "tabs_bar.search": "Recèrcas",
   "timeline.media": "Media",
-  "timeline.posts": "Toots",
+  "timeline.posts": "Tuts",
   "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.",
   "upload_area.title": "Lisatz e depausatz per mandar",
   "upload_button.label": "Ajustar un mèdia",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index c69a90e62..c8441df29 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -60,8 +60,8 @@
   "column_header.unpin": "Desafixar",
   "column_subheading.navigation": "Navegação",
   "column_subheading.settings": "Configurações",
-  "compose_form.direct_message_warning": "Este toot só será enviado aos usuários mencionados. No entanto, a administração da sua instância e das instâncias dos usuários mencionados podem inspecionar essa mensagem.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.direct_message_warning": "Este toot só será enviado aos usuários mencionados. A mensagem não é encriptada e será armazenada nos servidores dos usuários mencionados.",
+  "compose_form.direct_message_warning_learn_more": "Saber mais",
   "compose_form.hashtag_warning": "Esse toot não será listado em nenhuma hashtag por ser não listado. Somente toots públicos podem ser pesquisados por hashtag.",
   "compose_form.lock_disclaimer": "A sua conta não está {locked}. Qualquer pessoa pode te seguir e visualizar postagens direcionadas a apenas seguidores.",
   "compose_form.lock_disclaimer.lock": "trancada",
@@ -187,7 +187,7 @@
   "notifications.column_settings.reblog": "Compartilhamento:",
   "notifications.column_settings.show": "Mostrar nas colunas",
   "notifications.column_settings.sound": "Reproduzir som",
-  "notifications.group": "{count} notifications",
+  "notifications.group": "{count} notificações",
   "onboarding.done": "Pronto",
   "onboarding.next": "Próximo",
   "onboarding.page_five.public_timelines": "A timeline local mostra postagens públicas de todos os usuários no {domain}. A timeline federada mostra todas as postagens de todas as pessoas que pessoas no {domain} seguem. Estas são as timelines públicas, uma ótima maneira de conhecer novas pessoas.",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 6c396e525..d2af13bfb 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -60,7 +60,7 @@
   "column_header.unpin": "Ångra fäst",
   "column_subheading.navigation": "Navigation",
   "column_subheading.settings": "Inställningar",
-  "compose_form.direct_message_warning": "Denna toot kommer endast vara synlig för nämnda användare.",
+  "compose_form.direct_message_warning": "Denna toot kommer endast att skickas nämnda nämnda användare.",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "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}. Vemsomhelst kan följa dig och även se dina inlägg skrivna för endast dina följare.",
@@ -287,12 +287,12 @@
   "upload_button.label": "Lägg till media",
   "upload_form.description": "Beskriv för synskadade",
   "upload_form.focus": "Beskär",
-  "upload_form.undo": "Ångra",
+  "upload_form.undo": "Ta bort",
   "upload_progress.label": "Laddar upp...",
   "video.close": "Stäng video",
   "video.exit_fullscreen": "Stäng helskärm",
   "video.expand": "Expandera video",
-  "video.fullscreen": "Helskärm",
+  "video.fullscreen": "Fullskärm",
   "video.hide": "Dölj video",
   "video.mute": "Stäng av ljud",
   "video.pause": "Pause",
diff --git a/app/javascript/mastodon/service_worker/web_push_notifications.js b/app/javascript/mastodon/service_worker/web_push_notifications.js
index f922f7dd0..3318bbadc 100644
--- a/app/javascript/mastodon/service_worker/web_push_notifications.js
+++ b/app/javascript/mastodon/service_worker/web_push_notifications.js
@@ -25,7 +25,7 @@ const notify = options =>
 
       return self.registration.showNotification(group.title, group);
     } else if (notifications.length === 1 && notifications[0].tag === GROUP_TAG) { // Already grouped, proceed with appending the notification to the group
-      const group = { ...notifications[0] };
+      const group = cloneNotification(notifications[0]);
 
       group.title = formatMessage('notifications.group', options.data.preferred_locale, { count: group.data.count + 1 });
       group.body  = `${options.title}\n${group.body}`;
@@ -57,6 +57,18 @@ const fetchFromApi = (path, method, accessToken) => {
   }).then(res => res.json());
 };
 
+const cloneNotification = notification => {
+  const clone = {};
+  let k;
+
+  // Object.assign() does not work with notifications
+  for(k in notification) {
+    clone[k] = notification[k];
+  }
+
+  return clone;
+};
+
 const formatMessage = (messageId, locale, values = {}) =>
   (new IntlMessageFormat(locales[locale][messageId], locale)).format(values);
 
@@ -95,7 +107,7 @@ const handlePush = (event) => {
         options.body    = notification.status.spoiler_text;
         options.image   = undefined;
         options.actions = [actionExpand(preferred_locale)];
-      } else if (notification.status) {
+      } else if (notification.type === 'mention') {
         options.actions = [actionReblog(preferred_locale), actionFavourite(preferred_locale)];
       }
 
@@ -130,7 +142,7 @@ const findBestClient = clients => {
 };
 
 const expandNotification = notification => {
-  const newNotification = { ...notification };
+  const newNotification = cloneNotification(notification);
 
   newNotification.body    = newNotification.data.hiddenBody;
   newNotification.image   = newNotification.data.hiddenImage;
@@ -140,7 +152,7 @@ const expandNotification = notification => {
 };
 
 const removeActionFromNotification = (notification, action) => {
-  const newNotification = { ...notification };
+  const newNotification = cloneNotification(notification);
 
   newNotification.actions = newNotification.actions.filter(item => item.action !== action);
 
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 42c790bac..2b88b830c 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -25,6 +25,55 @@
   background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($white)}"/></svg>') no-repeat bottom / 100% auto;
 }
 
+.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button {
+  color: $ui-base-color;
+
+  &:active,
+  &:focus,
+  &:hover {
+    color: darken($ui-base-color, 7%);
+  }
+}
+
+.compose-form .compose-form__modifiers .compose-form__upload-description input {
+  color: $ui-base-color;
+
+  &::placeholder {
+    color: $ui-base-color;
+  }
+}
+
+.compose-form .compose-form__buttons-wrapper {
+  background: darken($ui-base-color, 6%);
+}
+
+.focusable:focus {
+  background: $ui-base-color;
+}
+
+.status.status-direct {
+  background: lighten($ui-base-color, 4%);
+}
+
+.focusable:focus .status.status-direct {
+  background: lighten($ui-base-color, 8%);
+}
+
+.detailed-status,
+.detailed-status__action-bar {
+  background: darken($ui-base-color, 6%);
+}
+
+// Change the background color of status__content__spoiler-link
+.reply-indicator__content .status__content__spoiler-link,
+.status__content .status__content__spoiler-link {
+  background: $ui-base-lighter-color;
+
+  &:hover {
+    background: lighten($ui-base-lighter-color, 6%);
+  }
+}
+
 // Change the colors used in the dropdown menu
 .dropdown-menu {
   background: $ui-base-color;
@@ -84,17 +133,17 @@
 .confirmation-modal,
 .mute-modal,
 .report-modal {
-  background: $ui-secondary-color;
+  background: $ui-base-color;
 }
 
 .boost-modal__action-bar,
 .confirmation-modal__action-bar,
 .mute-modal__action-bar {
-  background: darken($ui-secondary-color, 6%);
+  background: darken($ui-base-color, 6%);
 }
 
 .react-toggle-track {
-  background: $ui-base-color;
+  background: $ui-secondary-color;
 }
 
 // Change the default color used for the text in an empty column or on the error column
diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss
index 4be454e66..9f6d470b1 100644
--- a/app/javascript/styles/mastodon-light/variables.scss
+++ b/app/javascript/styles/mastodon-light/variables.scss
@@ -8,7 +8,10 @@ $classic-secondary-color: #d9e1e8;
 $classic-highlight-color: #2b90d9;
 
 // Differences
-$base-overlay-background: $white;
+$success-green: #3c754d;
+
+$base-overlay-background: $white !default;
+$valid-value-color: $success-green !default;
 
 $ui-base-color: $classic-secondary-color !default;
 $ui-base-lighter-color: #b0c0cf;
@@ -26,7 +29,7 @@ $lighter-text-color: $classic-base-color !default;
 $light-text-color: #444b5d;
 
 //Newly added colors
-$account-background-color: $white;
+$account-background-color: $white !default;
 
 //Invert darkened and lightened colors
 @function darken($color, $amount) {
diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss
index de0a7ea42..3ccce383b 100644
--- a/app/javascript/styles/mastodon/accounts.scss
+++ b/app/javascript/styles/mastodon/accounts.scss
@@ -79,6 +79,10 @@
       font-weight: 400;
       overflow: hidden;
       text-overflow: ellipsis;
+
+      .fa {
+        margin-left: 3px;
+      }
     }
   }
 
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index f067898bc..abffa6daa 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -425,7 +425,7 @@
 
         .icon-button {
           flex: 0 1 auto;
-          color: $action-button-color;
+          color: $secondary-text-color;
           font-size: 14px;
           font-weight: 500;
           padding: 10px;
@@ -434,7 +434,7 @@
           &:hover,
           &:focus,
           &:active {
-            color: lighten($action-button-color, 7%);
+            color: lighten($secondary-text-color, 7%);
           }
         }
 
@@ -1373,9 +1373,8 @@ a.account__display-name {
 }
 
 .notification__message {
-  margin-left: 68px;
-  padding: 8px 0;
-  padding-bottom: 0;
+  margin: 0 10px 0 68px;
+  padding: 8px 0 0;
   cursor: default;
   color: $darker-text-color;
   font-size: 15px;
diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss
index cbefe35b4..40aeb4afc 100644
--- a/app/javascript/styles/mastodon/variables.scss
+++ b/app/javascript/styles/mastodon/variables.scss
@@ -1,10 +1,10 @@
 // Commonly used web colors
 $black: #000000;            // Black
 $white: #ffffff;            // White
-$success-green: #79bd9a;    // Padua
-$error-red: #df405a;        // Cerise
-$warning-red: #ff5050;      // Sunset Orange
-$gold-star: #ca8f04;        // Dark Goldenrod
+$success-green: #79bd9a !default;    // Padua
+$error-red: #df405a !default;        // Cerise
+$warning-red: #ff5050 !default;      // Sunset Orange
+$gold-star: #ca8f04 !default;        // Dark Goldenrod
 
 // Values from the classic Mastodon UI
 $classic-base-color: #282c37;         // Midnight Express
diff --git a/app/models/user.rb b/app/models/user.rb
index 9bdf8807f..ef48282fd 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -65,6 +65,7 @@ class User < ApplicationRecord
 
   validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale?
   validates_with BlacklistedEmailValidator, if: :email_changed?
+  validates_with EmailMxValidator, if: :email_changed?
 
   scope :recent, -> { order(id: :desc) }
   scope :admins, -> { where(admin: true) }
diff --git a/app/validators/email_mx_validator.rb b/app/validators/email_mx_validator.rb
new file mode 100644
index 000000000..d4c7cc252
--- /dev/null
+++ b/app/validators/email_mx_validator.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'resolv'
+
+class EmailMxValidator < ActiveModel::Validator
+  def validate(user)
+    return if Rails.env.test?
+    user.errors.add(:email, I18n.t('users.invalid_email')) if invalid_mx?(user.email)
+  end
+
+  private
+
+  def invalid_mx?(value)
+    _, domain = value.split('@', 2)
+
+    return true if domain.nil?
+
+    records = Resolv::DNS.new.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }
+    records.empty? || on_blacklist?(records)
+  end
+
+  def on_blacklist?(values)
+    EmailDomainBlock.where(domain: values).any?
+  end
+end