about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
authorkibigo! <marrus-sh@users.noreply.github.com>2017-10-11 10:43:10 -0700
committerkibigo! <marrus-sh@users.noreply.github.com>2017-10-11 10:43:10 -0700
commit8d6b9ba4946b5b159af0fbd130637a226a286796 (patch)
tree9def26711682d29338cfa1b081822029a01669eb /config
parentf0a2a6c875e9294f0ea1d4c6bc90529e41a2dc37 (diff)
parent476e79b8e340c9103352a0799e102e4aca1a5593 (diff)
Merge upstream 2.0ish #165
Diffstat (limited to 'config')
-rw-r--r--config/application.rb1
-rw-r--r--config/brakeman.ignore184
-rw-r--r--config/environments/production.rb5
-rw-r--r--config/initializers/kaminari_config.rb3
-rw-r--r--config/initializers/paperclip.rb6
-rw-r--r--config/initializers/statsd.rb23
-rw-r--r--config/initializers/strong_migrations.rb2
-rw-r--r--config/locales/activerecord.de.yml13
-rw-r--r--config/locales/de.yml356
-rw-r--r--config/locales/devise.de.yml54
-rw-r--r--config/locales/doorkeeper.de.yml98
-rw-r--r--config/locales/doorkeeper.fr.yml4
-rw-r--r--config/locales/en.yml34
-rw-r--r--config/locales/eo.yml286
-rw-r--r--config/locales/fi.yml2
-rw-r--r--config/locales/ja.yml22
-rw-r--r--config/locales/ko.yml85
-rw-r--r--config/locales/oc.yml29
-rw-r--r--config/locales/pl.yml36
-rw-r--r--config/locales/simple_form.de.yml36
-rw-r--r--config/locales/simple_form.en.yml5
-rw-r--r--config/locales/simple_form.pl.yml3
-rw-r--r--config/navigation.rb2
-rw-r--r--config/routes.rb26
-rw-r--r--config/webpack/development.js15
-rw-r--r--config/webpack/loaders/babel.js6
-rw-r--r--config/webpack/loaders/babel_external.js21
-rw-r--r--config/webpack/shared.js7
28 files changed, 1153 insertions, 211 deletions
diff --git a/config/application.rb b/config/application.rb
index db53b8c84..4e8a5875d 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -10,6 +10,7 @@ require_relative '../app/lib/exceptions'
 require_relative '../lib/paperclip/gif_transcoder'
 require_relative '../lib/paperclip/video_transcoder'
 require_relative '../lib/paperclip/audio_transcoder'
+require_relative '../lib/mastodon/snowflake'
 require_relative '../lib/mastodon/version'
 
 Dotenv::Railtie.load
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index dbb59dd07..f198eebac 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -1,6 +1,82 @@
 {
   "ignored_warnings": [
     {
+      "warning_type": "Cross-Site Scripting",
+      "warning_code": 4,
+      "fingerprint": "0adbe361b91afff22ba51e5fc2275ec703cc13255a0cb3eecd8dab223ab9f61e",
+      "check_name": "LinkToHref",
+      "message": "Potentially unsafe model attribute in link_to href",
+      "file": "app/views/admin/accounts/show.html.haml",
+      "line": 122,
+      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
+      "code": "link_to(Account.find(params[:id]).inbox_url, Account.find(params[:id]).inbox_url)",
+      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
+      "location": {
+        "type": "template",
+        "template": "admin/accounts/show"
+      },
+      "user_input": "Account.find(params[:id]).inbox_url",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
+      "warning_type": "Cross-Site Scripting",
+      "warning_code": 4,
+      "fingerprint": "1fc29c578d0c89bf13bd5476829d272d54cd06b92ccf6df18568fa1f2674926e",
+      "check_name": "LinkToHref",
+      "message": "Potentially unsafe model attribute in link_to href",
+      "file": "app/views/admin/accounts/show.html.haml",
+      "line": 128,
+      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
+      "code": "link_to(Account.find(params[:id]).shared_inbox_url, Account.find(params[:id]).shared_inbox_url)",
+      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
+      "location": {
+        "type": "template",
+        "template": "admin/accounts/show"
+      },
+      "user_input": "Account.find(params[:id]).shared_inbox_url",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
+      "warning_type": "Cross-Site Scripting",
+      "warning_code": 4,
+      "fingerprint": "2129d4c1e63a351d28d8d2937ff0b50237809c3df6725c0c5ef82b881dbb2086",
+      "check_name": "LinkToHref",
+      "message": "Potentially unsafe model attribute in link_to href",
+      "file": "app/views/admin/accounts/show.html.haml",
+      "line": 35,
+      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
+      "code": "link_to(Account.find(params[:id]).url, Account.find(params[:id]).url)",
+      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
+      "location": {
+        "type": "template",
+        "template": "admin/accounts/show"
+      },
+      "user_input": "Account.find(params[:id]).url",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
+      "warning_type": "Dynamic Render Path",
+      "warning_code": 15,
+      "fingerprint": "3b0a20b08aef13cf8cf865384fae0cfd3324d8200a83262bf4abbc8091b5fec5",
+      "check_name": "Render",
+      "message": "Render path contains parameter value",
+      "file": "app/views/admin/custom_emojis/index.html.haml",
+      "line": 31,
+      "link": "http://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
+      "code": "render(action => filtered_custom_emojis.page(params[:page]), {})",
+      "render_path": [{"type":"controller","class":"Admin::CustomEmojisController","method":"index","line":9,"file":"app/controllers/admin/custom_emojis_controller.rb"}],
+      "location": {
+        "type": "template",
+        "template": "admin/custom_emojis/index"
+      },
+      "user_input": "params[:page]",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
       "warning_type": "Dynamic Render Path",
       "warning_code": 15,
       "fingerprint": "44d3f14e05d8fbb5b23e13ac02f15aa38b2a2f0f03b9ba76bab7f98e155a4a4e",
@@ -10,7 +86,7 @@
       "line": 3,
       "link": "http://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(action => \"stream_entries/#{Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase}\", { Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase.to_sym => Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity, :centered => true })",
-      "render_path": [{"type":"controller","class":"StatusesController","method":"embed","line":35,"file":"app/controllers/statuses_controller.rb"}],
+      "render_path": [{"type":"controller","class":"StatusesController","method":"embed","line":41,"file":"app/controllers/statuses_controller.rb"}],
       "location": {
         "type": "template",
         "template": "stream_entries/embed"
@@ -20,13 +96,71 @@
       "note": ""
     },
     {
+      "warning_type": "Cross-Site Scripting",
+      "warning_code": 4,
+      "fingerprint": "64b5b2a02ede9c2b3598881eb5a466d63f7d27fe0946aa00d570111ec7338d2e",
+      "check_name": "LinkToHref",
+      "message": "Potentially unsafe model attribute in link_to href",
+      "file": "app/views/admin/accounts/show.html.haml",
+      "line": 131,
+      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
+      "code": "link_to(Account.find(params[:id]).followers_url, Account.find(params[:id]).followers_url)",
+      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
+      "location": {
+        "type": "template",
+        "template": "admin/accounts/show"
+      },
+      "user_input": "Account.find(params[:id]).followers_url",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
+      "warning_type": "Cross-Site Scripting",
+      "warning_code": 4,
+      "fingerprint": "82f7b0d09beb3ab68e0fa16be63cedf4e820f2490326e9a1cec05761d92446cd",
+      "check_name": "LinkToHref",
+      "message": "Potentially unsafe model attribute in link_to href",
+      "file": "app/views/admin/accounts/show.html.haml",
+      "line": 106,
+      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
+      "code": "link_to(Account.find(params[:id]).salmon_url, Account.find(params[:id]).salmon_url)",
+      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
+      "location": {
+        "type": "template",
+        "template": "admin/accounts/show"
+      },
+      "user_input": "Account.find(params[:id]).salmon_url",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
+      "warning_type": "SQL Injection",
+      "warning_code": 0,
+      "fingerprint": "9ccb9ba6a6947400e187d515e0bf719d22993d37cfc123c824d7fafa6caa9ac3",
+      "check_name": "SQL",
+      "message": "Possible SQL injection",
+      "file": "lib/mastodon/snowflake.rb",
+      "line": 86,
+      "link": "http://brakemanscanner.org/docs/warning_types/sql_injection/",
+      "code": "connection.execute(\"        CREATE OR REPLACE FUNCTION timestamp_id(table_name text)\\n        RETURNS bigint AS\\n        $$\\n          DECLARE\\n            time_part bigint;\\n            sequence_base bigint;\\n            tail bigint;\\n          BEGIN\\n            time_part := (\\n              -- Get the time in milliseconds\\n              ((date_part('epoch', now()) * 1000))::bigint\\n              -- And shift it over two bytes\\n              << 16);\\n\\n            sequence_base := (\\n              'x' ||\\n              -- Take the first two bytes (four hex characters)\\n              substr(\\n                -- Of the MD5 hash of the data we documented\\n                md5(table_name ||\\n                  '#{SecureRandom.hex(16)}' ||\\n                  time_part::text\\n                ),\\n                1, 4\\n              )\\n            -- And turn it into a bigint\\n            )::bit(16)::bigint;\\n\\n            -- Finally, add our sequence number to our base, and chop\\n            -- it to the last two bytes\\n            tail := (\\n              (sequence_base + nextval(table_name || '_id_seq'))\\n              & 65535);\\n\\n            -- Return the time part and the sequence part. OR appears\\n            -- faster here than addition, but they're equivalent:\\n            -- time_part has no trailing two bytes, and tail is only\\n            -- the last two bytes.\\n            RETURN time_part | tail;\\n          END\\n        $$ LANGUAGE plpgsql VOLATILE;\\n\")",
+      "render_path": null,
+      "location": {
+        "type": "method",
+        "class": "Mastodon::Snowflake",
+        "method": "define_timestamp_id"
+      },
+      "user_input": "SecureRandom.hex(16)",
+      "confidence": "Medium",
+      "note": ""
+    },
+    {
       "warning_type": "Dynamic Render Path",
       "warning_code": 15,
       "fingerprint": "9f31d941f3910dba2e9bfcd81aef4513249bd24c02d0f98e13ad44fdeeccd0e8",
       "check_name": "Render",
       "message": "Render path contains parameter value",
       "file": "app/views/admin/accounts/index.html.haml",
-      "line": 63,
+      "line": 64,
       "link": "http://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(action => filtered_accounts.page(params[:page]), {})",
       "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"index","line":10,"file":"app/controllers/admin/accounts_controller.rb"}],
@@ -39,6 +173,25 @@
       "note": ""
     },
     {
+      "warning_type": "Cross-Site Scripting",
+      "warning_code": 4,
+      "fingerprint": "bb0ad5c4a42e06e3846c2089ff5269c17f65483a69414f6ce65eecf2bb11fab7",
+      "check_name": "LinkToHref",
+      "message": "Potentially unsafe model attribute in link_to href",
+      "file": "app/views/admin/accounts/show.html.haml",
+      "line": 95,
+      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
+      "code": "link_to(Account.find(params[:id]).remote_url, Account.find(params[:id]).remote_url)",
+      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
+      "location": {
+        "type": "template",
+        "template": "admin/accounts/show"
+      },
+      "user_input": "Account.find(params[:id]).remote_url",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
       "warning_type": "Redirect",
       "warning_code": 18,
       "fingerprint": "bb7e94e60af41decb811bb32171f1b27e9bf3f4d01e9e511127362e22510eb11",
@@ -65,7 +218,7 @@
       "check_name": "Render",
       "message": "Render path contains parameter value",
       "file": "app/views/admin/reports/index.html.haml",
-      "line": 24,
+      "line": 25,
       "link": "http://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(action => filtered_reports.page(params[:page]), {})",
       "render_path": [{"type":"controller","class":"Admin::ReportsController","method":"index","line":9,"file":"app/controllers/admin/reports_controller.rb"}],
@@ -78,13 +231,32 @@
       "note": ""
     },
     {
+      "warning_type": "Cross-Site Scripting",
+      "warning_code": 4,
+      "fingerprint": "e04aafe1e06cf8317fb6ac0a7f35783e45aa1274272ee6eaf28d39adfdad489b",
+      "check_name": "LinkToHref",
+      "message": "Potentially unsafe model attribute in link_to href",
+      "file": "app/views/admin/accounts/show.html.haml",
+      "line": 125,
+      "link": "http://brakemanscanner.org/docs/warning_types/link_to_href",
+      "code": "link_to(Account.find(params[:id]).outbox_url, Account.find(params[:id]).outbox_url)",
+      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":13,"file":"app/controllers/admin/accounts_controller.rb"}],
+      "location": {
+        "type": "template",
+        "template": "admin/accounts/show"
+      },
+      "user_input": "Account.find(params[:id]).outbox_url",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
       "warning_type": "Dynamic Render Path",
       "warning_code": 15,
       "fingerprint": "fbd0fc59adb5c6d44b60e02debb31d3af11719f534c9881e21435bbff87404d6",
       "check_name": "Render",
       "message": "Render path contains parameter value",
       "file": "app/views/stream_entries/show.html.haml",
-      "line": 23,
+      "line": 21,
       "link": "http://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(partial => \"stream_entries/#{Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase}\", { :locals => ({ Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase.to_sym => Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity, :include_threads => true }) })",
       "render_path": [{"type":"controller","class":"StatusesController","method":"show","line":20,"file":"app/controllers/statuses_controller.rb"}],
@@ -97,6 +269,6 @@
       "note": ""
     }
   ],
-  "updated": "2017-08-30 05:14:04 +0200",
-  "brakeman_version": "3.7.2"
+  "updated": "2017-10-07 19:24:02 +0200",
+  "brakeman_version": "4.0.1"
 }
diff --git a/config/environments/production.rb b/config/environments/production.rb
index dc1ce5ed6..e0ee393c1 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -90,11 +90,6 @@ Rails.application.configure do
 
   config.action_mailer.delivery_method = ENV.fetch('SMTP_DELIVERY_METHOD', 'smtp').to_sym
 
-  config.to_prepare do
-    StatsD.backend = StatsD::Instrument::Backends::NullBackend.new if ENV['STATSD_ADDR'].blank?
-    Sidekiq::Logging.logger.level = Logger::WARN
-  end
-
   config.action_dispatch.default_headers = {
     'Server'                  => 'Mastodon',
     'X-Frame-Options'         => 'DENY',
diff --git a/config/initializers/kaminari_config.rb b/config/initializers/kaminari_config.rb
index 27b183eeb..aa1517256 100644
--- a/config/initializers/kaminari_config.rb
+++ b/config/initializers/kaminari_config.rb
@@ -3,6 +3,5 @@
 Kaminari.configure do |config|
   config.default_per_page = 40
   config.window = 1
-  config.left = 3
-  config.right = 1
+  config.outer_window = 1
 end
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index f27aae7ec..2c82a91db 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -7,6 +7,8 @@ Paperclip.interpolates :filename do |attachment, style|
   [basename(attachment, style), extension(attachment, style)].delete_if(&:blank?).join('.')
 end
 
+Paperclip::Attachment.default_options[:use_timestamp]  = false
+
 if ENV['S3_ENABLED'] == 'true'
   Aws.eager_autoload!(services: %w(S3))
 
@@ -18,7 +20,6 @@ if ENV['S3_ENABLED'] == 'true'
   Paperclip::Attachment.default_options[:s3_headers]     = { 'Cache-Control' => 'max-age=315576000' }
   Paperclip::Attachment.default_options[:s3_permissions] = ENV.fetch('S3_PERMISSION') { 'public-read' }
   Paperclip::Attachment.default_options[:s3_region]      = ENV.fetch('S3_REGION') { 'us-east-1' }
-  Paperclip::Attachment.default_options[:use_timestamp]  = false
 
   Paperclip::Attachment.default_options[:s3_credentials] = {
     bucket: ENV.fetch('S3_BUCKET'),
@@ -48,6 +49,7 @@ elsif ENV['SWIFT_ENABLED'] == 'true'
       provider: 'OpenStack',
       openstack_username: ENV.fetch('SWIFT_USERNAME'),
       openstack_project_name: ENV.fetch('SWIFT_TENANT'),
+      openstack_tenant: ENV.fetch('SWIFT_TENANT'), # Some OpenStack-v2 ignores project_name but needs tenant
       openstack_api_key: ENV.fetch('SWIFT_PASSWORD'),
       openstack_auth_url: ENV.fetch('SWIFT_AUTH_URL'),
       openstack_domain_name: ENV['SWIFT_DOMAIN_NAME'] || 'default',
@@ -55,7 +57,7 @@ elsif ENV['SWIFT_ENABLED'] == 'true'
       openstack_cache_ttl: ENV['SWIFT_CACHE_TTL'] || 60,
     },
     fog_directory: ENV.fetch('SWIFT_CONTAINER'),
-    fog_host: ENV.fetch('SWIFT_OBJECT_URL'),
+    fog_host: ENV['SWIFT_OBJECT_URL'],
     fog_public: true
   )
 else
diff --git a/config/initializers/statsd.rb b/config/initializers/statsd.rb
index f00b1d401..17a176174 100644
--- a/config/initializers/statsd.rb
+++ b/config/initializers/statsd.rb
@@ -1,18 +1,15 @@
 # frozen_string_literal: true
-RESERVED_CHARACTERS_REGEX = /[\:\|\@]/
 
-StatsD.prefix              = 'mastodon'
-StatsD.default_sample_rate = 1
+if ENV['STATSD_ADDR'].present?
+  host, port = ENV['STATSD_ADDR'].split(':')
 
-def clean_name(str)
-  str.gsub('::', '.').gsub(RESERVED_CHARACTERS_REGEX, '_')
-end
-
-ActiveSupport::Notifications.subscribe(/performance/) do |name, _start, _finish, _id, payload|
-  action      = payload[:action] || :increment
-  measurement = payload[:measurement]
-  value       = payload[:value]
-  key_name    = clean_name("#{name}.#{measurement}")
+  statsd = ::Statsd.new(host, port)
+  statsd.namespace = ['Mastodon', Rails.env].join('.')
 
-  StatsD.send(action.to_s, key_name, (value || 1))
+  ::NSA.inform_statsd(statsd) do |informant|
+    informant.collect(:action_controller, :web)
+    informant.collect(:active_record, :db)
+    informant.collect(:cache, :cache)
+    informant.collect(:sidekiq, :sidekiq)
+  end
 end
diff --git a/config/initializers/strong_migrations.rb b/config/initializers/strong_migrations.rb
index 3d7beac9f..70feb4f11 100644
--- a/config/initializers/strong_migrations.rb
+++ b/config/initializers/strong_migrations.rb
@@ -1,3 +1,3 @@
 # frozen_string_literal: true
 
-StrongMigrations.start_after = 20170924022025 if Rails.env.development?
+StrongMigrations.start_after = 20170924022025
diff --git a/config/locales/activerecord.de.yml b/config/locales/activerecord.de.yml
new file mode 100644
index 000000000..668abe2a3
--- /dev/null
+++ b/config/locales/activerecord.de.yml
@@ -0,0 +1,13 @@
+---
+de:
+  activerecord:
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: nur Buchstaben, Ziffern und Unterstriche
+        status:
+          attributes:
+            reblog:
+              taken: of status already exists
diff --git a/config/locales/de.yml b/config/locales/de.yml
index de6c86737..a54d9734f 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -1,39 +1,70 @@
 ---
 de:
   about:
-    about_mastodon_html: Mastodon ist ein <em>freier, quelloffener</em> sozialer Netzwerkserver. Als <em>dezentralisierte</em> Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am <em>sozialen Netzwerk</em> teilnehmen.
+    about_mastodon_html: Mastodon ist ein soziales Netzwerk. Es basiert auf offenen Web-Protokollen und freier, quelloffener Software. Es ist dezentral (so wie E-Mail!).
+    about_hashtag_html: Dies sind öffentliche Beiträge, die mit <strong>#%{hashtag}</strong> getaggt wurden. Wenn du ein Konto irgendwo im Fediversum besitzt, kannst du mit ihnen interagieren.
     about_this: Über diese Instanz
-    closed_registrations: Die Registrierung ist auf dieser Instanz momentan geschlossen.
+    closed_registrations: Die Registrierung auf dieser Instanz ist momentan geschlossen. Aber du kannst dein Konto auch auf einer anderen Instanz erstellen! Von dort hast du genauso Zugriff auf das Mastodon-Netzwerk.
     contact: Kontakt
+    contact_missing: Nicht angegeben
+    contact_unavailable: N/A
     description_headline: Was ist %{domain}?
-    domain_count_after: andere Instanzen
-    domain_count_before: Verbunden mit
+    domain_count_after: anderen Instanzen
+    domain_count_before: Vernetzt mit
+    extended_description_html: |
+      <h3>Ein guter Platz für Regeln</h3>
+      <p>Die erweiterte Beschreibung wurde noch nicht aufgesetzt.</p>
+    features:
+      humane_approach_body: Mastodon hat von den Fehlern anderer Netzwerke gelernt und wurde mit dem Augenmerk darauf entwickelt, den Missbrauch sozialer Medien zu bekämpfen.
+      humane_approach_title: Ein menschlicherer Ansatz
+      not_a_product_body: Mastodon ist kein kommerzielles Netzwerk. Keine Werbung, kein Abgraben deiner Daten, keine geschlossene Plattform. Es gibt keine Zentrale.
+      not_a_product_title: Du bist ein Mensch und keine Ware
+      real_conversation_body: Mit 500 Zeichen pro Beitrag und der Ermöglichung präziser Inhalts- und Bilderwarnungen kannst du dich so ausdrücken, wie du es möchtest.
+      real_conversation_title: Für das echte Gespräch gemacht
+      within_reach_body: Verschiedene Apps für iOS, Android und andere Plattformen erlauben dir dank unserem blühenden API-Ökosystem, dich von überall auf dem Laufenden zu halten.
+      within_reach_title: Immer für dich da
+    find_another_instance: Eine andere Instanz finden
+    generic_description: "%{domain} ist ein Server im Netzwerk"
+    hosted_on: Mastodon, beherbergt auf %{domain}
+    learn_more: Mehr erfahren
     other_instances: Andere Instanzen
     source_code: Quellcode
     status_count_after: Beiträge verfassten
     status_count_before: die
-    user_count_after: Profile
-    user_count_before: Heimat für
+    user_count_after: Wesen
+    user_count_before: Zuhause für
+    what_is_mastodon: Was ist Mastodon?
   accounts:
     follow: Folgen
     followers: Folgende
     following: Folgt
+    media: Medien
     nothing_here: Hier gibt es nichts!
     people_followed_by: Profile, denen %{name} folgt
     people_who_follow: Profile, die %{name} folgen
     posts: Beiträge
+    posts_with_replies: Beiträge mit Antworten
     remote_follow: Folgen
+    reserved_username: Dieser Profilname ist belegt
+    roles:
+      admin: Admin
     unfollow: Entfolgen
   admin:
     accounts:
       are_you_sure: Bist du sicher?
+      confirm: Bestätigen
+      confirmed: Bestätigt
+      disable_two_factor_authentication: 2FA abschalten
       display_name: Anzeigename
       domain: Domain
       edit: Bearbeiten
       email: E-Mail
       feed_url: Feed-URL
       followers: Folgende
+      followers_url: Followers URL
       follows: Folgt
+      inbox_url: Inbox URL
+      ip: IP-Adresse
       location:
         all: Alle
         local: Lokal
@@ -45,30 +76,66 @@ de:
         silenced: Stummgeschaltet
         suspended: Gesperrt
         title: Moderation
+      moderation_notes: Moderationsnotizen
       most_recent_activity: Letzte Aktivität
       most_recent_ip: Letzte IP-Adresse
       not_subscribed: Nicht abonniert
       order:
         alphabetic: Alphabetisch
         most_recent: Neueste
-        title: Reihenfolge
-      perform_full_suspension: Führe vollständige Sperre durch
+        title: Sortierung
+      outbox_url: Outbox URL
+      perform_full_suspension: Vollständige Sperre durchführen
       profile_url: Profil-URL
+      protocol: Protokoll
       public: Öffentlich
       push_subscription_expires: PuSH-Abonnement läuft aus
+      redownload: Avatar neu laden
+      reset: Zurücksetzen
       reset_password: Passwort zurücksetzen
+      resubscribe: Wieder abonnieren
       salmon_url: Salmon-URL
+      search: Suche
+      shared_inbox_url: Shared Inbox URL
       show:
         created_reports: Meldungen durch dieses Konto
         report: Meldung
         targeted_reports: Meldungen über dieses Konto
       silence: Stummschalten
       statuses: Beiträge
+      subscribe: Abonnieren
       title: Konten
       undo_silenced: Stummschaltung zurücknehmen
       undo_suspension: Sperre zurücknehmen
+      unsubscribe: Abbestellen
       username: Profilname
       web: Web
+    account_moderation_notes:
+      account: Moderator*in
+      created_at: Datum
+      create: Erstellen
+      created_msg: Moderationsnotiz erfolgreich erstellt!
+      delete: Löschen
+      destroyed_msg: Moderationsnotiz erfolgreich gelöscht!
+    custom_emojis:
+      copied_msg: Eine lokale Kopie des Emojis wurde erstellt
+      copy: Kopieren
+      copy_failed_msg: Es konnte keine lokale Kopie des Emojis erstellt werden
+      created_msg: Emoji erstellt!
+      delete: Löschen
+      destroyed_msg: Emoji gelöscht!
+      disable: Deaktivieren
+      disabled_msg: Das Emoji wurde deaktiviert
+      emoji: Emoji
+      enable: Aktivieren
+      enabled_msg: Das Emoji wurde aktiviert
+      image_hint: PNG bis 50 kB
+      new:
+        title: Eigenes Emoji hinzufügen
+      shortcode: Shortcode
+      shortcode_hint: Mindestens 2 Zeichen, nur Buchstaben, Ziffern und Unterstriche
+      title: Eigene Emojis
+      upload: Hochladen
     domain_blocks:
       add_new: Neu hinzufügen
       created_msg: Die Domain-Blockade wird nun durchgeführt
@@ -76,18 +143,20 @@ de:
       domain: Domain
       new:
         create: Blockade einrichten
-        hint: Die Domain-Blockade wird nicht die Erstellung von Konteneinträgen in der Datenbank verhindern, aber rückwirkend und automatisch alle Moderationsmethoden auf diese Accounts anwenden.
+        hint: Die Domain-Blockade wird nicht verhindern, dass Konteneinträge in der Datenbank erstellt werden. Aber es werden rückwirkend und automatisch alle Moderationsmethoden auf diese Konten angewendet.
         severity:
-          desc_html: "<strong>Stummschaltung</strong> wird die Beiträge dieses Accounts für alle, die ihm nicht folgen, unsichtbar machen. Eine <strong>Sperre</strong> wird alle Beiträge, Medien und Profildaten dieses Accounts entfernen."
+          desc_html: "<strong>Stummschaltung</strong> wird die Beiträge dieses Kontos für alle, die ihm nicht folgen, unsichtbar machen. Eine <strong>Sperre</strong> wird alle Beiträge, Medien und Profildaten dieses Kontos entfernen. Verwende <strong>Kein,</strong> um nur Mediendateien abzulehnen."
+          noop: Kein
           silence: Stummschaltung
           suspend: Sperre
         title: Neue Domain-Blockade
       reject_media: Mediendateien ablehnen
-      reject_media_hint: Entfernt lokal gespeicherte Mediendateien und verweigert künftig deren Herunterladen. Irrelevant für Sperren
+      reject_media_hint: Entfernt lokal gespeicherte Mediendateien und verhindert deren künftiges Herunterladen. Für Sperren irrelevant
       severities:
+        noop: Kein
         silence: Stummschaltung
         suspend: Sperren
-      severity: Gewichtung
+      severity: Schweregrad
       show:
         affected_accounts:
           one: Ein Konto in der Datenbank betroffen
@@ -99,46 +168,95 @@ de:
         undo: Zurücknehmen
       title: Domain-Blockaden
       undo: Zurücknehmen
+    email_domain_blocks:
+      add_new: Neue hinzufügen
+      created_msg: E-Mail-Domain-Blockade erfolgreich erstellt
+      delete: Löschen
+      destroyed_msg: E-Mail-Domain-Blockade erfolgreich gelöscht
+      domain: Domain
+      new:
+        create: Blockade erstellen
+        title: Neue E-Mail-Domain-Blockade
+      title: E-Mail-Domain-Blockade
     instances:
       account_count: Bekannte Konten
       domain_name: Domain
+      reset: Zurücksetzen
+      search: Suchen
       title: Bekannte Instanzen
     reports:
+      action_taken_by: Maßnahme ergriffen durch
+      are_you_sure: Bist du dir sicher?
       comment:
         label: Kommentar
         none: Kein
       delete: Löschen
       id: ID
       mark_as_resolved: Als gelöst markieren
-      report: "#%{id} melden"
+      nsfw:
+        'false': Medienanhänge wieder anzeigen
+        'true': Medienanhänge verbergen
+      report: 'Meldung #%{id}'
+      report_contents: Inhalt
       reported_account: Gemeldetes Konto
       reported_by: Gemeldet von
       resolved: Gelöst
-      silence_account: Account stummschalten
+      silence_account: Konto stummschalten
       status: Status
-      suspend_account: Account sperren
+      suspend_account: Konto sperren
       target: Ziel
       title: Meldungen
       unresolved: Ungelöst
       view: Ansehen
     settings:
+      bootstrap_timeline_accounts:
+        desc_html: Mehrere Profilnamen durch Kommata trennen. Funktioniert nur mit lokalen und nicht gesperrten Konten. Standardwert bei freigelassenem Feld sind alle lokalen Admins.
+        title: Konten, denen Neu-Angemeldete automatisch folgen
       contact_information:
-        email: Eine öffentliche E-Mail-Adresse angeben
-        username: Einen Profilnamen angeben
+        email: Öffentliche E-Mail-Adresse
+        username: Profilname für die Kontaktaufnahme
       registrations:
         closed_message:
-          desc_html: Wird auf der Frontseite angezeigt, wenn die Registrierung geschlossen ist<br>Du kannst HTML-Tags benutzen
+          desc_html: Wird auf der Frontseite angezeigt, wenn die Registrierung geschlossen ist. Du kannst HTML-Tags benutzen
           title: Nachricht über geschlossene Registrierung
+        deletion:
+          desc_html: Allen erlauben, ihr Konto eigenmächtig zu löschen
+          title: Kontolöschung erlauben
         open:
-          title: Offene Registrierung
+          desc_html: Allen erlauben, ein Konto zu erstellen
+          title: Registrierung öffnen
       site_description:
-        desc_html: Wird als Absatz auf der Frontseite angezeigt und als Meta-Tag benutzt.<br>Du kannst HTML-Tags benutzen, insbesondere <code>&lt;a&gt;</code> und <code>&lt;em&gt;</code>.
-        title: Seitenbeschreibung
+        desc_html: Wird als Absatz auf der Frontseite angezeigt und als Meta-Tag benutzt. Du kannst HTML-Tags benutzen, insbesondere <code>&lt;a&gt;</code> und <code>&lt;em&gt;</code>.
+        title: Beschreibung der Instanz
       site_description_extended:
-        desc_html: Wird auf der erweiterten Informationsseite angezeigt<br>Du kannst HTML-Tags benutzen
-        title: Erweiterte Seitenbeschreibung
-      site_title: Seitentitel
-      title: Seiteneinstellungen
+        desc_html: Bietet sich für Verhaltenskodizes, Regeln, Richtlinien und weiteres an, was deine Instanz auszeichnet. Du kannst HTML-Tags benutzen
+        title: Erweiterte Beschreibung der Instanz
+      site_terms:
+        desc_html: Hier kannst du deine eigenen Geschäftsbedingungen, Datenschutzerklärung und anderes rechtlich Relevante eintragen. Du kannst HTML-Tags benutzen
+        title: Eigene Geschäftsbedingungen
+      site_title: Name der Instanz
+      thumbnail:
+        desc_html: Wird für die Vorschau via OpenGraph und API verwendet. 1200×630 px wird empfohlen
+        title: Instanz-Thumbnail
+      timeline_preview:
+        desc_html: Auf der Frontseite die öffentliche Zeitleiste anzeigen
+        title: Zeitleisten-Vorschau
+      title: Instanz-Einstellungen
+    statuses:
+      back_to_account: Zurück zum Konto
+      batch:
+        delete: Löschen
+        nsfw_off: NSFW aus
+        nsfw_on: NSFW ein
+      execute: Ausführen
+      failed_to_execute: Ausführen fehlgeschlagen
+      media:
+        hide: Medien verbergen
+        show: Medien anzeigen
+        title: Medien
+      no_media: Keine Medien
+      title: Beiträge des Kontos
+      with_media: Mit Medien
     subscriptions:
       callback_url: Callback-URL
       confirmed: Bestätigt
@@ -147,25 +265,46 @@ de:
       title: WebSub
       topic: Thema
     title: Administration
+  admin_mailer:
+    new_report:
+      body: "%{reporter} hat %{target} gemeldet"
+      subject: Neue Meldung auf %{instance} (#%{id})
   application_mailer:
+    salutation: "%{name},"
     settings: 'E-Mail-Einstellungen ändern: %{link}'
     signature: Mastodon-Benachrichtigungen von %{instance}
-    view: 'Darstellung:'
+    view: 'Ansehen:'
   applications:
+    created: Anwendung erstellt
+    destroyed: Anwendung gelöscht
     invalid_url: Die angegebene URL ist ungültig
+    regenerate_token: Zugangs-Token neu erstellen
+    token_regenerated: Zugangs-Token neu erstellt
+    warning: Sei mit diesen Daten sehr vorsichtig! Teile sie niemandem mit.
+    your_token: Dein Zugangs-Token
   auth:
-    change_password: Passwort ändern
-    didnt_get_confirmation: Keine Bestätigung bekommen?
+    agreement_html: Indem du dich registrierst, erklärst du dich mit unseren <a href="%{rules_path}">Geschäftsbedingungen</a> und der <a href="%{terms_path}">Datenschutzerklärung</a> einverstanden.
+    change_password: Sicherheit
+    delete_account: Konto löschen
+    delete_account_html: Falls du dein Konto löschen willst, kannst du <a href="%{path}">hier damit fortfahren</a>. Du wirst um Bestätigung gebeten werden.
+    didnt_get_confirmation: Keine Bestätigungs-Mail erhalten?
     forgot_password: Passwort vergessen?
+    invalid_reset_password_token: Das Token zum Zurücksetzen des Passworts ist ungültig oder abgelaufen. Bitte fordere ein neues an.
     login: Anmelden
     logout: Abmelden
     register: Registrieren
-    resend_confirmation: Bestätigung nochmal versenden
+    resend_confirmation: Bestätigungs-Mail erneut versenden
     reset_password: Passwort zurücksetzen
     set_new_password: Neues Passwort setzen
   authorize_follow:
     error: Das Profil konnte nicht geladen werden
     follow: Folgen
+    follow_request: 'Du hast eine Folgeanfrage gesendet an:'
+    following: 'Erfolg! Du folgst nun:'
+    post_follow:
+      close: Oder du schließt einfach dieses Fenster.
+      return: Zurück zum Profil dieses Wesens
+      web: Das Web öffnen
     title: "%{acct} folgen"
   datetime:
     distance_in_words:
@@ -181,18 +320,44 @@ de:
       x_minutes: "%{count}m"
       x_months: "%{count}mo"
       x_seconds: "%{count}s"
+  deletes:
+    bad_password_msg: Falsches Passwort
+    confirm_password: Gib dein derzeitiges Passwort ein, um deine Identität zu bestätigen
+    description_html: Hiermit wird <strong>dauerhaft und unwiederbringlich</strong> der Inhalt deines Kontos gelöscht und dein Konto deaktiviert. Dein Profilname wird reserviert, um künftige Imitationen zu verhindern.
+    proceed: Konto löschen
+    success_msg: Dein Konto wurde erfolgreich gelöscht
+    warning_html: Wir können nur dafür garantieren, dass die Inhalte auf dieser einen Instanz gelöscht werden. Bei Inhalten, die weit verbreitet wurden, ist es wahrscheinlich, dass Spuren bleiben werden. Server, die offline sind oder keine Benachrichtigungen von deinem Konto mehr empfangen, werden ihre Datenbanken nicht bereinigen.
+    warning_title: Verfügbarkeit verstreuter Inhalte
   errors:
-    '404': Die Seite, die du gesucht hast, existiert nicht.
-    '410': Die Seite, die du gesucht hast, existiert nicht mehr.
+    '403': Dir fehlt die Befugnis, diese Seite sehen zu können.
+    '404': Diese Seite existiert nicht.
+    '410': Diese Seite existiert nicht mehr.
     '422':
       content: Sicherheitsüberprüfung fehlgeschlagen. Blockierst du Cookies?
       title: Sicherheitsüberprüfung fehlgeschlagen
+    '429': Du wurdest gedrosselt
+    '500':
+      content: Bitte verzeih, etwas ist bei uns schief gegangen.
+      title: Diese Seite ist kaputt
+    noscript_html: Bitte aktiviere JavaScript, um die Mastodon-Web-Anwendung zu verwenden. Alternativ kannst du auch eine der <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">nativen Mastodon-Anwendungen</a> für deine Plattform probieren.
   exports:
-    blocks: Du blockierst
+    blocks: Du hast blockiert
     csv: CSV
     follows: Du folgst
-    mutes: Du schaltest stumm
+    mutes: Du hast stummgeschaltet
     storage: Medienspeicher
+  followers:
+    domain: Instanz
+    explanation_html: Wenn du sicherstellen willst, dass deine Beiträge privat sind, musst du wissen, wer dir folgt. <strong>Deine privaten Beiträge werden an alle Instanzen weitergegeben, auf denen Menschen registriert sind, die dir folgen.</strong> Wenn du den Betreibenden einer Instanz misstraust und du befürchtest, dass sie deine Privatsphäre missachten könnten, kannst du sie hier entfernen.
+    followers_count: Zahl der Folgenden
+    lock_link: dein Konto sperrst
+    purge: Von der Liste deiner Folgenden löschen
+    success:
+      one: Folgende von einer Domain werden soft-geblockt …
+      other: Folgende von %{count} Domains werden soft-geblockt …
+    true_privacy_html: Bitte beachte, dass <strong>wirklicher Schutz deiner Privatsphäre nur durch Ende-zu-Ende-Verschlüsselung erreicht werden kann.</strong>.
+    unlocked_warning_html: Wer dir folgen will, kann dies jederzeit ohne deine vorige Einverständnis tun und erhält damit automatisch Zugriff auf deine privaten Beiträge. Wenn du %{lock_link}, kannst du vorab entscheiden, wer dir folgen darf und wer nicht.
+    unlocked_warning_title: Dein Konto ist nicht gesperrt
   generic:
     changes_saved_msg: Änderungen gespeichert!
     powered_by: angetrieben von %{link}
@@ -201,8 +366,8 @@ de:
       one: Etwas ist noch nicht ganz richtig! Bitte korrigiere den Fehler
       other: Etwas ist noch nicht ganz richtig! Bitte korrigiere %{count} Fehler
   imports:
-    preface: Du kannst bestimmte Daten wie die Leute, denen du folgst oder die du blockierst, in dein Konto auf dieser Instanz aus einem Export von einer anderen importieren.
-    success: Deine Daten wurden erfolgreich hochgeladen und werden in Kürze verabeitet
+    preface: Daten, die du aus einer anderen Instanz exportiert hast, kannst du hier importieren. Beispielsweise die Liste derjenigen, denen du folgst oder die du blockiert hast.
+    success: Deine Daten wurden erfolgreich hochgeladen und werden in Kürze verarbeitet
     types:
       blocking: Blockierliste
       following: Folgeliste
@@ -219,26 +384,26 @@ de:
       body: 'Hier ist eine kurze Zusammenfasung dessen, was du auf %{instance} seit deinem letzten Besuch am %{since} verpasst hast:'
       mention: "%{name} hat dich erwähnt:"
       new_followers_summary:
-        one: Du hast einen neuen Folgenden bekommen! Juhu!
-        other: Du hast %{count} neue Folgende bekommen! Großartig!
+        one: Ein weiteres Wesen folgt dir nun! Juhu!
+        other: "%{count} weitere Wesen folgen dir nun! Großartig!"
       subject:
         one: "1 neue Mitteilung seit deinem letzten Besuch \U0001F418"
         other: "%{count} neue Mitteilungen seit deinem letzten Besuch \U0001F418"
     favourite:
       body: 'Dein Beitrag wurde von %{name} favorisiert:'
-      subject: "%{name} hat deinen Beitrag favorisiert."
+      subject: "%{name} hat deinen Beitrag favorisiert"
     follow:
       body: "%{name} folgt dir jetzt!"
-      subject: "%{name} folgt dir jetzt."
+      subject: "%{name} folgt dir jetzt"
     follow_request:
       body: "%{name} möchte dir folgen:"
-      subject: "%{name} möchte dir folgen."
+      subject: "%{name} möchte dir folgen"
     mention:
       body: "%{name} hat dich erwähnt:"
-      subject: "%{name} hat dich erwähnt."
+      subject: "%{name} hat dich erwähnt"
     reblog:
-      body: 'Dein Beitrag wurde von %{name} geteilt:'
-      subject: "%{name} teilte deinen Beitrag."
+      body: "%{name} hat deinen Beitrag geteilt:"
+      subject: "%{name} hat deinen Beitrag geteilt"
   number:
     human:
       decimal_units:
@@ -254,49 +419,126 @@ de:
     next: Vorwärts
     prev: Zurück
     truncate: "&hellip;"
+  preferences:
+    languages: Sprachen
+    other: Weiteres
+    publishing: Beiträge
+    web: Web
+  push_notifications:
+    favourite:
+      title: "%{name} hat deinen Beitrag favorisiert"
+    follow:
+      title: "%{name} folgt dir nun"
+    group:
+      title: "%{count} Benachrichtigungen"
+    mention:
+      action_boost: Teilen
+      action_expand: Mehr anzeigen
+      action_favourite: Favorisieren
+      title: "%{name} hat dich erwähnt"
+    reblog:
+      title: "%{name} hat deinen Beitrag geteilt"
   remote_follow:
-    acct: Dein Profilname@Domain, von dem aus du dieser Person folgen möchtest.
-    missing_resource: Die erforderliche Weiterleitungs-URL konnte leider in deinem Profil nicht gefunden werden.
+    acct: Profilname@Domain, von wo aus du dieser Person folgen möchtest
+    missing_resource: Die erforderliche Weiterleitungs-URL für dein Konto konnte nicht gefunden werden
     proceed: Weiter
     prompt: 'Du wirst dieser Person folgen:'
+  sessions:
+    activity: Letzte Aktivität
+    browser: Browser
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      firefox: Firefox
+      generic: Unbekannter Browser
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi Browser
+      opera: Opera
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Aktuelle Sitzung
+    description: "%{browser} auf %{platform}"
+    explanation: Dies sind die Webbrowser, die derzeit in dein Mastodon-Konto eingeloggt sind.
+    ip: IP-Adresse
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      other: unbekannter Plattform
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Schließen
+    revoke_success: Sitzung erfolgreich geschlossen
+    title: Sitzungen
   settings:
     authorized_apps: Autorisierte Anwendungen
     back: Zurück zu Mastodon
+    delete: Konto löschen
+    development: Entwicklung
     edit_profile: Profil bearbeiten
     export: Datenexport
+    followers: Autorisierte Folgende
     import: Datenimport
+    notifications: Benachrichtigungen
     preferences: Einstellungen
     settings: Einstellungen
     two_factor_authentication: Zwei-Faktor-Authentisierung
+    your_apps: Deine Anwendungen
   statuses:
     open_in_web: Im Web öffnen
     over_character_limit: Zeichenlimit von %{max} überschritten
+    pin_errors:
+      limit: Du kannst nicht noch mehr Beiträge anheften
+      ownership: Du kannst nur eigene Beiträge anheften
+      private: Du kannst nur öffentliche Beiträge anheften
+      reblog: Du kannst keine geteilten Beiträge anheften
     show_more: Mehr anzeigen
     visibilities:
-      private: Nur Folgenden zeigen
+      private: Nur Folgende
+      private_long: Nur für Folgende sichtbar
       public: Öffentlich
-      unlisted: Öffentlich, aber nicht auf der öffentlichen Zeitleiste anzeigen
+      public_long: Für alle sichtbar
+      unlisted: Nicht gelistet
+      unlisted_long: Für alle sichtbar, aber nicht in öffentlichen Zeitleisten aufgelistet
   stream_entries:
-    click_to_show: Klicken um zu zeigen
+    click_to_show: Klicken, um zu zeigen
+    pinned: Angehefteter Beitrag
     reblogged: teilte
-    sensitive_content: Sensible Inhalte
+    sensitive_content: Heikle Inhalte
+  themes:
+    default: Mastodon
   time:
     formats:
       default: "%d.%m.%Y %H:%M"
   two_factor_authentication:
-    code_hint: Gib den Code, den deine Authenticator-App generiert hat, zur Bestätigung an
-    description_html: Wenn du <strong>Zwei-Faktor-Authentisierung</strong> aktivierst, wirst du dein Telefon zum Anmelden benötigen, welches Tokens für dich generiert, die du eingeben musst.
+    code_hint: Gib zur Bestätigung den Code ein, den deine Authenticator-App generiert hat
+    description_html: Wenn du <strong>Zwei-Faktor-Authentisierung (2FA)</strong> aktivierst, wirst du dein Telefon zum Anmelden benötigen. Darauf werden Tokens erzeugt, die du bei der Anmeldung eingeben musst.
     disable: Deaktivieren
     enable: Aktivieren
+    enabled: Zwei-Faktor-Authentisierung ist aktiviert
     enabled_success: Zwei-Faktor-Authentisierung erfolgreich aktiviert
     generate_recovery_codes: Wiederherstellungscodes generieren
-    instructions_html: "<strong>Lese diesen QR-Code mit Google Authenticator oder einer ähnlichen TOTP-App auf deinem Telefon ein</strong>. Von nun an wird diese App Tokens generieren, die du beim Anmelden eingeben musst."
-    lost_recovery_codes: Wiederherstellungscodes erlauben dir, wieder den Zugang zu deinem Konto zu erlangen, falls du dein Telefon verlierst. Wenn du deine Wiederherstellungscodes verloren hast, kannst du sie hier regenerieren. Deine alten Wiederherstellungscodes werden damit ungültig gemacht.
+    instructions_html: "<strong>Lies diesen QR-Code mit Google Authenticator oder einer ähnlichen TOTP-App auf deinem Telefon ein.</strong> Von nun an wird diese App Tokens generieren, die du beim Anmelden eingeben musst."
+    lost_recovery_codes: Wiederherstellungscodes erlauben dir, wieder den Zugang zu deinem Konto zu erlangen, falls du dein Telefon verlieren solltest. Wenn du deine Wiederherstellungscodes verloren hast, kannst du sie hier neu generieren. Deine alten Wiederherstellungscodes werden damit ungültig gemacht.
     manual_instructions: 'Wenn du den QR-Code nicht einlesen kannst und ihn manuell eingeben musst, ist hier das Klartext-Geheimnis:'
-    recovery_codes_regenerated: Wiederherstellungscodes erfolgreich regeneriert
-    recovery_instructions_html: Wenn du jemals den Zugang zu deinem Telefon verlierst, kannst du einen der Wiederherstellungscodes unten benutzen, um wieder auf dein Konto zugreifen zu können. Bewahre die Wiederherstellungscodes sicher auf, indem du sie beispielsweise ausdruckst und sie zusammen mit anderen wichtigen Dokumenten lagerst.
+    recovery_codes: Wiederherstellungs-Codes sichern
+    recovery_codes_regenerated: Wiederherstellungscodes erfolgreich neu generiert
+    recovery_instructions_html: Wenn du den Zugang zu deinem Telefon verlieren solltest, kannst du einen untenstehenden Wiederherstellungscodes benutzen, um wieder auf dein Konto zugreifen zu können. <strong>Bewahre die Wiederherstellungscodes gut auf.</strong> Du könntest sie beispielsweise ausdrucken und bei deinen restlichen wichtigen Dokumenten aufbewahren.
     setup: Einrichten
-    wrong_code: Der eingegebene Code war ungültig! Sind die Server- und die Gerätezeit korrekt?
+    wrong_code: Der eingegebene Code war ungültig! Stimmen Serverzeit und Gerätezeit?
   users:
-    invalid_email: Ungültige E-Mail-Addresse
+    invalid_email: Ungültige E-Mail-Adresse
     invalid_otp_token: Ungültiger Zwei-Faktor-Authentisierungs-Code
+    signed_in_as: 'Angemeldet als:'
diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml
index 035a4713c..6154231c7 100644
--- a/config/locales/devise.de.yml
+++ b/config/locales/devise.de.yml
@@ -2,53 +2,53 @@
 de:
   devise:
     confirmations:
-      confirmed: Vielen Dank für deine Registrierung. Bitte melde dich jetzt an.
-      send_instructions: Du erhältst in wenigen Minuten eine E-Mail, mit der du deine Registrierung bestätigen kannst.
-      send_paranoid_instructions: Falls Deine E-Mail-Adresse in unserer Datenbank existiert, erhältst Du in wenigen Minuten eine E-Mail mit der du deine Registrierung bestätigen kannst.
+      confirmed: Deine E-Mail-Adresse wurde bestätigt.
+      send_instructions: Du erhältst in wenigen Minuten eine E-Mail. Darin wird erklärt, wie du deine E-Mail-Adresse bestätigen kannst. Schau bitte auch in deinen Spam-Ordner!
+      send_paranoid_instructions: Falls deine E-Mail-Adresse in unserer Datenbank hinterlegt ist, erhältst du in wenigen Minuten eine E-Mail. Darin wird erklärt, wie du deine E-Mail-Adresse bestätigen kannst. Schau bitte auch in deinen Spam-Ordner!
     failure:
       already_authenticated: Du bist bereits angemeldet.
-      inactive: Dein Account ist nicht aktiv.
-      invalid: Ungültige Anmeldedaten.
-      last_attempt: Du hast noch einen Versuch bevor dein Account gesperrt wird.
-      locked: Dein Account ist gesperrt.
-      not_found_in_database: E-Mail-Adresse oder Passwort ungültig.
-      timeout: Deine Sitzung ist abgelaufen, bitte melde dich erneut an.
-      unauthenticated: Du musst Dich anmelden oder registrieren, bevor du fortfahren kannst.
-      unconfirmed: Du musst deinen Account bestätigen, bevor du fortfahren kannst.
+      inactive: Dein Konto wurde noch nicht aktiviert.
+      invalid: "%{authentication_keys} oder Passwort ungültig."
+      last_attempt: Du hast noch einen Versuch, bevor dein Konto gesperrt wird.
+      locked: Dein Konto ist gesperrt.
+      not_found_in_database: "%{authentication_keys} oder Passwort ungültig."
+      timeout: Deine Sitzung ist abgelaufen. Bitte melde dich erneut an.
+      unauthenticated: Du musst dich anmelden oder registrieren, bevor du fortfahren kannst.
+      unconfirmed: Du musst deine E-Mail-Adresse bestätigen, bevor du fortfahren kannst.
     mailer:
       confirmation_instructions:
-        subject: 'Mastodon: Anleitung zur Bestätigung deines Accounts'
+        subject: 'Mastodon: Bestätigung deines Kontos bei %{instance}'
       password_change:
-        subject: 'Mastodon: Passwort wurde geändert'
+        subject: 'Mastodon: Passwort geändert'
       reset_password_instructions:
-        subject: 'Mastodon: Anleitung um dein Passwort zurückzusetzen'
+        subject: 'Mastodon: Passwort zurücksetzen'
       unlock_instructions:
-        subject: 'Mastodon: Anleitung um deinen Account freizuschalten'
+        subject: 'Mastodon: Konto entsperren'
     omniauth_callbacks:
-      failure: Du konntest nicht mit deinem %{kind}-Account angemeldet werden, weil '%{reason}'.
-      success: Du hast dich erfolgreich mit Deinem %{kind}-Account angemeldet.
+      failure: Du konntest nicht mit deinem %{kind}-Konto angemeldet werden, weil »%{reason}«.
+      success: Du hast dich erfolgreich mit deinem %{kind}-Konto angemeldet.
     passwords:
       no_token: Du kannst diese Seite nur über den Link aus der E-Mail zum Passwort-Zurücksetzen aufrufen. Wenn du einen solchen Link aufgerufen hast, stelle bitte sicher, dass du die vollständige Adresse aufrufst.
-      send_instructions: Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie du dein Passwort zurücksetzen kannst.
-      send_paranoid_instructions: Falls deine E-Mail-Adresse in unserer Datenbank existiert erhältst du in wenigen Minuten eine E-Mail mit der Anleitung, wie du dein Passwort zurücksetzen kannst.
+      send_instructions: Du erhältst in wenigen Minuten eine E-Mail. Darin wird erklärt, wie du dein Passwort zurücksetzen kannst.
+      send_paranoid_instructions: Falls deine E-Mail-Adresse in unserer Datenbank hinterlegt ist, erhältst du in wenigen Minuten eine E-Mail. Darin wird erklärt, wie du dein Passwort zurücksetzen kannst.
       updated: Dein Passwort wurde geändert. Du bist jetzt angemeldet.
       updated_not_active: Dein Passwort wurde geändert.
     registrations:
-      destroyed: Dein Account wurde gelöscht.
+      destroyed: Dein Konto wurde gelöscht.
       signed_up: Du hast dich erfolgreich registriert.
-      signed_up_but_inactive: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account inaktiv ist.
-      signed_up_but_locked: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account gesperrt ist.
-      signed_up_but_unconfirmed: Du hast Dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account noch nicht bestätigt ist. Du erhältst in Kürze eine E-Mail mit der Anleitung, wie Du Deinen Account freischalten kannst.
-      update_needs_confirmation: Deine Daten wurden aktualisiert, aber du musst deine neue E-Mail-Adresse bestätigen. Du erhälst in wenigen Minuten eine E-Mail, mit der du die Änderung deiner E-Mail-Adresse abschließen kannst.
+      signed_up_but_inactive: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Konto inaktiv ist.
+      signed_up_but_locked: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Konto gesperrt ist.
+      signed_up_but_unconfirmed: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Konto noch nicht bestätigt ist. Du erhältst in Kürze eine E-Mail. Darin ist erklärt, wie du dein Konto freischalten kannst.
+      update_needs_confirmation: Deine Daten wurden aktualisiert, aber du musst deine neue E-Mail-Adresse bestätigen. Du erhältst in wenigen Minuten eine E-Mail. Darin ist erklärt, wie du die Änderung deiner E-Mail-Adresse abschließen kannst.
       updated: Deine Daten wurden aktualisiert.
     sessions:
       already_signed_out: Erfolgreich abgemeldet.
       signed_in: Erfolgreich angemeldet.
       signed_out: Erfolgreich abgemeldet.
     unlocks:
-      send_instructions: Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie du deinen Account entsperren können.
-      send_paranoid_instructions: Falls deine E-Mail-Adresse in unserer Datenbank existiert erhältst du in wenigen Minuten eine E-Mail mit der Anleitung, wie du deinen Account entsperren kannst.
-      unlocked: Dein Account wurde entsperrt. Du bist jetzt angemeldet.
+      send_instructions: Du erhältst in wenigen Minuten eine E-Mail. Darin wird erklärt, wie du dein Konto entsperren kannst.
+      send_paranoid_instructions: Falls deine E-Mail-Adresse in unserer Datenbank hinterlegt ist, erhältst du in wenigen Minuten eine E-Mail. Darin wird erklärt, wie du dein Konto entsperren kannst.
+      unlocked: Dein Konto wurde entsperrt. Du bist jetzt angemeldet.
   errors:
     messages:
       already_confirmed: wurde bereits bestätigt.
diff --git a/config/locales/doorkeeper.de.yml b/config/locales/doorkeeper.de.yml
index 1588e4f9e..d7d98c6d6 100644
--- a/config/locales/doorkeeper.de.yml
+++ b/config/locales/doorkeeper.de.yml
@@ -3,17 +3,19 @@ de:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: Name
-        redirect_uri: Redirect-URI
+        name: Name der Anwendung
+        redirect_uri: Weiterleitungs-URI
+        scopes: Befugnisse
+        website: Website der Anwendung
     errors:
       models:
         doorkeeper/application:
           attributes:
             redirect_uri:
               fragment_present: darf kein Fragment enthalten.
-              invalid_uri: muss ein valider URI (Identifier) sein.
-              relative_uri: muss ein absoluter URI (Identifier) sein.
-              secured_uri: muss ein HTTPS/SSL-URI (Identifier) sein.
+              invalid_uri: muss ein valider URI sein.
+              relative_uri: muss ein absoluter URI sein.
+              secured_uri: muss ein HTTPS/SSL-URI sein.
   doorkeeper:
     applications:
       buttons:
@@ -25,27 +27,31 @@ de:
       confirmations:
         destroy: Bist du sicher?
       edit:
-        title: Applikation bearbeiten
+        title: Anwendung bearbeiten
       form:
         error: Hoppla! Bitte überprüfe das Formular auf Fehler!
       help:
         native_redirect_uri: "%{native_redirect_uri} für lokale Tests benutzen"
         redirect_uri: Bitte benutze eine Zeile pro URI
-        scopes: Bitte die "Scopes" mit Leerzeichen trennen. Bitte frei lassen für die Verwendung der Default-Werte.
+        scopes: Bitte die Befugnisse mit Leerzeichen trennen. Zur Verwendung der Standardwerte freilassen.
       index:
+        application: Anwendung
         callback_url: Callback-URL
+        delete: Löschen
         name: Name
-        new: Neue Applikation
-        title: Deine Applikationen
+        new: Neue Anwendung
+        scopes: Befugnisse
+        show: Zeigen
+        title: Deine Anwendungen
       new:
-        title: Neue Applikation
+        title: Neue Anwendung
       show:
         actions: Aktionen
-        application_id: Applikations-ID
+        application_id: Client-Schlüssel
         callback_urls: Callback-URLs
-        scopes: Scopes
-        secret: Secret
-        title: 'Applikation: %{name}'
+        scopes: Befugnisse
+        secret: Client-Secret
+        title: 'Anwendung: %{name}'
     authorizations:
       buttons:
         authorize: Autorisieren
@@ -53,61 +59,61 @@ de:
       error:
         title: Ein Fehler ist aufgetreten
       new:
-        able_to: 'Diese Anwendung wird folgende Rechte haben:'
-        prompt: Soll %{client_name} für die Benutzung dieses Accounts autorisiert werden?
+        able_to: 'Sie wird folgende Befugnisse haben:'
+        prompt: Die Anwendung %{client_name} verlangt Zugriff auf dein Konto
         title: Autorisierung erforderlich
       show:
-        title: Copy this authorization code and paste it to the application.
+        title: Kopiere diesen Autorisierungs-Code und füge ihn in die Anwendung ein.
     authorized_applications:
       buttons:
-        revoke: Ungültig machen
+        revoke: Widerrufen
       confirmations:
         revoke: Bist du sicher?
       index:
-        application: Applikation
-        created_at: erstellt am
-        date_format: "%Y-%m-%d %H:%M:%S"
-        scopes: Scopes
-        title: Deine autorisierten Applikationen
+        application: Anwendung
+        created_at: autorisiert am
+        date_format: "%d.%m.%Y %H:%M:%S"
+        scopes: Befugnisse
+        title: Deine autorisierten Anwendungen
     errors:
       messages:
-        access_denied: Der Ressourcenbesitzer oder der Autorisierungs-Server hat die Anfrage verweigert.
-        credential_flow_not_configured: 'Die Prozedur "Resource Owner Password Credentials" ist fehlgeschlagen: Doorkeeper.configure.resource_owner_from_credentials ist nicht konfiguriert.'
-        invalid_client: 'Client-Autorisierung MKIM ist fehlgeschlagen: Unbekannter Client, keine Autorisierung mitgeliefert oder Autorisierungsmethode nicht unterstützt.'
-        invalid_grant: Die bereitgestellte Autorisierung ist inkorrekt, abgelaufen, widerrufen, ist mit einem anderen Client verknüpft oder der Redirection URI stimmt nicht mit der Autorisierungs-Anfrage überein.
-        invalid_redirect_uri: Der Redirect-URI in der Anfrage ist ungültig.
-        invalid_request: Die Anfrage enthält einen nicht-unterstützten Parameter, ein Parameter fehlt oder sie ist anderweitig fehlerhaft.
-        invalid_resource_owner: Die angegebenen Zugangsdaten für den "Resource Owner" sind inkorrekt oder dieses Profil existiert nicht.
-        invalid_scope: Der angeforderte Scope ist inkorrekt, unbekannt oder fehlerhaft.
+        access_denied: Der »resource owner« oder der Autorisierungs-Server hat die Anfrage verweigert.
+        credential_flow_not_configured: Die Prozedur »Resource Owner Password Credentials« schlug fehl, da Doorkeeper.configure.resource_owner_from_credentials nicht konfiguriert ist.
+        invalid_client: 'Client-Authentifizierung ist fehlgeschlagen: Client unbekannt, keine Authentisierung mitgeliefert oder Authentisierungsmethode wird nicht unterstützt.'
+        invalid_grant: Die beigefügte Autorisierung ist ungültig, abgelaufen, wurde widerrufen, einem anderen Client ausgestellt oder der Weiterleitungs-URI stimmt nicht mit der Autorisierungs-Anfrage überein.
+        invalid_redirect_uri: Der beigefügte Weiterleitungs-URI ist ungültig.
+        invalid_request: Die Anfrage enthält ein nicht-unterstütztes Argument, ein Parameter fehlt, oder sie ist anderweitig fehlerhaft.
+        invalid_resource_owner: Die angegebenen Zugangsdaten für den »resource owner« sind ungültig, oder dieses Profil existiert nicht.
+        invalid_scope: Die angeforderte Befugnis ist ungültig, unbekannt oder fehlerhaft.
         invalid_token:
-          expired: Der Zugriffstoken ist abgelaufen
-          revoked: Der Zugriffsoken wurde annuliert
-          unknown: Der Zugriffsoken ist ungültig
-        resource_owner_authenticator_not_configured: 'Die Prozedur "Resource Owner find" ist fehlgeschlagen: Doorkeeper.configure.resource_owner_authenticator ist nicht konfiguriert.'
-        server_error: Der Autorisierungs-Server hat ein unerwartetes Problem festgestellt und konnte die Anfrage nicht beenden.
-        temporarily_unavailable: Der Autorisierungs-Server ist derzeit auf Grund von temporärer Überlastung oder Wartungsarbeiten am Server nicht in der Lage, die Anfrage zu bearbeiten .
-        unauthorized_client: Der Client ist nicht autorisiert, diese Anfrage mit dieser Methode auszuführen.
+          expired: Der Zugriffs-Token ist abgelaufen
+          revoked: Der Zugriffs-Token wurde widerrufen
+          unknown: Der Zugriffs-Token ist ungültig
+        resource_owner_authenticator_not_configured: Die Prozedur »Resource Owner find« ist fehlgeschlagen, da Doorkeeper.configure.resource_owner_authenticator nicht konfiguriert ist.
+        server_error: Der Autorisierungs-Server hat ein unerwartetes Problem festgestellt und konnte die Anfrage nicht bearbeiten.
+        temporarily_unavailable: Der Autorisierungs-Server ist aufgrund von zwischenzeitlicher Überlastung oder Wartungsarbeiten derzeit nicht in der Lage, die Anfrage zu bearbeiten.
+        unauthorized_client: Der Client ist nicht dazu autorisiert, diese Anfrage mit dieser Methode auszuführen.
         unsupported_grant_type: Der Autorisierungs-Typ wird nicht vom Autorisierungs-Server unterstützt.
         unsupported_response_type: Der Autorisierungs-Server unterstützt diesen Antwort-Typ nicht.
     flash:
       applications:
         create:
-          notice: Applikation erstellt.
+          notice: Anwendung erstellt.
         destroy:
-          notice: Applikation gelöscht.
+          notice: Anwendung gelöscht.
         update:
-          notice: Applikation aktualisiert.
+          notice: Anwendung aktualisiert.
       authorized_applications:
         destroy:
-          notice: Applikation widerrufen.
+          notice: Anwendung widerrufen.
     layouts:
       admin:
         nav:
-          applications: Applikationen
+          applications: Anwendungen
           oauth2_provider: OAuth2-Anbieter
       application:
         title: OAuth-Autorisierung nötig
     scopes:
-      follow: Profil folgen, blocken, entblocken und entfolgen
-      read: deine Daten lesen
-      write: Beiträge von deinem Konto aus veröffentlichen
+      follow: Konten folgen, blocken, entblocken und entfolgen
+      read: deine Daten auslesen
+      write: Beiträge in deinem Namen veröffentlichen
diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml
index 3398b248d..88a8ec12f 100644
--- a/config/locales/doorkeeper.fr.yml
+++ b/config/locales/doorkeeper.fr.yml
@@ -59,7 +59,7 @@ fr:
         prompt: Autoriser %{client_name} à utiliser votre compte ?
         title: Autorisation requise
       show:
-        title: Copy this authorization code and paste it to the application.
+        title: Copiez ce code d'autorisation et collez-le dans l'application.
     authorized_applications:
       buttons:
         revoke: Annuler
@@ -112,4 +112,4 @@ fr:
     scopes:
       follow: s’abonner, se désabonner, bloquer et débloquer des comptes
       read: lire les données de votre compte
-      write: poster en tant que vous
+      write: poster en votre nom
diff --git a/config/locales/en.yml b/config/locales/en.yml
index f87d8532c..7d2596fc6 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -2,6 +2,7 @@
 en:
   about:
     about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail.
+    about_hashtag_html: These are public toots tagged with <strong>#%{hashtag}</strong>. You can interact with them if you have an account anywhere in the fediverse.
     about_this: About
     closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there.
     contact: Contact
@@ -75,6 +76,7 @@ en:
         silenced: Silenced
         suspended: Suspended
         title: Moderation
+      moderation_notes: Moderation notes
       most_recent_activity: Most recent activity
       most_recent_ip: Most recent IP
       not_subscribed: Not subscribed
@@ -108,11 +110,27 @@ en:
       unsubscribe: Unsubscribe
       username: Username
       web: Web
+
+    account_moderation_notes:
+      account: Moderator
+      created_at: Date
+      create: Create
+      created_msg: Moderation note successfully created!
+      delete: Delete
+      destroyed_msg: Moderation note successfully destroyed!
+
     custom_emojis:
+      copied_msg: Successfully created local copy of the emoji
+      copy: Copy
+      copy_failed_msg: Could not make a local copy of that emoji
       created_msg: Emoji successfully created!
       delete: Delete
       destroyed_msg: Emojo successfully destroyed!
+      disable: Disable
+      disabled_msg: Successfully disabled that emoji
       emoji: Emoji
+      enable: Enable
+      enabled_msg: Successfully enabled that emoji
       image_hint: PNG up to 50KB
       new:
         title: Add new custom emoji
@@ -152,6 +170,16 @@ en:
         undo: Undo
       title: Domain Blocks
       undo: Undo
+    email_domain_blocks:
+      add_new: Add new
+      created_msg: Email domain block successfully created
+      delete: Delete
+      destroyed_msg: Email domain block successfully deleted
+      domain: Domain
+      new:
+        create: Create block
+        title: New email domain block
+      title: Email Domain Block
     instances:
       account_count: Known accounts
       domain_name: Domain
@@ -393,6 +421,11 @@ en:
     next: Next
     prev: Prev
     truncate: "&hellip;"
+  preferences:
+    languages: Languages
+    other: Other
+    publishing: Publishing
+    web: Web
   push_notifications:
     favourite:
       title: "%{name} favourited your status"
@@ -460,6 +493,7 @@ en:
     export: Data export
     followers: Authorized followers
     import: Import
+    notifications: Notifications
     preferences: Preferences
     settings: Settings
     two_factor_authentication: Two-factor Authentication
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 21def0c5f..0bf195d1b 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -7,30 +7,248 @@ eo:
     description_headline: Kio estas %{domain}?
     domain_count_after: aliaj aperaĵoj
     domain_count_before: Konektita al
+    hosted_on: Mastodon gastigita sur %{domain}
+    learn_more: Lernu pli
     other_instances: Aliaj aperaĵoj
     source_code: Fontkodo
     status_count_after: mesaĝoj
     status_count_before: Kiu publikigis
     user_count_after: uzantoj
     user_count_before: Hejmo de
+    what_is_mastodon: Kio estas Mastodon?
   accounts:
     follow: Sekvi
     followers: Sekvantoj
     following: Sekvatoj
+    media: Kumunikiloj
     nothing_here: Estas nenio ĉi tie!
     people_followed_by: Sekvatoj de %{name}
     people_who_follow: Sekvantoj de %{name}
     posts: Mesaĝoj
+    posts_with_replies: Tootoj kun respondaj
     remote_follow: Fore sekvi
+    reserved_username: La usantnomo estas reservis
+    roles:
+      admin: Administranto
     unfollow: Malsekvi
+  admin:
+    accounts:
+      are_you_sure: Ĉu vi certe?
+      confirm: Confirmi
+      confirmed: Confirmis
+      disable_two_factor_authentication: Malebligi 2FA
+      display_name: Montri nomo
+      domain: Domajno
+      edit: Redakti
+      email: Retpoŝto
+      followers: Sekvantoj
+      followers_url: Sekvantoj URL
+      follows: Sekvatoj
+      ip: IP
+      location:
+        all: Ĉio
+        local: Loka
+        remote: Fora
+        title: Loko
+      media_attachments: Komunkiloj kunsendaĵo
+      moderation:
+        all: Ĉio
+        silenced: Silentis
+        suspended: Suspendis
+        title: Moderulo
+      most_recent_activity: Ple freŝa aktiveco
+      most_recent_ip: Ple freŝa IP
+      not_subscribed: Ne abonis
+      order:
+        alphabetic: Alfabetiko
+        most_recent: Ple freŝa
+        title: Ordono
+      perform_full_suspension: Fari kompleta suspendi
+      profile_url: Profilo URL
+      protocol: Protokolo
+      public: Publika
+      push_subscription_expires: PuSH subscription expires
+      redownload: Refreŝigi avataro
+      reset: Restarigi
+      reset_password: Restarigi pasvorto
+      resubscribe: Reaboni
+      salmon_url: Salmon URL
+      search: Serĉi
+      shared_inbox_url: Shared Inbox URL
+      show:
+        created_reports: Raportoj kreita de ĉi tiu konto
+        report: raporto
+        targeted_reports: Raportoj kreita al ĉi tiu konton
+      silence: Silenti
+      statuses: Statusoj
+      subscribe: Aboni
+      title: Kontoj
+      undo_silenced: Malfari silenti
+      undo_suspension: Malfari suspendi
+      unsubscribe: Malaboni
+      username: Uzantnomo
+      web: Ret
+    custom_emojis:
+      copied_msg: Sukcese kreis loka kopio de la emojio
+      copy: Kopi
+      copy_failed_msg: Could not make a local copy of that emoji
+      created_msg: Emojio estas kreita sukcesa!
+      delete: Forigi
+      destroyed_msg: Emojio estas forigis sukcesa!
+      disable: Malebligi
+      disabled_msg: Emojio estas malebligis sukcesa
+      emoji: Emojio
+      enable: Ebligi
+      enabled_msg: Emojio estas ebligis sukcesa
+      image_hint: PNG ĝis 50KB
+      new:
+        title: Aldoni nova kutimo emojio
+      shortcode: Malongakodo
+      shortcode_hint: At least 2 characters, only alphanumeric characters and underscores
+      title: Kutimoj emojioj
+      upload: Alŝuti
+    domain_blocks:
+      add_new: Aldoni novo
+      created_msg: Domajno bloko nun estas procesita
+      destroyed_msg: Domajno bloko estas malfaris
+      domain: Domajno
+      new:
+        create: Krei bloko
+        severity:
+          noop: Nenio
+          silence: Silenti
+          suspend: Suspendi
+        title: Nova domajno bloko
+      reject_media: Reject media files
+      severities:
+        noop: Nenio
+        silence: Silenti
+        suspend: Suspendi
+      severity: Severeco
+      show:
+        affected_accounts:
+          one: Unu konto en la datumbazo esta afekta
+          other: "%{count} kontoj en la datumbazo esta afekta"
+        retroactive:
+          silence: Malfari silenti ĉio konton de ĉi tiu domajno
+          suspend: Malfari suspendi ĉio konton de ĉi tiu domajno
+        title: Malfari domajno bloko por %{domain}
+        undo: Malfari
+      title: Domajnoj blokoj
+      undo: Malfari
+    email_domain_blocks:
+      add_new: Aldoni novo
+      created_msg: Retpoŝto domajno bloko estas kreita sukcesa
+      delete: Forigi
+      destroyed_msg: Retpoŝto domajno bloko estas foriga sukcesa
+      domain: Domajno
+      new:
+        create: Aldoni bloko
+        title: Nova retpoŝto domajno bloko
+      title: Retpoŝto domajno bloko
+    instances:
+      account_count: Konataj kontoj
+      domain_name: Domajno
+      reset: Restarigi
+      search: Serĉi
+      title: Konataj petskriboj
+    reports:
+      action_taken_by: Action taken by
+      are_you_sure: Ĉu vi certe?
+      comment:
+        label: komento
+        none: Nenio
+      delete: Forigi
+      id: ID
+      mark_as_resolved: Marki kiel solvita
+      nsfw:
+        'false': Ne kaŝi kumunikiloj kunsendaĵoj
+        'true': Kaŝi kumunikiloj kunsendaĵoj
+      report: 'Raporto #%{id}'
+      report_contents: Enhavo
+      reported_account: Raportis konto
+      reported_by: Raporta de
+      resolved: Solvita
+      silence_account: Silenti konton
+      status: Statusoj
+      suspend_account: Suspendi konton
+      target: Celo
+      title: Raportoj
+      unresolved: Ne solvita
+      view: Vidi
+    settings:
+      bootstrap_timeline_accounts:
+        desc_html: Disigi multaj uzantnomoj per komo. Nur lokaj kaj malsloŝi kontoj estus operaci. Defaŭlo Defaŭlo kiam malplena estas ĉio lokaj administristoj.
+        title: Defaŭltoj sakvatoj al novoj uzantoj
+      contact_information:
+        email: Afero retpoŝto
+        username: kontakto uzantnomo
+      registrations:
+        closed_message:
+          desc_html: Vidigis sur antaŭpaĝo kian registrado estas fermis. Vi povas uzi HTML
+          title: Fermis registrado mesaĝo
+        deletion:
+          desc_html: Permesi ĉiuj forigi ilian konton
+          title: Malfermi konto forigo
+        open:
+          desc_html: Permesi ĉiuj krei konto
+          title: Malfermi registrado
+      site_description:
+        title: Priskribo de petskribo
+      site_description_extended:
+        title: Kutimo etendis informaĵo
+      site_terms:
+        desc_html: Vi povas skribi via politika pri privateco reguloj de servo aŭ aliaj senpagaj. Vi povas uzi HTML
+        title: Kutimoj reguloj de servo
+      site_title: Petskribo nomo
+      thumbnail:
+        desc_html: Uzis por antaŭvido vojo OpenGraph kaj API. 1200x630px rekomendis
+        title: Bildeto de petskribo
+      timeline_preview:
+        desc_html: Vidigi publika tempolinio sur surteriĝo paĝo
+        title: Antaŭvido de tempolinio
+      title: Retparaĝoj preferoj
+    statuses:
+      back_to_account: Irienigi al konton paĝon
+      batch:
+        delete: Forigi
+        nsfw_off: Malŝalti NSFW
+        nsfw_on: Ŝalti NSFW
+      execute: Execute
+      failed_to_execute: Failed to execute
+      media:
+        hide: Kaŝi kumunikiloj
+        show: Vidigi kumunikiloj
+        title: Kumunikiloj
+      no_media: Neniu Kumunikilo
+      title: Kontoj statusoj
+      with_media: Kun kumunikiloj
+    subscriptions:
+      callback_url: Callback URL
+      confirmed: Confirmis
+      expires_in: Finiĝus en
+      last_delivery: plej freŝa transdono
+      title: WebSub
+      topic: Topic
+    title: Administri
+  admin_mailer:
+    new_report:
+      body: "%{reporter} raportis %{target}"
+      subject: Nova raporto por %{instance} (#%{id})
   application_mailer:
     settings: 'Ŝanĝi la retpoŝt-mesaĝajn preferojn: %{link}'
     signature: Sciigoj de Mastodon el %{instance}
     view: 'Vidi:'
   applications:
+    created: Aplikaĵo sukcesa kreis
+    destroyed: Aplikaĵo sukcesa forigis
     invalid_url: La URL donita ne estas valida
+    regenerate_token: Regeneri aliron signon
+    token_regenerated: Aliro signo regeneris sukcese
+    your_token: Via aliro signo
   auth:
     change_password: Ŝanĝi pasvorton
+    delete_account: Forigi konton
     didnt_get_confirmation: Ĉu vi ne ricevis la instrukciojn por konfirmi?
     forgot_password: Pasvorto forgesita?
     login: Ensaluti
@@ -42,6 +260,12 @@ eo:
   authorize_follow:
     error: Bedaŭrinde, okazis eraro provante konsulti la foran konton
     follow: Sekvi
+    follow_request: 'Vi sendis sekvatin peton al:'
+    following: 'Sukceso! Vi nun sekvi:'
+    post_follow:
+      close: Aŭ, Vi justa povas fermi ĉi tion.
+      return: Ilienigi al la uzantoan profilon
+      web: Iri al reto
     title: Sekvi %{acct}
   datetime:
     distance_in_words:
@@ -58,10 +282,16 @@ eo:
       x_months: "%{count}mo"
       x_seconds: "%{count}s"
   exports:
-    blocks: Vi blokas
+    blocks: Via blokoj
     csv: CSV
-    follows: Vi sekvas
+    follows: Via sekvatoj
+    mutes: Via silentoj
     storage: Mediaĵa konservado
+  followers:
+    domain: Domajno
+    followers_count: Nombro de sekvatoj
+    lock_link: Ŝlosi via konton
+    purge: Forigi de sakvantoj
   generic:
     changes_saved_msg: Ŝanĝoj senprobleme konservitaj!
     powered_by: povigita de %{link}
@@ -75,9 +305,14 @@ eo:
     types:
       blocking: Listo de blokitoj
       following: Listo de sekvatoj
+      muting: Listo de silentoj
     upload: Alporti
   landing_strip_html: "<strong>%{name}</strong> estas uzanto en %{link_to_root_path}. Vi povas sekvi tiun aŭ interagi kun tiu, se vi havas konton ie ajn en la Fediverse."
   landing_strip_signup_html: Se vi ne havas, vi povas <a href="%{sign_up_path}">membriĝi ĉi tie.</a>.
+  media_attachments:
+    validations:
+      images_and_video: Vi ne povas alligi video al statuson kiu jam havas bilojn
+      too_many: Vi ne povas alligi pli ol 4 dosieroj
   notification_mailer:
     digest:
       body: 'Jen eta resumo de tio, kio okazis en %{instance}, ekde kiam vi laste vizitis en %{since}:'
@@ -117,32 +352,79 @@ eo:
   pagination:
     next: Sekva
     prev: Malsekva
+  preferences:
+    languages: Lingvoj
+    other: Aliaj
+    publishing: Publikigi
+    web: Ret
+  push_notifications:
+    favourite:
+      title: "%{name} preferitis via statuso"
+    follow:
+      title: "%{name} estas sekvantas vin"
+    group:
+      title: "%{count} sciigoj"
+    mention:
+      action_boost: Akceli
+      action_expand: Pli
+      action_favourite: Preferi
+      title: "%{name} menciitis vin"
+    reblog:
+      title: "%{name} akcelis via statuson"
   remote_follow:
     acct: Enmetu vian uzantnomo@aperaĵo de kie vi volas sekvi tiun uzanton
     missing_resource: La URL de plusendado ne povis esti trovita
     proceed: Daŭrigi por plusendi
     prompt: 'Vi eksekvos:'
+  sessions:
+    activity: Lasta Aktiveco
+    browser: Retumilo
+    current_session: Aktuala sesio
+    description: "%{browser} sur %{platform}"
+    explanation: Ĉi tiuj estas la retumiloj nun ensalutinda en via Mastodon konton.
+    ip: IP
+    revoke: Revoki
+    revoke_success: La sesio estas revokis
+    title: Sesioj
   settings:
     authorized_apps: Rajtigitaj aplikaĵoj
     back: Reveni al Mastodon
+    delete: Konto forigo
+    development: Evoluno
     edit_profile: Redakti la profilon
     export: Elporti datumojn
+    followers: Rajtigis sekvantoj
     import: Alporti
+    notifications: Avizoj
     preferences: Preferoj
     settings: Agordoj
     two_factor_authentication: Dufaktora aŭtentigo
+    your_apps: Via aplikaĵoj
   statuses:
     open_in_web: Malfermi retumile
     over_character_limit: limo de %{max} signoj trapasita
+    pin_errors:
+      limit: Tro multaj tootoj fiksis
+      ownership: Aliaja tooto ne povas esti fiksis
+      private: Nepublika tooto ne povas esti fixis
+      reblog: Diskonigo ne povas esti fiksis
     show_more: Montri pli
     visibilities:
       private: Montri nur al sekvantoj
+      private_long: Montri nur al sekvantoj
       public: Publika
+      public_long: Ĉiuj povas vidi
       unlisted: Publika, sed ne aperos en publikaj tempolinioj
+      unlisted_long: Publika, sed ne aperos en publikaj tempolinioj
   stream_entries:
     click_to_show: Alklaki por montri
+    pinned: Fiksis
     reblogged: diskonigis
     sensitive_content: Tikla enhavo
+  terms:
+    title: "%{instance} Reguloj de servo kaj Politikaj pri privatecoj"
+  themes:
+    default: Mastodon
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 08ae90447..2da8427b8 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -1,7 +1,7 @@
 ---
 fi:
   about:
-    about_mastodon_html: Mastodon on <em>ilmainen, avoimeen lähdekoodiin perustuva</em> sosiaalinen verkosto. <em>Hajautettu</em> vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat &mdash; minkä tahansa valitset, voit vuorovaikuttaa muiden kanssa. Kuka tahansa voi luoda Mastodon palvelimen ja ottaa osaa <em>sosiaaliseen verkkoon</em> saumattomasti.
+    about_mastodon_html: Mastodon on <em>vapaa, avoimeen lähdekoodiin perustuva</em> sosiaalinen verkosto. <em>Hajautettu</em> vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat &mdash; minkä tahansa valitset, voit vuorovaikuttaa muiden kanssa. Kuka tahansa voi luoda Mastodon palvelimen ja ottaa osaa <em>sosiaaliseen verkkoon</em> saumattomasti.
     about_this: Tietoja tästä palvelimesta
     contact: Ota yhteyttä
     description_headline: Mikä on %{domain}?
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 5ffc09ab9..3d6f2fd0b 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -152,6 +152,16 @@ ja:
         undo: 元に戻す
       title: ドメインブロック
       undo: 元に戻す
+    email_domain_blocks:
+      add_new: 新規追加
+      created_msg: 処理を完了しました
+      delete: 消去
+      destroyed_msg: 消去しました
+      domain: ドメイン
+      new:
+        create: ブロックを作成
+        title: 新規メールドメインブロック
+      title: メールドメインブロック
     instances:
       account_count: 既知のアカウント数
       domain_name: ドメイン名
@@ -244,9 +254,10 @@ ja:
       body: "%{reporter} が %{target} を通報しました"
       subject: "%{instance} の新しい通報 (#%{id})"
   application_mailer:
+    salutation: "%{name} さん"
     settings: 'メール設定の変更: %{link}'
     signature: Mastodon %{instance} インスタンスからの通知
-    view: 'View:'
+    view: リンク
   applications:
     created: アプリが作成されました
     destroyed: アプリが削除されました
@@ -309,6 +320,9 @@ ja:
       content: セキュリティ認証に失敗しました。Cookieをブロックしていませんか?
       title: セキュリティ認証に失敗
     '429': リクエストの制限に達しました。
+    '500':
+      content: もうしわけありませんが、なにかが間違っています。
+      title: このページは正しくありません
     noscript_html: Mastodonのウェブアプリケーションを利用する場合はJavaScriptを有効にしてください。またはあなたのプラットフォーム向けの<a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">Mastodonネイティブアプリ</a>を探すことができます。
   exports:
     blocks: ブロック
@@ -389,6 +403,11 @@ ja:
     next: 次
     prev: 前
     truncate: "&hellip;"
+  preferences:
+    languages: 言語
+    other: その他
+    publishing: 投稿
+    web: ウェブ
   push_notifications:
     favourite:
       title: あなたのトゥートが %{name} さんにお気に入り登録されました
@@ -456,6 +475,7 @@ ja:
     export: データのエクスポート
     followers: 信頼済みのインスタンス
     import: データのインポート
+    notifications: 通知
     preferences: ユーザー設定
     settings: 設定
     two_factor_authentication: 二段階認証
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 6fdc3b985..a77271b82 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -28,8 +28,8 @@ ko:
     learn_more: 자세히
     other_instances: 다른 인스턴스
     source_code: 소스 코드
-    status_count_after: Toot
-    status_count_before: Toot 수
+    status_count_after: 툿
+    status_count_before: 툿 수
     user_count_after: 명
     user_count_before: 사용자 수
     what_is_mastodon: Mastodon이란?
@@ -41,8 +41,8 @@ ko:
     nothing_here: 아무 것도 없습니다.
     people_followed_by: "%{name} 님이 팔로우 중인 계정"
     people_who_follow: "%{name} 님을 팔로우 중인 계정"
-    posts: Toot
-    posts_with_replies: Toot와 답장
+    posts: 툿
+    posts_with_replies: 툿과 답장
     remote_follow: 리모트 팔로우
     reserved_username: 이 아이디는 예약되어 있습니다.
     roles:
@@ -60,6 +60,7 @@ ko:
       email: E-mail
       feed_url: 피드 URL
       followers: 팔로워 수
+      followers_url: 팔로워 URL
       follows: 팔로잉 수
       inbox_url: Inbox URL
       ip: IP
@@ -93,12 +94,13 @@ ko:
       resubscribe: 다시 구독
       salmon_url: Salmon URL
       search: 검색
+      shared_inbox_url: 공유된 inbox URL
       show:
         created_reports: 이 계정에서 제출된 신고
         report: 신고
         targeted_reports: 이 계정에 대한 신고
       silence: 침묵
-      statuses: Toot 수
+      statuses: 툿 수
       subscribe: 구독하기
       title: 계정
       undo_silenced: 침묵 해제
@@ -106,6 +108,25 @@ ko:
       unsubscribe: 구독 해제
       username: 아이디
       web: Web
+    custom_emojis:
+      copied_msg: 성공적으로 emoji의 로컬 복사본을 생성했습니다
+      copy: 복사
+      copy_failed_msg: Emoji의 로컬 복사본을 만드는 데 실패하였습니다
+      created_msg: 에모지가 성공적으로 생성되었습니다!
+      delete: 삭제
+      destroyed_msg: 에모지가 성공적으로 삭제되었습니다!
+      disable: Disable
+      disabled_msg: 성공적으로 비활성화하였습니다
+      emoji: 에모지
+      enable: 활성화
+      enabled_msg: 성공적으로 활성화하였습니다
+      image_hint: 50KB 이하의 PNG
+      new:
+        title: 새 커스텀 에모지 추가
+      shortcode: 짧은 코드
+      shortcode_hint: 최소 2글자, 영문자, 숫자, _만 사용 가능
+      title: 커스텀 에모지
+      upload: 업로드
     domain_blocks:
       add_new: 추가하기
       created_msg: 도메인 차단 처리를 완료했습니다.
@@ -115,7 +136,7 @@ ko:
         create: 차단 추가
         hint: 도메인 차단은 내부 데이터베이스에 계정이 생성되는 것까지는 막을 수 없지만, 그 도메인에서 생성된 계정에 자동적으로 특정한 모더레이션을 적용하게 할 수 있습니다.
         severity:
-          desc_html: "<strong>침묵</strong>은 계정을 팔로우 하지 않고 있는 사람들에겐 계정의 Toot을 보이지 않게 합니다. <strong>정지</strong>는 계정의 컨텐츠, 미디어, 프로필 데이터를 삭제합니다."
+          desc_html: "<strong>침묵</strong>은 계정을 팔로우 하지 않고 있는 사람들에겐 계정의 툿을 보이지 않게 합니다. <strong>정지</strong>는 계정의 컨텐츠, 미디어, 프로필 데이터를 삭제합니다."
           noop: 없음
           silence: 침묵
           suspend: 정지
@@ -138,9 +159,21 @@ ko:
         undo: 실행 취소
       title: 도메인 차단
       undo: 실행 취소
+    email_domain_blocks:
+      add_new: 새로 추가
+      created_msg: Email 도메인 차단 규칙을 생성했습니다
+      delete: 삭제
+      destroyed_msg: Email 도메인 차단 규칙을 삭제했습니다
+      domain: 도메인
+      new:
+        create: 차단 규칙 생성
+        title: 새 Email 도메인 차단
+      title: Email 도메인 차단
     instances:
       account_count: 알려진 계정의 수
       domain_name: 도메인 이름
+      reset: 리셋
+      search: 검색
       title: 알려진 인스턴스들
     reports:
       action_taken_by: 신고 처리자
@@ -167,6 +200,9 @@ ko:
       unresolved: 미해결
       view: 표시
     settings:
+      bootstrap_timeline_accounts:
+        desc_html: 콤마로 여러 유저명을 구분. 로컬의 잠기지 않은 계정만 가능합니다. 비워 둘 경우 모든 로컬 관리자가 기본으로 사용 됩니다.
+        title: 새 유저가 팔로우 할 계정들
       contact_information:
         email: 공개할 메일 주소를 입력
         username: 아이디를 입력
@@ -190,6 +226,9 @@ ko:
         desc_html: 당신은 독자적인 개인정보 취급 방침이나 이용약관, 그 외의 법적 근거를 작성할 수 있습니다. 또한 HTML태그를 사용할 수 있습니다.
         title: 커스텀 서비스 이용 약관
       site_title: 사이트 이름
+      thumbnail:
+        desc_html: OpenGraph와 API의 미리보기로 사용 됩니다. 1200x630px을 권장합니다
+        title: 인스턴스 썸네일
       timeline_preview:
         desc_html: Landing page에 공개 타임라인을 표시합니다.
         title: 타임라인 프리뷰
@@ -207,7 +246,7 @@ ko:
         show: 미디어 보여주기
         title: 미디어
       no_media: 미디어 없음
-      title: 계정 Toot
+      title: 계정 툿
       with_media: 미디어 있음
     subscriptions:
       callback_url: 콜백 URL
@@ -287,6 +326,9 @@ ko:
       content: 보안 인증에 실패했습니다. Cookie를 차단하고 있진 않습니까?
       title: 보안 인증 실패
     '429': 요청 횟수 제한에 도달했습니다.
+    '500':
+      content: 죄송합니다, 뭔가 잘못 되었습니다.
+      title: 이 페이지는 잘못되었습니다.
     noscript_html: Mastodon을 사용하기 위해서는 JavaScript를 켜 주십시오.
   exports:
     blocks: 차단
@@ -338,8 +380,8 @@ ko:
         one: "1건의 새로운 알림 \U0001F418"
         other: "%{count}건의 새로운 알림 \U0001F418"
     favourite:
-      body: "%{name} 님이 내 Toot를 즐겨찾기에 등록했습니다."
-      subject: "%{name} 님이 내 Toot를 즐겨찾기에 등록했습니다"
+      body: "%{name} 님이 내 툿을 즐겨찾기에 등록했습니다."
+      subject: "%{name} 님이 내 툿을 즐겨찾기에 등록했습니다"
     follow:
       body: "%{name} 님이 나를 팔로우 했습니다"
       subject: "%{name} 님이 나를 팔로우 했습니다"
@@ -350,8 +392,8 @@ ko:
       body: "%{name} 님이 답장을 보냈습니다:"
       subject: "%{name} 님이 답장을 보냈습니다"
     reblog:
-      body: "%{name} 님이 내 Toot을 부스트 했습니다:"
-      subject: "%{name} 님이 내 Toot을 부스트 했습니다"
+      body: "%{name} 님이 내 툿을 부스트 했습니다:"
+      subject: "%{name} 님이 내 툿을 부스트 했습니다"
   number:
     human:
       decimal_units:
@@ -367,9 +409,14 @@ ko:
     next: 다음
     prev: 이전
     truncate: "&hellip;"
+  preferences:
+    languages: 언어
+    other: 기타
+    publishing: 퍼블리싱
+    web: 웹
   push_notifications:
     favourite:
-      title: "%{name} 님이 당신의 Toot를 즐겨찾기에 등록했습니다."
+      title: "%{name} 님이 당신의 툿를 즐겨찾기에 등록했습니다."
     follow:
       title: "%{name} 님이 나를 팔로우 하고 있습니다."
     group:
@@ -380,7 +427,7 @@ ko:
       action_favourite: 즐겨찾기
       title: "%{name} 님이 답장을 보냈습니다"
     reblog:
-      title: "%{name} 님이 당신의 Toot를 부스트 했습니다."
+      title: "%{name} 님이 당신의 툿을 부스트 했습니다."
   remote_follow:
     acct: 아이디@도메인을 입력해 주십시오
     missing_resource: 리디렉션 대상을 찾을 수 없습니다
@@ -434,6 +481,7 @@ ko:
     export: 데이터 내보내기
     followers: 신뢰 중인 인스턴스
     import: 데이터 가져오기
+    notifications: 알림
     preferences: 사용자 설정
     settings: 설정
     two_factor_authentication: 2단계 인증
@@ -442,24 +490,27 @@ ko:
     open_in_web: Web으로 열기
     over_character_limit: 최대 %{max}자까지 입력할 수 있습니다
     pin_errors:
-      ownership: 다른 사람의 Toot는 고정될 수 없습니다.
-      private: 비공개 Toot는 고정될 수 없습니다.
+      limit: 너무 많은 툿을 고정했습니다.
+      ownership: 다른 사람의 툿은 고정될 수 없습니다.
+      private: 비공개 툿은 고정될 수 없습니다.
       reblog: 부스트는 고정될 수 없습니다.
     show_more: 더 보기
     visibilities:
       private: 비공개
-      private_long: 팔로워에게만 표시됩니다
+      private_long: 팔로워에게만 공개됩니다
       public: 공개
       public_long: 누구나 볼 수 있으며, 공개 타임라인에 표시됩니다
       unlisted: Unlisted
       unlisted_long: 누구나 볼 수 있지만, 공개 타임라인에는 표시되지 않습니다
   stream_entries:
     click_to_show: 클릭해서 표시
-    pinned: 고정된 Toot
+    pinned: 고정된 툿
     reblogged: 님이 부스트 했습니다
     sensitive_content: 민감한 컨텐츠
   terms:
     title: "%{instance} 이용약관과 개인정보 취급 방침"
+  themes:
+    default: Mastodon
   time:
     formats:
       default: "%Y년 %m월 %d일 %H:%M"
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 584f4c609..608ee0a09 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -2,6 +2,7 @@
 oc:
   about:
     about_mastodon_html: Mastodon es un malhum social bastit amb de protocòls liures e gratuits. Es descentralizat coma los corrièls.
+    about_hashtag_html: Vaquí los estatuts publics ligats a <strong>#%{hashtag}</strong>. Podètz interagir amb eles s’avètz un compte ont que siasque sul fediverse.
     about_this: A prepaus d’aquesta instància
     closed_registrations: Las inscripcions son clavadas pel moment sus aquesta instància.
     contact: Contacte
@@ -93,8 +94,8 @@ oc:
       reset_password: Reïnicializar lo senhal
       resubscribe: Se tornar abonar
       salmon_url: URL Salmon
-      shared_inbox_url: URL de recepcion partejada
       search: Cercar
+      shared_inbox_url: URL de recepcion partejada
       show:
         created_reports: Rapòrts creat per aqueste compte
         report: rapòrt
@@ -109,10 +110,17 @@ oc:
       username: Nom d’utilizaire
       web: Web
     custom_emojis:
+      copied_msg: Còpia locale de l’emoji ben creada
+      copy: Copiar
+      copy_failed_msg: Fracàs de la còpia locale de l’emoji
       created_msg: Emoji ben creat !
       delete: Suprimir
       destroyed_msg: Emojo ben suprimit !
+      disable: Desactivar
+      disabled_msg: Aqueste emoji es ben desactivat
       emoji: Emoji
+      enable: Activar
+      enabled_msg: Aqueste emoji es ben activat
       image_hint: PNG cap a 50Ko
       new:
         title: Ajustar un nòu emoji personal
@@ -152,6 +160,16 @@ oc:
         undo: Restablir
       title: Blòc de domeni
       undo: Restablir
+    email_domain_blocks:
+       add_new: Ajustar
+       created_msg: Blocatge del domeni de corrièl ben plaçat
+       delete: Suprimir
+       destroyed_msg: Blocatge del domeni de corrièl ben levat
+       domain: Domeni
+       new:
+         create: Crear un blocatge
+         title: Nòu blocatge de domeni de corrièl
+       title: Blocatge de domeni de corrièl      
     instances:
       account_count: Comptes coneguts
       domain_name: Domeni
@@ -388,6 +406,9 @@ oc:
       content: Verificacion de seguretat fracassada. Blocatz los cookies ?
       title: Verificacion de seguretat fracassada
     '429': Lo servidor mòla (subrecargada)
+    '500':
+      content: Un quicomet a pas foncionat coma caliá.
+      title: Aquesta pagina es incorrècta
     noscript_html: Per utilizar l’aplicacion web de Mastodon, mercés d’activar JavaScript. O podètz utilizar <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">una aplicacion</a> per vòstra plataforma coma alernativa.
   exports:
     blocks: Personas que blocatz
@@ -468,6 +489,11 @@ oc:
     next: Seguent
     prev: Precedent
     truncate: "&hellip;"
+  preferences:
+    languages: Lengas
+    other: Autre
+    publishing: Publicar
+    web: Interfàcia Web
   push_notifications:
     favourite:
       title: "%{name} a mes vòstre estatut en favorit"
@@ -535,6 +561,7 @@ oc:
     export: Export donadas
     followers: Seguidors autorizats
     import: Importar
+    notifications: Notificacions
     preferences: Preferéncias
     settings: Paramètres
     two_factor_authentication: Autentificacion en dos temps
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 9bf57e38b..5176ca88b 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -2,6 +2,7 @@
 pl:
   about:
     about_mastodon_html: Mastodon jest wolną i otwartą siecią społecznościową, zdecentralizowaną alternatywą dla zamkniętych, komercyjnych platform.
+    about_hashtag_html: Znajdują się tu publiczne wpisy oznaczone hashtagiem <strong>#%{hashtag}</strong>. Możesz dołączyć do dyskusji, jeżeli posiadasz konto gdziekolwiek w Fediwersum.
     about_this: O tej instancji
     closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta. Możesz jednak zarejestrować się na innej instancji, uzyskując dostęp do tej samej sieci.
     contact: Kontakt
@@ -62,7 +63,7 @@ pl:
       followers: Śledzący
       followers_url: Adres śledzących
       follows: Śledzeni
-      inbox: Adres skrzynki
+      inbox_url: Adres skrzynki
       ip: Adres IP
       location:
         all: Wszystkie
@@ -75,6 +76,7 @@ pl:
         silenced: Wyciszone
         suspended: Zawieszone
         title: Moderacja
+      moderation_notes: Notatki moderacyjne
       most_recent_activity: Najnowsza aktywność
       most_recent_ip: Ostatnie IP
       not_subscribed: Nie zasubskrybowano
@@ -106,11 +108,25 @@ pl:
       unsubscribe: Przestań subskrybować
       username: Nazwa użytkownika
       web: Sieć
+    account_moderation_notes:
+      account: Autor
+      created_at: Data
+      create: Dodaj
+      created_msg: Pomyślnie dodano notatkę moderacyjną!
+      delete: Usuń
+      destroyed_msg: Pomyślnie usunięto notatkę moderacyjną!
     custom_emojis:
+      copied_msg: Pomyślnie utworzono lokalną kopię emoji
+      copy: Kopiuj
+      copy_failed_msg: Nie udało się utworzyć lokalnej kopii emoji
       created_msg: Pomyślnie utworzono emoji!
       delete: Usuń
       destroyed_msg: Pomyślnie usunięto emoji!
+      disable: Wyłącz
+      disabled_msg: Pomyślnie wyłączono emoji
       emoji: Emoji
+      enable: Włącz
+      enabled_msg: Pomyślnie przywrócono emoji
       image_hint: Plik PNG ważący do 50KB
       new:
         title: Dodaj nowe niestandardowe emoji
@@ -151,12 +167,22 @@ pl:
         undo: Cofnij
       title: Zablokowane domeny
       undo: Cofnij
+    email_domain_blocks:
+      add_new: Dodaj nową
+      created_msg: Pomyślnie utworzono blokadę domeny e-mail
+      delete: Usuń
+      destroyed_msg: Pomyślnie usunięto blokadę domeny e-mail
+      domain: Domena
+      new:
+        create: Utwórz blokadę
+        title: Nowa blokada domeny e-mail
+      title: Blokowanie domen e-mail
     instances:
       account_count: Znane konta
       domain_name: Domena
       title: Znane instancje
     reports:
-      action_taken_by: Akcja podjęta przez
+      action_taken_by: Działanie podjęte przez
       are_you_sure: Czy na pewno?
       comment:
         label: Komentarz
@@ -394,6 +420,11 @@ pl:
     next: Następna
     prev: Poprzednia
     truncate: "&hellip;"
+  preferences:
+    languages: Języki
+    other: Pozostałe
+    publishing: Publikowanie
+    web: Sieć
   push_notifications:
     favourite:
       title: "%{name} dodał Twój status do ulubionych"
@@ -461,6 +492,7 @@ pl:
     export: Eksportowanie danych
     followers: Autoryzowani śledzący
     import: Importowanie danych
+    notifications: Powiadomienia
     preferences: Preferencje
     settings: Ustawienia
     two_factor_authentication: Uwierzytelnianie dwuetapowe
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index a6ba839c6..4064aa5f2 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -3,15 +3,24 @@ de:
   simple_form:
     hints:
       defaults:
-        avatar: PNG, GIF oder JPG. Maximal 2MB. Wird auf 120x120px herunterskaliert
-        display_name: <span class="name-counter">%{count}</span> Zeichen verbleiben
-        header: PNG, GIF oder JPG. Maximal 2MB. Wird auf 700x335px herunterskaliert
-        locked: Erlaubt dir, Profile zu überprüfen, bevor sie dir folgen können
-        note: <span class="note-counter">%{count}</span> Zeichen verbleiben
+        avatar: PNG, GIF oder JPG. Maximal 2 MB. Wird auf 120×120 px herunterskaliert
+        digest: Wenn du lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen in deiner Abwesenheit zugeschickt
+        display_name:
+          one: <span class="name-counter">1</span> Zeichen verbleibt
+          other: <span class="name-counter">%{count}</span> Zeichen verbleiben
+        header: PNG, GIF oder JPG. Maximal 2 MB. Wird auf 700×335 px herunterskaliert
+        locked: Wer dir folgen möchte, muss um deine Erlaubnis bitten
+        note:
+          one: <span class="note-counter">1</span> Zeichen verbleibt
+          other: <span class="note-counter">%{count}</span> Zeichen verbleiben
+        setting_noindex: Betrifft dein öffentliches Profil und deine Beiträge
+        setting_theme: Wirkt sich darauf aus, wie Mastodon aussieht, egal auf welchem Gerät du eingeloggt bist.
       imports:
-        data: CSV-Datei, die von einer anderen Mastodon-Instanz exportiert wurde
+        data: CSV-Datei, die aus einer anderen Mastodon-Instanz exportiert wurde
       sessions:
         otp: Gib den Zwei-Faktor-Authentisierungs-Code von deinem Telefon ein oder benutze einen deiner Wiederherstellungscodes.
+      user:
+        filtered_languages: Ausgewählte Sprachen werden aus deinen öffentlichen Zeitleisten gefiltert
     labels:
       defaults:
         avatar: Profilbild
@@ -20,7 +29,8 @@ de:
         current_password: Derzeitiges Passwort
         data: Daten
         display_name: Anzeigename
-        email: E-Mail-Addresse
+        email: E-Mail-Adresse
+        filtered_languages: Gefilterte Sprachen
         header: Kopfbild
         locale: Sprache
         locked: Gesperrtes Profil
@@ -29,13 +39,19 @@ de:
         otp_attempt: Zwei-Faktor-Authentisierungs-Code
         password: Passwort
         setting_auto_play_gif: Animierte GIFs automatisch abspielen
-        setting_boost_modal: Zeige einen Bestätigungsdialog vor dem Teilen
-        setting_default_privacy: Beitragsprivatspäre
+        setting_boost_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag geteilt wird
+        setting_default_privacy: Beitragssichtbarkeit
+        setting_default_sensitive: Medien immer als heikel markieren
+        setting_delete_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag gelöscht wird
+        setting_noindex: Suchmaschinen-Indexierung verhindern
+        setting_system_font_ui: Standardschriftart des Systems verwenden
+        setting_theme: Theme der Website
+        setting_unfollow_modal: Bestätigungsdialog anzeigen, bevor jemand entfolgt wird
         severity: Gewichtung
         type: Importtyp
         username: Profilname
       interactions:
-        must_be_follower: Benachrichtigungen von Nicht-Folgern blockieren
+        must_be_follower: Benachrichtigungen von Nicht-Folgenden blockieren
         must_be_following: Benachrichtigungen von Profilen blockieren, denen ich nicht folge
       notification_emails:
         digest: Schicke Übersichts-E-Mails
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index f9d4e2e52..86c80290c 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -4,6 +4,7 @@ en:
     hints:
       defaults:
         avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 120x120px
+        digest: Sent after a long period of inactivity with a summary of mentions you've received in your absence
         display_name:
           one: <span class="name-counter">1</span> character left
           other: <span class="name-counter">%{count}</span> characters left
@@ -19,7 +20,7 @@ en:
       sessions:
         otp: Enter the Two-factor code from your phone or use one of your recovery codes.
       user:
-        filtered_languages: Selected languages will be removed from your public timelines.
+        filtered_languages: Checked languages will be filtered from public timelines for you
     labels:
       defaults:
         avatar: Avatar
@@ -44,8 +45,8 @@ en:
         setting_delete_modal: Show confirmation dialog before deleting a toot
         setting_noindex: Opt-out of search engine indexing
         setting_system_font_ui: Use system's default font
-        setting_unfollow_modal: Show confirmation dialog before unfollowing someone
         setting_theme: Site theme
+        setting_unfollow_modal: Show confirmation dialog before unfollowing someone
         severity: Severity
         type: Import type
         username: Username
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index d5de2dcd3..e5d408973 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -4,6 +4,7 @@ pl:
     hints:
       defaults:
         avatar: PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie zmniejszony do 120x120px
+        digest: Wysyłane po długiej nieaktywności, zawiera podsumowanie wspomnień o Twoich profilu
         display_name:
           few: Pozostały <span class="name-counter">%{count}</span> znaki.
           many: Pozostało <span class="name-counter">%{count}</span> znaków
@@ -23,7 +24,7 @@ pl:
       sessions:
         otp: Wprowadź kod weryfikacji dwuetapowej z telefonu lub wykorzystaj jeden z kodów zapasowych
       user:
-        filtered_languages: Wpisy w wybranych językach nie będą pojawiać się na publicznych osiach czasu.
+        filtered_languages: Wpisy w wybranych językach nie będą wyświetlać się na publicznych osiach czasu.
     labels:
       defaults:
         avatar: Awatar
diff --git a/config/navigation.rb b/config/navigation.rb
index 0a6ab6d3d..50bfbd480 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -7,6 +7,7 @@ SimpleNavigation::Configuration.run do |navigation|
     primary.item :settings, safe_join([fa_icon('cog fw'), t('settings.settings')]), settings_profile_url do |settings|
       settings.item :profile, safe_join([fa_icon('user fw'), t('settings.edit_profile')]), settings_profile_url
       settings.item :preferences, safe_join([fa_icon('sliders fw'), t('settings.preferences')]), settings_preferences_url
+      settings.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_notifications_url
       settings.item :password, safe_join([fa_icon('lock fw'), t('auth.change_password')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete}
       settings.item :two_factor_authentication, safe_join([fa_icon('mobile fw'), t('settings.two_factor_authentication')]), settings_two_factor_authentication_url, highlights_on: %r{/settings/two_factor_authentication}
       settings.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url
@@ -25,6 +26,7 @@ SimpleNavigation::Configuration.run do |navigation|
       admin.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url, highlights_on: %r{/admin/instances}
       admin.item :subscriptions, safe_join([fa_icon('paper-plane-o fw'), t('admin.subscriptions.title')]), admin_subscriptions_url
       admin.item :domain_blocks, safe_join([fa_icon('lock fw'), t('admin.domain_blocks.title')]), admin_domain_blocks_url, highlights_on: %r{/admin/domain_blocks}
+      admin.item :email_domain_blocks, safe_join([fa_icon('envelope fw'), t('admin.email_domain_blocks.title')]), admin_email_domain_blocks_url, highlights_on: %r{/admin/email_domain_blocks}
       admin.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' }
       admin.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' }
       admin.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url
diff --git a/config/routes.rb b/config/routes.rb
index 2c41c24e9..9ed081e50 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -67,6 +67,7 @@ Rails.application.routes.draw do
   namespace :settings do
     resource :profile, only: [:show, :update]
     resource :preferences, only: [:show, :update]
+    resource :notifications, only: [:show, :update]
     resource :import, only: [:show, :create]
 
     resource :export, only: [:show]
@@ -95,8 +96,9 @@ Rails.application.routes.draw do
     resources :sessions, only: [:destroy]
   end
 
-  resources :media, only: [:show]
-  resources :tags,  only: [:show]
+  resources :media,  only: [:show]
+  resources :tags,   only: [:show]
+  resources :emojis, only: [:show]
 
   get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy
 
@@ -107,6 +109,7 @@ Rails.application.routes.draw do
   namespace :admin do
     resources :subscriptions, only: [:index]
     resources :domain_blocks, only: [:index, :new, :create, :show, :destroy]
+    resources :email_domain_blocks, only: [:index, :new, :create, :destroy]
     resource :settings, only: [:edit, :update]
 
     resources :instances, only: [:index] do
@@ -137,7 +140,15 @@ Rails.application.routes.draw do
       resource :two_factor_authentication, only: [:destroy]
     end
 
-    resources :custom_emojis, only: [:index, :new, :create, :destroy]
+    resources :custom_emojis, only: [:index, :new, :create, :destroy] do
+      member do
+        post :copy
+        post :enable
+        post :disable
+      end
+    end
+
+    resources :account_moderation_notes, only: [:create, :destroy]
   end
 
   get '/admin', to: redirect('/admin/settings/edit', status: 302)
@@ -193,8 +204,7 @@ Rails.application.routes.draw do
       get '/search', to: 'search#index', as: :search
 
       resources :follows,    only: [:create]
-      resources :media,      only: [:create]
-      resources :apps,       only: [:create]
+      resources :media,      only: [:create, :update]
       resources :blocks,     only: [:index]
       resources :mutes,      only: [:index] do
         collection do 
@@ -204,6 +214,12 @@ Rails.application.routes.draw do
       resources :favourites, only: [:index]
       resources :reports,    only: [:index, :create]
 
+      namespace :apps do
+        get :verify_credentials, to: 'credentials#show'
+      end
+
+      resources :apps, only: [:create]
+
       resource :instance,      only: [:show]
       resource :domain_blocks, only: [:show, :create, :destroy]
 
diff --git a/config/webpack/development.js b/config/webpack/development.js
index 830183c0d..12670f5cd 100644
--- a/config/webpack/development.js
+++ b/config/webpack/development.js
@@ -4,6 +4,17 @@ const merge = require('webpack-merge');
 const sharedConfig = require('./shared.js');
 const { settings, output } = require('./configuration.js');
 
+const watchOptions = {
+  ignored: /node_modules/,
+};
+
+if (process.env.VAGRANT) {
+  // If we are in Vagrant, we can't rely on inotify to update us with changed
+  // files, so we must poll instead. Here, we poll every second to see if
+  // anything has changed.
+  watchOptions.poll = 1000;
+}
+
 module.exports = merge(sharedConfig, {
   devtool: 'cheap-module-eval-source-map',
 
@@ -26,8 +37,6 @@ module.exports = merge(sharedConfig, {
     headers: { 'Access-Control-Allow-Origin': '*' },
     historyApiFallback: true,
     disableHostCheck: true,
-    watchOptions: {
-      ignored: /node_modules/,
-    },
+    watchOptions: watchOptions,
   },
 });
diff --git a/config/webpack/loaders/babel.js b/config/webpack/loaders/babel.js
index 989a87dcf..770c89aa7 100644
--- a/config/webpack/loaders/babel.js
+++ b/config/webpack/loaders/babel.js
@@ -4,11 +4,7 @@ const env = process.env.NODE_ENV || 'development';
 
 module.exports = {
   test: /\.js$/,
-  // include react-intl because transform-react-remove-prop-types needs to apply to it
-  exclude: {
-    test: /node_modules/,
-    exclude: /react-intl[\/\\](?!locale-data)/,
-  },
+  exclude: /node_modules/,
   loader: 'babel-loader',
   options: {
     forceEnv: process.env.NODE_ENV || 'development',
diff --git a/config/webpack/loaders/babel_external.js b/config/webpack/loaders/babel_external.js
new file mode 100644
index 000000000..39e74ed90
--- /dev/null
+++ b/config/webpack/loaders/babel_external.js
@@ -0,0 +1,21 @@
+const { resolve } = require('path');
+
+const env = process.env.NODE_ENV || 'development';
+
+if (env === 'development') {
+  module.exports = {};
+} else {
+  // babel options to apply only to external libraries, e.g. remove-prop-types
+  module.exports = {
+    test: /\.js$/,
+    include: /node_modules/,
+    loader: 'babel-loader',
+    options: {
+      babelrc: false,
+      plugins: [
+        'transform-react-remove-prop-types',
+      ],
+      cacheDirectory: env === 'development' ? false : resolve(__dirname, '..', '..', '..', 'tmp', 'cache', 'babel-loader-external'),
+    },
+  };
+}
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index 99f4dec1a..e3a1fc379 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -50,6 +50,13 @@ module.exports = {
 
   plugins: [
     new webpack.EnvironmentPlugin(JSON.parse(JSON.stringify(env))),
+    new webpack.NormalModuleReplacementPlugin(
+      /^history\//, (resource) => {
+        // temporary fix for https://github.com/ReactTraining/react-router/issues/5576
+        // to reduce bundle size
+        resource.request = resource.request.replace(/^history/, 'history/es');
+      }
+    ),
     new ExtractTextPlugin({
       filename: env.NODE_ENV === 'production' ? '[name]-[hash].css' : '[name].css',
       allChunks: true,