about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/application.rb17
-rw-r--r--config/environments/production.rb9
-rw-r--r--config/initializers/open_uri_redirection.rb8
-rw-r--r--config/initializers/paperclip.rb7
-rw-r--r--config/initializers/rabl_init.rb2
-rw-r--r--config/initializers/rack-attack.rb4
-rw-r--r--config/initializers/timeout.rb6
-rw-r--r--config/locales/de.yml3
-rw-r--r--config/locales/devise.fi.yml61
-rw-r--r--config/locales/devise.fr.yml1
-rw-r--r--config/locales/devise.no.yml61
-rw-r--r--config/locales/devise.zh-CN.yml61
-rw-r--r--config/locales/doorkeeper.en.yml3
-rw-r--r--config/locales/doorkeeper.fi.yml113
-rw-r--r--config/locales/doorkeeper.fr.yml7
-rw-r--r--config/locales/doorkeeper.no.yml113
-rw-r--r--config/locales/en.yml51
-rw-r--r--config/locales/es.yml16
-rw-r--r--config/locales/fi.yml164
-rw-r--r--config/locales/fr.yml155
-rw-r--r--config/locales/hu.yml6
-rw-r--r--config/locales/no.yml164
-rw-r--r--config/locales/pt.yml4
-rw-r--r--config/locales/simple_form.en.yml5
-rw-r--r--config/locales/simple_form.fi.yml46
-rw-r--r--config/locales/simple_form.fr.yml18
-rw-r--r--config/locales/simple_form.no.yml46
-rw-r--r--config/locales/simple_form.zh-CN.yml42
-rw-r--r--config/locales/uk.yml6
-rw-r--r--config/locales/zh-CN.yml154
-rw-r--r--config/navigation.rb9
-rw-r--r--config/routes.rb38
-rw-r--r--config/settings.yml5
33 files changed, 1309 insertions, 96 deletions
diff --git a/config/application.rb b/config/application.rb
index d44835957..17b7a19cc 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -2,12 +2,14 @@ require_relative 'boot'
 
 require 'rails/all'
 
-require_relative '../app/lib/exceptions'
-
 # Require the gems listed in Gemfile, including any gems
 # you've limited to :test, :development, or :production.
 Bundler.require(*Rails.groups)
 
+require_relative '../app/lib/exceptions'
+require_relative '../lib/paperclip/gif_transcoder'
+require_relative '../lib/paperclip/video_transcoder'
+
 Dotenv::Railtie.load
 
 module Mastodon
@@ -22,7 +24,7 @@ module Mastodon
 
     # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
     # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
-    config.i18n.available_locales = [:en, :de, :es, :pt, :fr, :hu, :uk]
+    config.i18n.available_locales = [:en, :de, :es, :pt, :fr, :hu, :uk, 'zh-CN', :fi]
     config.i18n.default_locale    = :en
 
     # config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
@@ -34,7 +36,7 @@ module Mastodon
       allow do
         origins  '*'
 
-        resource '/api/*',       headers: :any, methods: [:post, :put, :delete, :get, :options], credentials: false
+        resource '/api/*',       headers: :any, methods: [:post, :put, :delete, :get, :options], credentials: false, expose: ['Link', 'X-RateLimit-Reset', 'X-RateLimit-Limit', 'X-RateLimit-Remaining', 'X-Request-Id']
         resource '/oauth/token', headers: :any, methods: [:post], credentials: false
       end
     end
@@ -49,12 +51,5 @@ module Mastodon
       Doorkeeper::AuthorizedApplicationsController.layout 'admin'
       Doorkeeper::Application.send :include, ApplicationExtension
     end
-
-    config.action_dispatch.default_headers = {
-      'Server'                 => 'Mastodon',
-      'X-Frame-Options'        => 'DENY',
-      'X-Content-Type-Options' => 'nosniff',
-      'X-XSS-Protection'       => '1; mode=block',
-    }
   end
 end
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 62ea217ef..dc5dd4afd 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -43,7 +43,7 @@ Rails.application.configure do
   config.log_level = :debug
 
   # Prepend all log lines with the following tags.
-  config.log_tags = [ :request_id ]
+  config.log_tags = [:request_id]
 
   # Use a different logger for distributed setups.
   # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
@@ -109,4 +109,11 @@ Rails.application.configure do
   config.to_prepare do
     StatsD.backend = StatsD::Instrument::Backends::NullBackend.new if ENV['STATSD_ADDR'].blank?
   end
+
+  config.action_dispatch.default_headers = {
+    'Server'                 => 'Mastodon',
+    'X-Frame-Options'        => 'DENY',
+    'X-Content-Type-Options' => 'nosniff',
+    'X-XSS-Protection'       => '1; mode=block',
+  }
 end
diff --git a/config/initializers/open_uri_redirection.rb b/config/initializers/open_uri_redirection.rb
new file mode 100644
index 000000000..e24fdecab
--- /dev/null
+++ b/config/initializers/open_uri_redirection.rb
@@ -0,0 +1,8 @@
+require 'open-uri'
+
+module OpenURI
+  def OpenURI.redirectable?(uri1, uri2) # :nodoc:
+    uri1.scheme.downcase == uri2.scheme.downcase ||
+      (/\A(?:http|https|ftp)\z/i =~ uri1.scheme && /\A(?:http|https|ftp)\z/i =~ uri2.scheme)
+  end
+end
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index 71a7b514e..2a2ef8fea 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -2,11 +2,16 @@
 
 Paperclip.options[:read_timeout] = 60
 
+Paperclip.interpolates :filename do |attachment, style|
+  return attachment.original_filename if style == :original
+  [basename(attachment, style), extension(attachment, style)].delete_if(&:empty?).join('.')
+end
+
 if ENV['S3_ENABLED'] == 'true'
   Aws.eager_autoload!(services: %w(S3))
 
   Paperclip::Attachment.default_options[:storage]        = :s3
-  Paperclip::Attachment.default_options[:s3_protocol]    = 'https'
+  Paperclip::Attachment.default_options[:s3_protocol]    = ENV.fetch('S3_PROTOCOL') { 'https' }
   Paperclip::Attachment.default_options[:url]            = ':s3_domain_url'
   Paperclip::Attachment.default_options[:s3_host_name]   = ENV.fetch('S3_HOSTNAME') { "s3-#{ENV.fetch('S3_REGION')}.amazonaws.com" }
   Paperclip::Attachment.default_options[:path]           = '/:class/:attachment/:id_partition/:style/:filename'
diff --git a/config/initializers/rabl_init.rb b/config/initializers/rabl_init.rb
index 325bf0c78..f7be0c607 100644
--- a/config/initializers/rabl_init.rb
+++ b/config/initializers/rabl_init.rb
@@ -1,6 +1,6 @@
 Rabl.configure do |config|
   config.cache_all_output  = false
-  config.cache_sources     = !!Rails.env.production?
+  config.cache_sources     = Rails.env.production?
   config.include_json_root = false
   config.view_paths        = [Rails.root.join('app/views')]
 end
diff --git a/config/initializers/rack-attack.rb b/config/initializers/rack-attack.rb
index 3f0ee1d7a..70f7846d1 100644
--- a/config/initializers/rack-attack.rb
+++ b/config/initializers/rack-attack.rb
@@ -1,6 +1,6 @@
 class Rack::Attack
   # Rate limits for the API
-  throttle('api', limit: 150, period: 5.minutes) do |req|
+  throttle('api', limit: 300, period: 5.minutes) do |req|
     req.ip if req.path.match(/\A\/api\/v/)
   end
 
@@ -11,7 +11,7 @@ class Rack::Attack
     headers = {
       'X-RateLimit-Limit'     => match_data[:limit].to_s,
       'X-RateLimit-Remaining' => '0',
-      'X-RateLimit-Reset'     => (now + (match_data[:period] - now.to_i % match_data[:period])).iso8601(6)
+      'X-RateLimit-Reset'     => (now + (match_data[:period] - now.to_i % match_data[:period])).iso8601(6),
     }
 
     [429, headers, [{ error: 'Throttled' }.to_json]]
diff --git a/config/initializers/timeout.rb b/config/initializers/timeout.rb
index 643780884..de87fd906 100644
--- a/config/initializers/timeout.rb
+++ b/config/initializers/timeout.rb
@@ -1,4 +1,6 @@
+Rack::Timeout::Logger.disable
+Rack::Timeout.service_timeout = false
+
 if Rails.env.production?
-  Rack::Timeout.service_timeout = 15
-  Rack::Timeout::Logger.disable
+  Rack::Timeout.service_timeout = 90
 end
diff --git a/config/locales/de.yml b/config/locales/de.yml
index f36cc64c8..320bd3144 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -1,7 +1,6 @@
 ---
 de:
   about:
-    about_instance: "<em>%{instance}</em> ist eine Instanz von Mastodon."
     about_mastodon: Mastodon ist ein <em>freier, quelloffener</em> soziales Netzwerkserver. Eine <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.
     get_started: Erste Schritte
     source_code: Quellcode
@@ -82,8 +81,6 @@ de:
     preferences: Einstellungen
   stream_entries:
     click_to_show: Klicken um zu zeigen
-    favourited: favorisierte einen Beitrag von
-    is_now_following: folgt nun
     reblogged: teilte
     sensitive_content: Sensible Inhalte
   time:
diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml
new file mode 100644
index 000000000..79fe81230
--- /dev/null
+++ b/config/locales/devise.fi.yml
@@ -0,0 +1,61 @@
+---
+fi:
+  devise:
+    confirmations:
+      confirmed: Sähköpostisi on onnistuneesti vahvistettu.
+      send_instructions: Saat kohta sähköpostiisi ohjeet kuinka voit aktivoida tilisi.
+      send_paranoid_instructions: Jos sähköpostisi on meidän tietokannassa, saat pian ohjeet sen varmentamiseen.
+    failure:
+      already_authenticated: Olet jo kirjautunut sisään.
+      inactive: Tiliäsi ei ole viellä aktivoitu.
+      invalid: Virheellinen %{authentication_keys} tai salasana.
+      last_attempt: Sinulla on yksi yritys jäljellä tai tili lukitaan.
+      locked: Tili on lukittu.
+      not_found_in_database: Virheellinen %{authentication_keys} tai salasana.
+      timeout: Sessiosi on umpeutunut. Kirjaudu sisään jatkaaksesi.
+      unauthenticated: Sinun tarvitsee kirjautua sisään tai rekisteröityä jatkaaksesi.
+      unconfirmed: Sinun tarvitsee varmentaa sähköpostisi jatkaaksesi.
+    mailer:
+      confirmation_instructions:
+        subject: 'Mastodon: Varmistus ohjeet'
+      password_change:
+        subject: 'Mastodon: Salasana vaihdettu'
+      reset_password_instructions:
+        subject: 'Mastodon: Salasanan vaihto ohjeet'
+      unlock_instructions:
+        subject: 'Mastodon: Avauksen ohjeet'
+    omniauth_callbacks:
+      failure: Varmennus %{kind} epäonnistui koska "%{reason}".
+      success: Onnistuneesti varmennettu %{kind} tilillä.
+    passwords:
+      no_token: Et pääse tälle sivulle ilman salasanan vaihto sähköpostia. Jos tulet tämmöisestä postista, varmista että sinulla on täydellinen URL.
+      send_instructions: Saat sähköpostitse ohjeet salasanan palautukseen muutaman minuutin kuluessa.
+      send_paranoid_instructions: Jos sähköpostisi on meidän tietokannassa, saat pian ohjeet salasanan palautukseen.
+      updated: Salasanasi vaihdettu onnistuneesti. Olet nyt kirjautunut sisään.
+      updated_not_active: Salasanasi vaihdettu onnistuneesti.
+    registrations:
+      destroyed: Näkemiin! Tilisi on onnistuneesti peruttu. Toivottavasti näemme joskus uudestaan.
+      signed_up: Tervetuloa! Rekisteröitymisesi onnistu.
+      signed_up_but_inactive: Olet onnistuneesti rekisteröitynyt, mutta emme voi kirjata sinua sisään koska tiliäsi ei ole viellä aktivoitu.
+      signed_up_but_locked: Olet onnistuneesti rekisteröitynyt, mutta emme voi kirjata sinua sisään koska tilisi on lukittu.
+      signed_up_but_unconfirmed: Varmistuslinkki on lähetty sähköpostiisi. Seuraa sitä jotta tilisi voidaan aktivoida.
+      update_needs_confirmation: Tilisi on onnistuneesti päivitetty, mutta meidän tarvitsee vahvistaa sinun uusi sähköpostisi. Tarkista sähköpostisi ja seuraa viestissä tullutta linkkiä varmistaaksesi uuden osoitteen..
+      updated: Tilisi on onnistuneesti päivitetty.
+    sessions:
+      already_signed_out: Ulos kirjautuminen onnistui.
+      signed_in: Sisäänkirjautuminen onnistui.
+      signed_out: Ulos kirjautuminen onnistui.
+    unlocks:
+      send_instructions: Saat sähköpostiisi pian ohjeet, jolla voit avata tilisi uudestaan.
+      send_paranoid_instructions: Jos tilisi on olemassa, saat sähköpostiisi pian ohjeet tilisi avaamiseen.
+      unlocked: Tilisi on avattu onnistuneesti. Kirjaudu normaalisti sisään.
+  errors:
+    messages:
+      already_confirmed: on jo varmistettu. Yritä kirjautua sisään
+      confirmation_period_expired: pitää varmistaa %{period} sisällä, ole hyvä ja pyydä uusi
+      expired: on erääntynyt, ole hyvä ja pyydä uusi
+      not_found: ei löydy
+      not_locked: ei ollut lukittu
+      not_saved:
+        one: '1 virhe esti %{resource} tallennuksen:'
+        other: "%{count} virhettä esti %{resource} tallennuksen:"
diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml
index b64601e7b..ce44d041a 100644
--- a/config/locales/devise.fr.yml
+++ b/config/locales/devise.fr.yml
@@ -58,3 +58,4 @@ fr:
       not_locked: n'était pas verrouillé(e)
       not_saved:
         one: '1 erreur a empêché ce(tte) %{resource} d''être sauvegardé(e) :'
+        other: '%{count} erreurs ont empêché ce(tte) %{resource} d''être sauvegardé(e): '
diff --git a/config/locales/devise.no.yml b/config/locales/devise.no.yml
new file mode 100644
index 000000000..8b650e548
--- /dev/null
+++ b/config/locales/devise.no.yml
@@ -0,0 +1,61 @@
+---
+'no':
+  devise:
+    confirmations:
+      confirmed: Epostaddressen din er blitt bekreftet.
+      send_instructions: Du vil motta en epost med instruksjoner for hvordan bekrefte din epostaddresse om noen få minutter.
+      send_paranoid_instructions: Hvis din epostaddresse finnes i vår database vil du motta en epost med instruksjoner for hvordan bekrefte din epost om noen få minutter.
+    failure:
+      already_authenticated: Du er allerede innlogget.
+      inactive: Din konto er ikke blitt aktivert ennå.
+      invalid: Ugyldig %{authentication_keys} eller passord.
+      last_attempt: Du har ett forsøk igjen før kontoen din bli låst.
+      locked: Din konto er låst.
+      not_found_in_database: Ugyldig %{authentication_keys} eller passord.
+      timeout: Sesjonen din løp ut på tid. Logg inn på nytt for å fortsette.
+      unauthenticated: Du må logge inn eller registrere deg før du kan fortsette.
+      unconfirmed: Du må bekrefte epostadressen din før du kan fortsette.
+    mailer:
+      confirmation_instructions:
+        subject: 'Mastodon: Instruksjoner for å bekrefte epostadresse'
+      password_change:
+        subject: 'Mastodon: Passord endret'
+      reset_password_instructions:
+        subject: 'Mastodon: Hvordan nullstille passord?'
+      unlock_instructions:
+        subject: 'Mastodon: Instruksjoner for å gjenåpne konto'
+    omniauth_callbacks:
+      failure: Kunne ikke autentisere deg fra %{kind} fordi "%{reason}".
+      success: Vellykket autentisering fra %{kind}.
+    passwords:
+      no_token: Du har ingen tilgang til denne siden så lenge du ikke kommer fra en epost om nullstilling av passord. Hvis du kommer fra en passordnullstilling epost, dobbelsjekk at du brukte hele URLen.
+      send_instructions: Du vil motta en epost med instruksjoner for å nullstille passordet ditt om noen få minutter.
+      send_paranoid_instructions: Hvis epostadressen din finnes i databasen vår vil du motta en instruksjonsmail om passord nullstilling om noen få minutter.
+      updated: Passordet ditt har blitt endret. Du er nå logget inn.
+      updated_not_active: Passordet ditt har blitt endret.
+    registrations:
+      destroyed: Adjø! Kontoen din har blitt avsluttet. Vi håper at vi ser deg igjen snart.
+      signed_up: Velkommen! Registrasjonen var vellykket.
+      signed_up_but_inactive: Registrasjonen var vellykket. Vi kunne dessverre ikke logge deg inn fordi kontoen din ennå ikke har blitt aktivert.
+      signed_up_but_locked: Registrasjonen var vellykket. Vi kunne dessverre ikke logge deg inn fordi kontoen din har blitt låst.
+      signed_up_but_unconfirmed: En epostmelding med en bekreftelseslink har blitt sendt til din adresse. Klikk på linken i eposten for å aktivere kontoen din.
+      update_needs_confirmation: Du har oppdatert kontoen din, men vi må bekrefte din nye epostadresse. Sjekk eposten din og følg bekreftelseslinken for å bekrefte din nye epostadresse.
+      updated: Kontoen din ble oppdatert.
+    sessions:
+      already_signed_out: Logget ut.
+      signed_in: Logget inn.
+      signed_out: Logget ut.
+    unlocks:
+      send_instructions: Du vil motta en epost med instruksjoner for å åpne kontoen din om noen få minutter.
+      send_paranoid_instructions: Hvis kontoen din eksisterer vil du motta en epost med instruksjoner for å åpne kontoen din om noen få minutter.
+      unlocked: Kontoen din ble åpnet uten problemer. Logg på for å fortsette.
+  errors:
+    messages:
+      already_confirmed: har allerede blitt bekreftet, prøv å logg på istedet.
+      confirmation_period_expired: må bekreftes innen %{period}. Spør om en ny bekreftelsesmail istedet.
+      expired: har utløpt, spør om en ny en istedet
+      not_found: ikke funnet
+      not_locked: var ikke låst
+      not_saved:
+        one: '1 feil hindret denne %{resource} fra å bli lagret:'
+        other: "%{count} feil hindret denne %{resource} fra å bli lagret:"
diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml
new file mode 100644
index 000000000..398055b36
--- /dev/null
+++ b/config/locales/devise.zh-CN.yml
@@ -0,0 +1,61 @@
+---
+zh-CN:
+  devise:
+    confirmations:
+      confirmed: 邮件已确认。
+      send_instructions: 发送确认邮件
+      send_paranoid_instructions: 发送确认邮件
+    failure:
+      already_authenticated: 已登录。
+      inactive: 账号未激活。
+      invalid: 激活码 %{authentication_keys} 或密码无效。
+      last_attempt: 因多次失败账号已锁。
+      locked: 账号已锁。
+      not_found_in_database: 激活码 %{authentication_keys} 或密码无效。
+      timeout: 登录已过期,请重新登录。
+      unauthenticated: 请先登录
+      unconfirmed: 请先通过邮件激活。
+    mailer:
+      confirmation_instructions:
+        subject: 'Mastodon: 激活指引'
+      password_change:
+        subject: 'Mastodon: 密码变更'
+      reset_password_instructions:
+        subject: 'Mastodon: 密码重置指引'
+      unlock_instructions:
+        subject: 'Mastodon: 账号解锁指引'
+    omniauth_callbacks:
+      failure: 从 %{kind} 授权失败:"%{reason}" 。
+      success: 成功从 %{kind} 授权。
+    passwords:
+      no_token: 仅允许通过密码重置邮件访问本页面,或确认完整 URL。
+      send_instructions: 你将收到密码重置指引邮件。
+      send_paranoid_instructions: 你将收到密码重置邮件。
+      updated: 密码重置成功。
+      updated_not_active: 密码重置成功。
+    registrations:
+      destroyed: 撒油娜啦!账号已经注销。有缘再会。
+      signed_up: 欢迎回来!
+      signed_up_but_inactive: 账号未激活。
+      signed_up_but_locked: 账号已锁定。
+      signed_up_but_unconfirmed: 确认邮件已发,请先激活。
+      update_needs_confirmation: 账号需要重新激活,请先激活。
+      updated: 更新成功。
+    sessions:
+      already_signed_out: 登出成功。
+      signed_in: 登录成功。
+      signed_out: 登出成功。
+    unlocks:
+      send_instructions: 解锁邮件已发,请先解锁。
+      send_paranoid_instructions: 解锁邮件已发,请先解锁。
+      unlocked: 账号已解锁,请登录。
+  errors:
+    messages:
+      already_confirmed: 已激活,请登录。
+      confirmation_period_expired: 需要在 %{period} 内激活,请重新申请。
+      expired: 已过期,请重新申请。
+      not_found: 未发现
+      not_locked: 未锁定
+      not_saved:
+        one: '保存失败: %{resource}'
+        other: "保存失败:%{count}"
diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml
index aaf5df6fc..6412b8b48 100644
--- a/config/locales/doorkeeper.en.yml
+++ b/config/locales/doorkeeper.en.yml
@@ -65,8 +65,9 @@ en:
         revoke: Are you sure?
       index:
         application: Application
-        created_at: Created At
+        created_at: Authorized
         date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Scopes
         title: Your authorized applications
     errors:
       messages:
diff --git a/config/locales/doorkeeper.fi.yml b/config/locales/doorkeeper.fi.yml
new file mode 100644
index 000000000..cd1a9d058
--- /dev/null
+++ b/config/locales/doorkeeper.fi.yml
@@ -0,0 +1,113 @@
+---
+fi:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Nimi
+        redirect_uri: Uudelleenohjaus URI
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: ei voi sisältää osia.
+              invalid_uri: pitää olla validi URI.
+              relative_uri: pitää olla täydellinen URI.
+              secured_uri: pitää olla HTTPS/SSL URI.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Valtuuta
+        cancel: Peruuta
+        destroy: Tuhoa
+        edit: Muokkaa
+        submit: Lähetä
+      confirmations:
+        destroy: Oletko varma?
+      edit:
+        title: Muokkaa applikaatiota
+      form:
+        error: Whoops! Tarkista lomakkeesi mahdollisten virheiden varalta
+      help:
+        native_redirect_uri: Käytä %{native_redirect_uri} paikallisiin testeihin
+        redirect_uri: Käytä yhtä riviä per URI
+        scopes: Erota scopet välilyönnein. Jätä tyhjäksi käyteksi oletus scopeja.
+      index:
+        callback_url: Callback URL
+        name: Nimi
+        new: Uusi applikaatio
+        title: Sinun applikaatiosi
+      new:
+        title: Uusi applikaatio
+      show:
+        actions: Toiminnot
+        application_id: Applikaation Id
+        callback_urls: Callback urls
+        scopes: Scopet
+        secret: Salainen avain
+        title: 'Applikaatio: %{name}'
+    authorizations:
+      buttons:
+        authorize: Valtuuta
+        deny: Evää
+      error:
+        title: Virhe on tapahtunut
+      new:
+        able_to: Se voi
+        prompt: Applikaatio %{client_name} pyytää lupaa tilillesi
+        title: Valtuutus vaaditaan
+      show:
+        title: Valtuutus koodi
+    authorized_applications:
+      buttons:
+        revoke: Evää
+      confirmations:
+        revoke: Oletko varma?
+      index:
+        application: Applikaatio
+        created_at: Valtuutettu
+        date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Scopet
+        title: Valtuuttamasi applikaatiot
+    errors:
+      messages:
+        access_denied: Resurssin omistaja tai valtuutus palvelin hylkäsi pyynnönr.
+        credential_flow_not_configured: Resurssin omistajan salasana epäonnistui koska Doorkeeper.configure.resource_owner_from_credentials ei ole konfiguroitu.
+        invalid_client: Asiakkaan valtuutus epäonnistui koska tuntematon asiakas, asiakas ei sisältänyt valtuutusta, tai tukematon valtuutus tapa
+        invalid_grant: Antamasi valtuutus lupa on joko väärä, erääntynyt, peruttu, ei vastaa uudelleenohjaus URI jota käytetään valtuutus pyynnössä, tai se myönnettin toiselle asiakkaalle.
+        invalid_redirect_uri: Uudelleenohjaus uri ei ole oikein.
+        invalid_request: Pyynnöstä puutti parametri, sisältää tukemattoman parametri arvonn, tai on korruptoitunut.
+        invalid_resource_owner: Annetut resurssin omistajan tunnnukset ovat väärät, tai resurssin omistajaa ei löydy
+        invalid_scope: Pyydetty scope on väärä, tuntemat, tai korruptoitunut.
+        invalid_token:
+          expired: Access token vanhentunut
+          revoked: Access token evätty
+          unknown: Access token väärä
+        resource_owner_authenticator_not_configured: Resurssin omistajan etsiminen epäonnistui koska Doorkeeper.configure.resource_owner_authenticator ei ole konfiguroitu.
+        server_error: Valtuutus palvelin kohtasi odottamattoman virheen joka esti sitä täyttämästä pyyntöä.
+        temporarily_unavailable: Valtuutus palvelin ei voi tällä hetkellä käsitellä pyyntöäsi joko väliaikaisen ruuhkan tai huollon takia.
+        unauthorized_client: Asiakas ei ole valtuutettu tekemään tätä pyyntöä käyttäen tätä metodia.
+        unsupported_grant_type: Valtuutus grant type ei ole tuettu valtuutus palvelimella.
+        unsupported_response_type: Valtuutus palvelin ei tue tätä vastaus tyyppiä.
+    flash:
+      applications:
+        create:
+          notice: Applikaatio luotu.
+        destroy:
+          notice: Applikaatio poistettu.
+        update:
+          notice: Applikaatio päivitetty.
+      authorized_applications:
+        destroy:
+          notice: Applikaatio tuhottu.
+    layouts:
+      admin:
+        nav:
+          applications: Applikaatiot
+          oauth2_provider: OAuth2 Provider
+      application:
+        title: OAuth valtuutus tarvitaan
+    scopes:
+      follow: seuraa, estä, peru esto ja lopeta tilien seuraaminen
+      read: lukea tilin dataa
+      write: julkaista puolestasi
diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml
index 6f3c0864a..c94e5c095 100644
--- a/config/locales/doorkeeper.fr.yml
+++ b/config/locales/doorkeeper.fr.yml
@@ -54,7 +54,7 @@ fr:
         title: Une erreur est survenue
       new:
         able_to: Cette application pourra
-        prompt: Autorisez %{client_name} à utiliser votre compte?
+        prompt: Autoriser %{client_name} à utiliser votre compte?
         title: Autorisation requise
       show:
         title: Code d'autorisation
@@ -66,7 +66,8 @@ fr:
       index:
         application: Application
         created_at: Créé le
-        date_format: "%Y-%m-%d %H:%M:%S"
+        date_format: "%d-%m-%Y %H:%M:%S"
+        scopes: permissions
         title: Vos applications autorisées
     errors:
       messages:
@@ -80,7 +81,7 @@ fr:
         invalid_scope: La portée demandée n'est pas valide, est inconnue, ou est mal formée.
         invalid_token:
           expired: Le jeton d'accès a expiré
-          revoked: Le jeton d'accès a été annulé
+          revoked: Le jeton d'accès a été révoqué
           unknown: Le jeton d'accès n'est pas valide
         resource_owner_authenticator_not_configured: La recherche du propriétaire de la ressource a échoué en raison de Doorkeeper.configure.resource_owner_authenticator n'est pas configuré.
         server_error: Le serveur d'autorisation a rencontré une condition inattendue qui l'a empêché de remplir la demande.
diff --git a/config/locales/doorkeeper.no.yml b/config/locales/doorkeeper.no.yml
new file mode 100644
index 000000000..f149f53e0
--- /dev/null
+++ b/config/locales/doorkeeper.no.yml
@@ -0,0 +1,113 @@
+---
+'no':
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Navn
+        redirect_uri: Omdirigerings-URI
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: kan ikke inneholde ett fragment.
+              invalid_uri: må være en gyldig URI.
+              relative_uri: må være en absolutt URI.
+              secured_uri: må være en HTTPS/SSL URI.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Autoriser
+        cancel: Avbryt
+        destroy: Ødelegg
+        edit: Endre
+        submit: Send inn
+      confirmations:
+        destroy: Er du sikker?
+      edit:
+        title: Endre applikasjon
+      form:
+        error: Whoops! Sjekk skjemaet ditt for mulige feil
+      help:
+        native_redirect_uri: Bruk %{native_redirect_uri} for lokale tester
+        redirect_uri: Bruk en linje per URI
+        scopes: Adskill omfang med mellomrom. La det være blankt for å bruke standard omfang.
+      index:
+        callback_url: Callback URL
+        name: Navn
+        new: Ny Applikasjon
+        title: Dine applikasjoner
+      new:
+        title: Ny Applikasjoner
+      show:
+        actions: Operasjoner
+        application_id: Applikasjon Id
+        callback_urls: Callback urls
+        scopes: Omfang
+        secret: Hemmelighet
+        title: 'Applikasjon: %{name}'
+    authorizations:
+      buttons:
+        authorize: Autoriser
+        deny: Avvis
+      error:
+        title: En feil oppsto
+      new:
+        able_to: Den vil ha mulighet til
+        prompt: Applikasjon %{client_name} spør om tilgang til din konto
+        title: Autorisasjon påkrevd
+      show:
+        title: Autoriserings kode
+    authorized_applications:
+      buttons:
+        revoke: Opphev
+      confirmations:
+        revoke: Opphev?
+      index:
+        application: Applikasjon
+        created_at: Autorisert
+        date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Omfang
+        title: Dine autoriserte applikasjoner
+    errors:
+      messages:
+        access_denied: Ressurseieren eller autoriserings tjeneren avviste forespørslen.
+        credential_flow_not_configured: Ressurseiers passord flyt feilet på grunn av at Doorkeeper.configure.resource_owner_from_credentials ikke var konfigurert.
+        invalid_client: Klient autentisering feilet på grunn av ukjent klient, ingen autentisering inkludert eller autentiserings metode som ikke er støttet.
+        invalid_grant: Autoriseringen er ugyldig, utløpt, opphevet, stemmer ikke overens med omdirigerings-URIen eller var utstedt til en annen klient.
+        invalid_redirect_uri: redirect urien som var inkludert er ikke gyldig.
+        invalid_request: Forespørslen mangler ett eller flere parametere, inkluderte ett parameter som ikke støttes eller har feil struktur.
+        invalid_resource_owner: Ressurseierens detaljer er ikke gyldig, eller så kan ikke eieren finnes.
+        invalid_scope: Det etterspurte omfanget er ugyldig, ukjent eller har feil struktur.
+        invalid_token:
+          expired: Tilgangsbeviset har utløpt
+          revoked: Tilgangsbeviset har blitt opphevet
+          unknown: Tilgangsbeviset er ugyldig
+        resource_owner_authenticator_not_configured: Ressurseier kunne ikke finnes fordi Doorkeeper.configure.resource_owner_authenticator ikke er konfigurert.
+        server_error: Autoriserings tjeneren støtte på en uventet hendelse som hindret den i å svare på forespørslen.
+        temporarily_unavailable: Autoriserings tjeneren kan ikke håndtere forespørslen grunnet en midlertidig overbelastning eller tjenervedlikehold.
+        unauthorized_client: Klienten har ikke autorisasjon for å utføre denne forespørslen med denne metoden.
+        unsupported_grant_type: Autorisasjons tildelings typen er ikke støttet av denne autoriserings tjeneren.
+        unsupported_response_type: Autorisasjons serveren støtter ikke denne typen av forespørsler.
+    flash:
+      applications:
+        create:
+          notice: Applikasjon opprettet.
+        destroy:
+          notice: Applikasjon slettet.
+        update:
+          notice: Applikasjon oppdatert.
+      authorized_applications:
+        destroy:
+          notice: Applikasjon opphevet.
+    layouts:
+      admin:
+        nav:
+          applications: Applikasjoner
+          oauth2_provider: OAuth2 tilbyder
+      application:
+        title: OAuth autorisering påkrevet
+    scopes:
+      follow: følg, blokker, avblokker, avfølg kontoer
+      read: lese dine data
+      write: poste på dine vegne
diff --git a/config/locales/en.yml b/config/locales/en.yml
index b1b1e7995..750af0b7a 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1,15 +1,28 @@
 ---
 en:
   about:
-    about_instance: "<em>%{instance}</em> is a Mastodon instance."
-    about_mastodon: Mastodon is a <em>free, open-source</em> social network server. A <em>decentralized</em> alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Anyone can run Mastodon and participate in the <em>social network</em> seamlessly.
+    about_mastodon: Mastodon is a <em>free, open-source</em> social network. A <em>decentralized</em> alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Pick a server that you trust &mdash; whichever you choose, you can interact with everyone else. Anyone can run their own Mastodon instance and participate in the <em>social network</em> seamlessly.
+    about_this: About this instance
+    apps: Apps
     business_email: 'Business e-mail:'
     contact: Contact
+    closed_registrations: Registrations are currently closed on this instance.
+    description_headline: What is %{domain}?
     domain_count_after: other instances
     domain_count_before: Connected to
+    features:
+      api: Open API for apps and services
+      blocks: Rich block and muting tools
+      characters: 500 characters per post
+      chronology: Timelines are chronological
+      ethics: 'Ethical design: no ads, no tracking'
+      gifv: GIFV sets and short videos
+      privacy: Granular, per-post privacy settings
+      public: Public timelines
+    features_headline: What sets Mastodon apart
     get_started: Get started
-    learn_more: Learn more
     links: Links
+    other_instances: Other instances
     source_code: Source code
     status_count_after: statuses
     status_count_before: Who authored
@@ -27,7 +40,9 @@ en:
     remote_follow: Remote follow
     unfollow: Unfollow
   application_mailer:
+    settings: 'Change e-mail preferences: %{link}'
     signature: Mastodon notifications from %{instance}
+    view: 'View:'
   applications:
     invalid_url: The provided URL is invalid
   auth:
@@ -59,6 +74,11 @@ en:
       x_minutes: "%{count}m"
       x_months: "%{count}mo"
       x_seconds: "%{count}s"
+  exports:
+    blocks: You block
+    csv: CSV
+    follows: You follow
+    storage: Media storage
   generic:
     changes_saved_msg: Changes successfully saved!
     powered_by: powered by %{link}
@@ -66,7 +86,24 @@ en:
     validation_errors:
       one: Something isn't quite right yet! Please review the error below
       other: Something isn't quite right yet! Please review %{count} errors below
+  imports:
+    preface: You can import certain data like all the people you are following or blocking into your account on this instance, from files created by an export on another instance.
+    success: Your data was successfully uploaded and will now be processed in due time
+    types:
+      blocking: Blocking list
+      following: Following list
+    upload: Upload
+  landing_strip_html: <strong>%{name}</strong> is a user on <strong>%{domain}</strong>. You can follow them or interact with them if you have an account anywhere in the fediverse. If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
   notification_mailer:
+    digest:
+      body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:'
+      mention: "%{name} mentioned you in:"
+      new_followers_summary:
+        one: You have acquired one new follower! Yay!
+        other: You have gotten %{count} new followers! Amazing!
+      subject:
+        one: "1 new notification since your last visit \U0001F418"
+        other: "%{count} new notifications since your last visit \U0001F418"
     favourite:
       body: 'Your status was favourited by %{name}:'
       subject: "%{name} favourited your status"
@@ -91,22 +128,24 @@ en:
     proceed: Proceed to follow
     prompt: 'You are going to follow:'
   settings:
+    authorized_apps: Authorized apps
     back: Back to Mastodon
     edit_profile: Edit profile
+    export: Data export
+    import: Import
     preferences: Preferences
     settings: Settings
     two_factor_auth: Two-factor Authentication
   statuses:
     open_in_web: Open in web
     over_character_limit: character limit of %{max} exceeded
+    show_more: Show more
     visibilities:
       private: Only show to followers
       public: Public
       unlisted: Public, but do not display on the public timeline
   stream_entries:
     click_to_show: Click to show
-    favourited: favourited a post by
-    is_now_following: is now following
     reblogged: boosted
     sensitive_content: Sensitive content
   time:
@@ -117,6 +156,8 @@ en:
     disable: Disable
     enable: Enable
     instructions_html: "<strong>Scan this QR code into Google Authenticator or a similiar app on your phone</strong>. From now on, that app will generate tokens that you will have to enter when logging in."
+    plaintext_secret_html: 'Plain-text secret: <samp>%{secret}</samp>'
+    warning: If you cannot configure an authenticator app right now, you should click "disable" or you won't be able to login.
   users:
     invalid_email: The e-mail address is invalid
     invalid_otp_token: Invalid two-factor code
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 2e0adb742..19f2c71b8 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1,7 +1,6 @@
 ---
 es:
   about:
-    about_instance: "<em>%{instance}</em> es una instancia de Mastodon."
     about_mastodon: Mastodon es un servidor de red social <em>libre y de código abierto</em>. Una alternativa <em>descentralizada</em> a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la <em>red social</em>.
     get_started: Comenzar
     source_code: Código fuente
@@ -10,7 +9,7 @@ es:
     follow: Seguir
     followers: Seguidores
     following: Siguiendo
-    nothing_here: ¡No hay nada aquí!
+    nothing_here: "¡No hay nada aquí!"
     people_followed_by: Usuarios a quien %{name} sigue
     people_who_follow: Usuarios que siguen a %{name}
     posts: Publicaciones
@@ -19,20 +18,20 @@ es:
     signature: Notificaciones de Mastodon desde %{instance}
   auth:
     change_password: Cambiar contraseña
-    didnt_get_confirmation: ¿No recibió instrucciones de confirmación?
-    forgot_password: ¿Olvidó su contraseña?
+    didnt_get_confirmation: "¿No recibió instrucciones de confirmación?"
+    forgot_password: "¿Olvidó su contraseña?"
     login: Iniciar sesión
     register: Registrarse
     resend_confirmation: Volver a enviar las instrucciones de confirmación
     reset_password: Restablecer contraseña
     set_new_password: Establecer nueva contraseña
   generic:
-    changes_saved_msg: ¡Cambios guardados con éxito!
+    changes_saved_msg: "¡Cambios guardados con éxito!"
     powered_by: powered by %{link}
     save_changes: Guardar cambios
     validation_errors:
-      one: ¡Algo no está todavía bien! Por favor, revise el error más abajo
-      other: ¡Algo no está todavía bien! Por favor, revise %{count} errores más abajo
+      one: "¡Algo no está todavía bien! Por favor, revise el error más abajo"
+      other: "¡Algo no está todavía bien! Por favor, revise %{count} errores más abajo"
   notification_mailer:
     favourite:
       body: 'Su estado fue marcado como favorito por %{name}:'
@@ -52,8 +51,5 @@ es:
   settings:
     edit_profile: Editar perfil
     preferences: Preferencias
-  stream_entries:
-    favourited: marcado como favorito por
-    is_now_following: está ahora siguiendo
   will_paginate:
     page_gap: "&hellip;"
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
new file mode 100644
index 000000000..3bcfe5c20
--- /dev/null
+++ b/config/locales/fi.yml
@@ -0,0 +1,164 @@
+---
+fi:
+  about:
+    about_mastodon: 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_this: Tietoja tästä palvelimesta
+    apps: Ohjelmat
+    business_email: 'Business e-mail:'
+    contact: Ota yhteyttä
+    description_headline: Mikä on %{domain}?
+    domain_count_after: muut palvelimet
+    domain_count_before: Yhdistyneenä
+    features:
+      api: Avoin API ohjelmille ja palveluille
+      blocks: Rikkaat esto ja hiljennys työkalut
+      characters: 500 kirjainta per viesti
+      chronology: Aikajana on kronologisessa järjestyksessä
+      ethics: 'Eettinen suunnittelu: ei mainoksia, no seurantaa'
+      gifv: GIFV settejä ja lyhyitä videoita
+      privacy: Julkaisu kohtainen yksityisyys aseuts
+      public: Julkiset aikajanat
+    features_headline: Mikä erottaa Mastodonin muista
+    get_started: Aloita käyttö
+    links: Linkit
+    other_instances: Muut palvelimet
+    source_code: Lähdekoodi
+    status_count_after: statukset
+    status_count_before: Kuka loi
+    terms: Ehdot
+    user_count_after: käyttäjät
+    user_count_before: Koti käyttäjälle
+  accounts:
+    follow: Seuraa
+    followers: Seuraajat
+    following: Seuratut
+    nothing_here: Täällä ei ole mitään!
+    people_followed_by: Henkilöitä joita %{name} seuraa
+    people_who_follow: Henkilöt jotka seuraa %{name}
+    posts: Postaukset
+    remote_follow: Etäseuranta
+    unfollow: Lopeta seuraaminen
+  application_mailer:
+    settings: 'Muokkaa sähköposti asetuksia: %{link}'
+    signature: Mastodon ilmoituksia palvelimelta %{instance}
+    view: 'Katso:'
+  applications:
+    invalid_url: Annettu URL on väärä
+  auth:
+    change_password: Tunnukset
+    didnt_get_confirmation: Etkö saanut varmennus ohjeita?
+    forgot_password: Unohditko salasanasi?
+    login: Kirjaudu sisään
+    logout: Kirjaudu ulos
+    register: Rekisteröidy
+    resend_confirmation: Lähetä varmennus ohjeet uudestaan
+    reset_password: Palauta Salasana
+    set_new_password: Aseta uusi salasana
+  authorize_follow:
+    error: Valitettavasti tapahtui virhe etätilin haussa
+    follow: Seuraa
+    prompt_html: 'Sinä (<strong>%{self}</strong>) olet pyytänyt lupaa seurata:'
+    title: Seuraa %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}t"
+      about_x_months: "%{count}kk"
+      about_x_years: "%{count}v"
+      almost_x_years: "%{count}v"
+      half_a_minute: Juuri nyt
+      less_than_x_minutes: "%{count}m"
+      less_than_x_seconds: Juuri nyt
+      over_x_years: "%{count}v"
+      x_days: "%{count}pv"
+      x_minutes: "%{count}m"
+      x_months: "%{count}kk"
+      x_seconds: "%{count}s"
+  exports:
+    blocks: Estosi
+    csv: CSV
+    follows: Seurattavat
+    storage: Mediasi
+  generic:
+    changes_saved_msg: Muutokset onnistuneesti tallenettu!
+    powered_by: powered by %{link}
+    save_changes: Tallenna muutokset
+    validation_errors:
+      one: Jokin ei ole viellä oikein! Katso virhe alapuolelta
+      other: Jokin ei ole viellä oikein! Katso %{count} virhettä alapuolelta
+  imports:
+    preface: Voit tuoda tiettyä dataa kaikista ihmisistä joita seuraat tai estät tilillesi tälle palvelimelle tiedostoista, jotka on luotu toisella palvelimella
+    success: Datasi on onnistuneesti ladattu ja käsitellään pian
+    types:
+      blocking: Esto lista
+      following: Seuratut lista
+    upload: Lähetä
+  landing_strip_html: <strong>%{name}</strong> on käyttäjä domainilla <strong>%{domain}</strong>. Voit seurata tai vuorovaikuttaa heidän kanssaan jos sinulla on tili yleisessä verkossa. Jos sinulla ei ole tiliä, voit <a href="%{sign_up_path}">rekisteröityä täällä</a>.
+  notification_mailer:
+    digest:
+      body: 'Tässä on pieni yhteenveto palvelimelta %{instance} viimeksi kun olit paikalla %{since}:'
+      mention: "%{name} mainitsi sinut:"
+      new_followers_summary:
+        one: Olet saanut yhden uuden seuraajan! Jee!
+        other: Olet saanut %{count} uutta seuraajaa! Loistavaa!
+      subject:
+        one: "1 uusi ilmoitus viimeisen käyntisi jälkeen \U0001F418"
+        other: "%{count} uutta ilmoitusta viimeisen käyntisi jälkeen \U0001F418"
+    favourite:
+      body: 'Statuksestasi tykkäsi %{name}:'
+      subject: "%{name} tykkäsi sinun statuksestasi"
+    follow:
+      body: "%{name} seuraa nyt sinua!"
+      subject: "%{name} seuraa nyt sinua"
+    follow_request:
+      body: "%{name} on pyytänyt seurata sinua"
+      subject: 'Odottava seuraus pyyntö: %{name}'
+    mention:
+      body: 'Sinut mainitsi %{name} postauksessa:'
+      subject: Sinut mainitsi %{name}
+    reblog:
+      body: 'Sinun statustasi boostasi %{name}:'
+      subject: "%{name} boostasi statustasi"
+  pagination:
+    next: Seuraava
+    prev: Edellinen
+  remote_follow:
+    acct: Syötä sinun käyttäjänimesi@domain jos haluat seurata palvelimelta
+    missing_resource: Ei löydetty tarvittavaa uudelleenohjaavaa URL-linkkiä tilillesi
+    proceed: Siirry seuraamiseen
+    prompt: 'Sinä aiot seurata:'
+  settings:
+    authorized_apps: Valtuutetut ohjelmat
+    back: Takaisin Mastodoniin
+    edit_profile: Muokkaa profiilia
+    export: Datan vienti
+    import: Datan tuonti
+    preferences: Mieltymykset
+    settings: Asetukset
+    two_factor_auth: Kaksivaiheinen tunnistus
+  statuses:
+    open_in_web: Avaa webissä
+    over_character_limit: sallittu kirjanmäärä %{max} ylitetty
+    show_more: Näytä lisää
+    visibilities:
+      private: Näytä vain seuraajille
+      public: Julkinen
+      unlisted: Julkinen, mutta älä näytä julkisella aikajanalla
+  stream_entries:
+    click_to_show: Klikkaa näyttääksesi
+    reblogged: boosted
+    sensitive_content: Herkkä materiaali
+  time:
+    formats:
+      default: "%b %d, %Y, %H:%M"
+  two_factor_auth:
+    description_html: Jos otat käyttöön <strong>kaksivaiheisen tunnistuksen</stron>, kirjautumiseen vaaditaan puhelin, joka voi generoida tokeneita kirjautumista varten.
+    disable: Poista käytöstä
+    enable: Ota käyttöön
+    instructions_html: "<strong>Skannaa tämä QR-koodi Google Authenticator tai samanlaiseen sovellukseen puhelimellasi</strong>. Tästä hetkestä lähtien, ohjelma generoi tokenit mikä sinun tarvitsee syöttää sisäänkirjautuessa."
+    plaintext_secret_html: 'Plain-text secret: <samp>%{secret}</samp>'
+    warning: Jos et juuri nyt voi konfiguroida authenticator-applikaatiota juuri nyt, sinun pitäisi klikata "Poista käytöstä" tai et voi kirjautua sisään.
+  users:
+    invalid_email: Virheellinen sähköposti
+    invalid_otp_token: Virheellinen kaksivaihe tunnistus koodi
+  will_paginate:
+    page_gap: "&hellip;"
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index f78cd0de5..758501403 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -1,42 +1,94 @@
 ---
 fr:
   about:
-    about_instance: "<em>%{instance}</em> est une instance de Mastodon."
-    about_mastodon: "Mastodon est un serveur <em>libre</em> de réseautage social. Alternative <em>décentralisée</em> aux plateformes commerciales, la monopolisation de vos communications par une entreprise unique est évitée. Tout un chacun peut faire tourner Mastodon et participer au <em>réseau social</em> de manière transparente."
-    get_started: "Rejoindre le réseau"
-    source_code: "Code source"
-    terms: "Conditions d’utilisation"
+    about_mastodon: Mastodon est un serveur <em>libre</em> de réseautage social. Alternative <em>décentralisée</em> aux plateformes commerciales, la monopolisation de vos communications par une entreprise unique est évitée. Tout un chacun peut faire tourner Mastodon et participer au <em>réseau social</em> de manière transparente.
+    about_this: À propos de cette instance
+    apps: Applications
+    business_email: E-mail professionnel
+    description_headline: Qu'est-ce que %{domain} ?
+    domain_count_after: autres instances
+    domain_count_before: Connectés à
+    features:
+      api: API ouverte aux apps et services
+      blocking: Outils complets de bloquage et masquage
+      characters: 500 caractères par post
+      chronology: Fil chronologique
+      ethics: 'Pas de pubs, pas de pistage'
+      gifv: Partage de vidéos et de GIFs
+      privacy: Réglages de confidentialité au niveau des posts
+      public: Fils publics
+    features_headline: Ce qui rend Mastodon différent
+    get_started: Rejoindre le réseau
+    links: Liens
+    source_code: Code source
+    status_count_after: posts
+    status_count_before: Ayant publié
+    terms: Conditions d’utilisation
+    user_count_after: utilisateurs⋅trices
+    user_count_before: Abrite
   accounts:
-    follow: "Suivre"
-    followers: "Abonnés"
-    following: "Abonnements"
-    nothing_here: "Rien à voir ici !"
-    people_followed_by: "Personnes suivies par %{name}"
-    people_who_follow: "Personnes qui suivent %{name}"
-    posts: "Statuts"
-    unfollow: "Ne plus suivre"
+    follow: Suivre
+    followers: Abonné⋅es
+    following: Abonnements
+    nothing_here: Rien à voir ici !
+    people_followed_by: Personnes suivies par %{name}
+    people_who_follow: Personnes qui suivent %{name}
+    posts: Statuts
+    remote_follow: Suivre à distance
+    unfollow: Ne plus suivre
   application_mailer:
-    signature: "Notifications de Mastodon depuis %{instance}"
+    settings: 'Changer les préférences e-mail: ${link}'
+    signature: Notifications de Mastodon depuis %{instance}
+    view: 'Voir:'
+  applications:
+    invalid_url: L'URL fournie est invalide
   auth:
-    change_password: "Changer de mot de passe"
-    didnt_get_confirmation: "Vous n’avez pas reçu les consignes de confirmation ?"
-    forgot_password: "Mode passe oublié ?"
-    login: "Se connecter"
-    register: "S’inscrire"
-    resend_confirmation: "Envoyer à nouveau les consignes de confirmation"
-    reset_password: "Réinitialiser le mot de passe"
-    set_new_password: "Établir le nouveau mot de passe"
+    change_password: Changer de mot de passe
+    didnt_get_confirmation: Vous n’avez pas reçu les consignes de confirmation ?
+    forgot_password: Mot de passe oublié ?
+    login: Se connecter
+    logout: Se déconnecter
+    register: S’inscrire
+    resend_confirmation: Envoyer à nouveau les consignes de confirmation
+    reset_password: Réinitialiser le mot de passe
+    set_new_password: Définir le nouveau mot de passe
+  authorize_follow:
+    follow: Suivre
+    prompt_html: 'Vous (<strong>%{self}</strong>) avez demandé à suivre:'
+    title: Suivre %{acct}
+  exports:
+    blocks: Vous bloquez
+    csv: CSV
+    follows: Vous suivez
+    storage: Médias stockés
   generic:
-    changes_saved_msg: "Les modifications ont été enregistrées avec succès !"
-    powered_by: "propulsé par %{link}"
-    save_changes: "Enregistrer les modifications"
+    changes_saved_msg: Les modifications ont été enregistrées avec succès !
+    powered_by: propulsé par %{link}
+    save_changes: Enregistrer les modifications
     validation_errors:
-      one: "Quelque chose ne va pas ! Vérifiez l’erreur ci-dessous."
-      other: "Quelques choses ne vont pas ! Vérifiez les erreurs ci-dessous."
+      one: Quelque chose ne va pas ! Vérifiez l’erreur ci-dessous.
+      other: Quelques choses ne vont pas ! Vérifiez les erreurs ci-dessous.
+  imports:
+    preface: Vous pouvez importer certaines données comme les personnes que vous suivez ou bloquez sur votre compte sur cette instance à partir de fichiers crées sur une autre instance.
+    success: Vos données ont été importées avec succès et seront traités en temps et en heure
+    types:
+      blocking: Liste d'utilisateurs⋅trices bloqué⋅es
+      following: Liste d'utilisateurs⋅trices suivi⋅es
+    upload: Importer
+  landing_strip_html: <strong>%{name}</strong> utilise <strong>%{domain}</strong>. Vous pouvez le/la suivre et interagir si vous possédez un compte quelque part dans le "fediverse". Si ce n'est pas le cas, vous pouvez <a href="%{sign_up_path}">en créer un ici</a>.
   notification_mailer:
+    digest:
+      body: 'Voici ce que vous avez raté sur ${instance} depuis votre dernière visite (%{}):'
+      mention: '%{name} vous a mentionné⋅e'
+      new_followers_summary:
+        one: Vous avez un⋅e nouvel⋅le abonné⋅e ! Youpi !
+        other: Vous avez %{count} nouveaux abonné⋅es ! Incroyable !
+      subject:
+        one: "Une nouvelle notification depuis votre dernière visite \U0001F418"
+        other: "%{count} nouvelles notifications depuis votre dernière visite \U0001F418"
     favourite:
-      body: "%{name} a ajouté votre statut à ses favoris :"
-      subject: "%{name} a ajouté votre statut à ses favoris"
+      body: "%{name} a ajouté votre post à ses favoris :"
+      subject: "%{name} a ajouté votre post à ses favoris"
     follow:
       body: "%{name} vous suit !"
       subject: "%{name} vous suit"
@@ -47,13 +99,46 @@ fr:
       body: "%{name} a partagé votre statut :"
       subject: "%{name} a partagé votre statut"
   pagination:
-    next: "Suivant"
-    prev: "Précédent"
+    next: Suivant
+    prev: Précédent
+  remote_follow:
+    acct: Entrez votre pseudo@instance depuis lequel vous voulez suivre ce⋅tte utilisateur⋅trice
+    missing_resource: L'URL de redirection n'a pas pu être trouvée
+    proceed: Continuez pour suivre
+    prompt: 'Vous allez suivre :'
   settings:
-    edit_profile: "Modifier le profil"
-    preferences: "Préférences"
+    authorized_apps: Applications autorisées
+    back: Retour vers Mastodon
+    edit_profile: Modifier le profil
+    export: Export de données
+    import: Import de données
+    preferences: Préférences
+    settings: Réglages
+    two_factor_auth: Identification à deux facteurs (Two-factor auth)
+  statuses:
+    open_in_web: Ouvrir sur le web
+    over_character_limit: limite de caractères dépassée de %{max} caractères
+    show_more: Montrer plus
+    visibilities:
+      private: Abonné⋅es uniquement
+      public: Public
+      unlisted: Public sans être affiché sur le fil public
   stream_entries:
-    favourited: "a ajouté à ses favoris un statut de"
-    is_now_following: "suit désormais"
+    click_to_show: Clic pour afficher
+    reblogged: partagé
+    sensitive_content: Contenu sensible
+  time:
+    formats:
+      default: '%d %b %Y, %H:%M'
+  two_factor_auth:
+    description_html: Si vous activez <strong>l'identification à deux facteurs</strong> vous devrez être en posession de votre téléphone afin de générer un code de connexion.
+    disable: Désactiver
+    enable: Activer
+    instructions_html: "<strong>Scannez ce QR code grâce à Google Authenticator, Authy ou une application similaire sur votre téléphone</strong>. Désormais, cette application générera des jetons que vous devrez saisir à chaque connexion."
+    plaintext_secret_html: 'Code secret en clair: <samp>%{secret}</samp>'
+    warning: Si vous ne pouvez pas configurer une application d'authentification maintenant, vous devriez cliquer sur "Désactiver" pour ne pas bloquer l'accès à votre compte.
+  users:
+    invalid_email: L'adresse e-mail est invalide
+    invalid_otp_token: Le code d'authentification à deux facteurs est invalide
   will_paginate:
     page_gap: "&hellip;"
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index d891b2b28..915d02c19 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -1,7 +1,6 @@
 ---
 hu:
   about:
-    about_instance: "<em>%{instance}</em> egy Mastodon másolat."
     about_mastodon: Mastodon egy <em>szabad, nyílt forráskódú</em> szociális hálózati kiszolgálo. Egy <em>központosítatlan</em> alternatíva a kereskedelmi platformokra, elkerüli a kommunikációd monopolizációját veszélyét. Bárki futtathatja a Mastodon-t és részt vehet a <em>szociális hálózatban</em>.
     get_started: Első lépések
     source_code: Forráskód
@@ -41,7 +40,7 @@ hu:
       body: "%{name} mostantól követ téged!"
       subject: "%{name} mostantól követ téged"
     mention:
-      body: '%{name} megemlített téged:'
+      body: "%{name} megemlített téged:"
       subject: "%{name} megemlített téged"
     reblog:
       body: 'Az állapotod reblogolta %{name}:'
@@ -52,8 +51,5 @@ hu:
   settings:
     edit_profile: Profil szerkesztése
     preferences: Beállítások
-  stream_entries:
-    favourited: kedvencnek jelölték a bejegyzésedet 
-    is_now_following: mostantól követ
   will_paginate:
     page_gap: "&hellip;"
diff --git a/config/locales/no.yml b/config/locales/no.yml
new file mode 100644
index 000000000..b9a752d5a
--- /dev/null
+++ b/config/locales/no.yml
@@ -0,0 +1,164 @@
+---
+'no':
+  about:
+    about_mastodon: Mastodon er et <em>gratis, åpen kildekode</em> sosialt nettverk. Et <em>desentralisert</em> alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap med monopol på din kommunikasjon. Velg en tjener du stoler på &mdash; uansett hvilken du velger så kan du interagere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket.
+    about_this: Om denne instansen
+    apps: Applikasjoner
+    business_email: 'Bedriftsepost:'
+    contact: Kontakt
+    description_headline: Hva er %{domain}?
+    domain_count_after: andre instanser
+    domain_count_before: Koblet til
+    features:
+      api: Åpent api for applikasjoner og tjenester
+      blocks: Rikholdige blokkerings verktøy
+      characters: 500 tegn per post
+      chronology: Tidslinjer er kronologiske
+      ethics: 'Etisk design: Ingen reklame, ingen sporing'
+      gifv: GIFV sett og korte videoer
+      privacy: Finmaskete personvernsinnstillinger
+      public: Offentlige tidslinjer
+    features_headline: Hva skiller Mastodon fra andre sosiale nettverk
+    get_started: Kom i gang
+    links: Lenker
+    other_instances: Andre instanser
+    source_code: Kildekode
+    status_count_after: statuser
+    status_count_before: Hvem skrev
+    terms: Betingelser
+    user_count_after: brukere
+    user_count_before: Hjem til
+  accounts:
+    follow: Følg
+    followers: Følgere
+    following: Følger
+    nothing_here: Det er ingenting her!
+    people_followed_by: Folk som %{name} følger
+    people_who_follow: Folk som følger %{name}
+    posts: Poster
+    remote_follow: Følg fra andre instanser
+    unfollow: Avfølg
+  application_mailer:
+    settings: 'Endre foretrukne epost innstillinger: %{link}'
+    signature: Mastodon notiser fra %{instance}
+    view: 'Se:'
+  applications:
+    invalid_url: Den oppgitte URLen er ugyldig
+  auth:
+    change_password: Brukerdetaljer
+    didnt_get_confirmation: Fikk du ikke bekreftelsesmailen din?
+    forgot_password: Har du glemt passordet ditt?
+    login: Innlogging
+    logout: Logg ut
+    register: Bli med
+    resend_confirmation: Send bekreftelsesinstruksjoner på nytt
+    reset_password: Nullstill passord
+    set_new_password: Sett nytt passord
+  authorize_follow:
+    error: Uheldigvis så skjedde det en feil når vi prøvde å få tak i en konto fra en annen instans.
+    follow: Følg
+    prompt_html: 'Du (<strong>%{self}</strong>) har spurt om å følge:'
+    title: Følg %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}t"
+      about_x_months: "%{count}m"
+      about_x_years: "%{count}å"
+      almost_x_years: "%{count}å"
+      half_a_minute: Nylig
+      less_than_x_minutes: "%{count}min"
+      less_than_x_seconds: Nylig
+      over_x_years: "%{count}å"
+      x_days: "%{count}d"
+      x_minutes: "%{count}min"
+      x_months: "%{count}mo"
+      x_seconds: "%{count}s"
+  exports:
+    blocks: Du blokkerer
+    csv: CSV
+    follows: Du følger
+    storage: Media lagring
+  generic:
+    changes_saved_msg: Vellykket lagring av endringer!
+    powered_by: drevet av %{link}
+    save_changes: Lagre endringer
+    validation_errors:
+      one: Noe er ikke helt riktig ennå. Vær snill å se etter en gang til
+      other: Noe er ikke helt riktig ennå. Det er ennå %{count} feil å rette på
+  imports:
+    preface: Du kan importere data om mennesker du følger eller blokkerer inn til kontoen din på denne instansen, fra filer opprettet av eksporter fra andre instanser.
+    success: Din data ble mottatt og vil bli prosessert så fort som mulig.
+    types:
+      blocking: Blokkeringsliste
+      following: Følgeliste
+    upload: Opplastning
+  landing_strip_html: <strong>%{name}</strong> er en bruker på <strong>%{domain}</strong>. Du kan følge dem eller interagere med dem hvis du har en konto hvor som helst i fediverset. Hvis du ikke har en konto så kan du <a href="%{sign_up_path}">registrere deg her</a>.
+  notification_mailer:
+    digest:
+      body: 'Her er en kort oppsummering av hva du har gått glipp av på %{instance} siden du logget deg inn sist den %{since}:'
+      mention: "%{name} nevnte deg i:"
+      new_followers_summary:
+        one: Du har fått en ny følger. Jippi!
+        other: Du har fått %{count} nye følgere! Imponerende!
+      subject:
+        one: "1 ny hendelse siden ditt siste besøk \U0001F418"
+        other: "%{count} nye hendelser siden ditt siste besøk \U0001F418"
+    favourite:
+      body: 'Din status ble satt som favoritt av %{name}'
+      subject: "%{name} satte din status som favoritt."
+    follow:
+      body: "%{name} følger deg!"
+      subject: "%{name} følger deg"
+    follow_request:
+      body: "%{name} har spurt om å få lov til å følge deg"
+      subject: 'Ventende følger: %{name}'
+    mention:
+      body: 'Du ble nevnt av %{name} i:'
+      subject: Du ble nevnt av %{name}
+    reblog:
+      body: 'Din status fikk en boost av %{name}:'
+      subject: "%{name} ga din status en boost"
+  pagination:
+    next: Neste
+    prev: Forrige
+  remote_follow:
+    acct: Tast inn brukernavn@domene som du vil følge fra
+    missing_resource: Kunne ikke finne URLen for din konto
+    proceed: Fortsett med følging
+    prompt: 'Du kommer til å følge:'
+  settings:
+    authorized_apps: Autoriserte applikasjoner
+    back: Tilbake til Mastodon
+    edit_profile: Endre profil
+    export: Data eksport
+    import: Importer
+    preferences: Foretrukne valg
+    settings: Innstillinger
+    two_factor_auth: To-faktor autentisering
+  statuses:
+    open_in_web: Åpne i nettleser
+    over_character_limit: tegngrense på %{max} overskredet
+    show_more: Vis mer
+    visibilities:
+      private: Vis kun til følgere
+      public: Offentlig
+      unlisted: Offentlig, men vis ikke på offentlig tidslinje
+  stream_entries:
+    click_to_show: Klikk for å vise
+    reblogged: boostet
+    sensitive_content: Sensitivt innhold
+  time:
+    formats:
+      default: "%d, %b %Y, %H:%M"
+  two_factor_auth:
+    description_html: Hvis du skru på <strong>tofaktor autentisering</strong> vil innlogging kreve at du har telefonen din, som vil generere koder som du må taste inn.
+    disable: Skru av
+    enable: Skru på
+    instructions_html: "<strong>Scan denne QR-koden i Google Authenticator eller en lignende app på telefonen din</strong>. Fra nå av så vil denne applikasjonen generere koder for deg som skal brukes under innlogging"
+    plaintext_secret_html: 'Plain-text secret: <samp>%{secret}</samp>'
+    warning: Hvis du ikke kan konfigurere en autentikatorapp nå, så bør du trykke "Skru av"; ellers vil du ikke kunne logge inn.
+  users:
+    invalid_email: E-post addressen er ugyldig
+    invalid_otp_token: Ugyldig two-faktor kode
+  will_paginate:
+    page_gap: "&hellip;"
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index d02c0bdc5..ad7d05e3b 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -1,7 +1,6 @@
 ---
 pt:
   about:
-    about_instance: "<em>%{instance}</em> é uma instância de Mastodon."
     about_mastodon: Mastodon é um servidor de rede social <em>grátis, e open-source</em>. Uma alternativa <em>descentralizada</em> ás plataformas comerciais, que evita o risco de uma única empresa monopolizar a sua comunicação. Qualquer um pode ter uma instância Mastodon e assim participar na <em>rede social federada</em> sem problemas.
     get_started: Como começar
     source_code: Source code
@@ -52,8 +51,5 @@ pt:
   settings:
     edit_profile: Editar perfil
     preferences: Preferências
-  stream_entries:
-    favourited: favoritou um post por
-    is_now_following: agora segue
   will_paginate:
     page_gap: "&hellip;"
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index c781831a8..dfc67fdfd 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -8,12 +8,15 @@ en:
         header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px
         locked: Requires you to manually approve followers and defaults post privacy to followers-only
         note: At most 160 characters
+      imports:
+        data: CSV file exported from another Mastodon instance
     labels:
       defaults:
         avatar: Avatar
         confirm_new_password: Confirm new password
         confirm_password: Confirm password
         current_password: Current password
+        data: Data
         display_name: Display name
         email: E-mail address
         header: Header
@@ -24,11 +27,13 @@ en:
         otp_attempt: Two-factor code
         password: Password
         setting_default_privacy: Post privacy
+        type: Import type
         username: Username
       interactions:
         must_be_follower: Block notifications from non-followers
         must_be_following: Block notifications from people you don't follow
       notification_emails:
+        digest: Send digest e-mails
         favourite: Send e-mail when someone favourites your status
         follow: Send e-mail when someone follows you
         follow_request: Send e-mail when someone requests to follow you
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
new file mode 100644
index 000000000..02c11752f
--- /dev/null
+++ b/config/locales/simple_form.fi.yml
@@ -0,0 +1,46 @@
+---
+fi:
+  simple_form:
+    hints:
+      defaults:
+        avatar: PNG, GIF tai JPG. Korkeintaan 2MB. Skaalataan kokoon 120x120px
+        display_name: Korkeintaan 30 merkkiä
+        header: PNG, GIF tai JPG. Korkeintaan 2MB. Skaalataan kokoon 700x335px
+        locked: Vaatii sinun manuaalisesti hyväksymään seuraajat ja asettaa julkaisun yksityisyyden vain seuraajille
+        note: Korkeintaan 160 merkkiä
+      imports:
+        data: CSV tiedosto tuotu toiselta Mastodon palvelimelta
+    labels:
+      defaults:
+        avatar: Avatar
+        confirm_new_password: Varmista uusi salasana
+        confirm_password: Varmista salasana
+        current_password: Nykyinen salasana
+        data: Data
+        display_name: Näyttö nimi
+        email: Sähköpostiosoite
+        header: Header
+        locale: Kieli
+        locked: Tee tilistä yksityinen
+        new_password: Uusi salasana
+        note: Bio
+        otp_attempt: Kaksivaiheinen koodi
+        password: Salasana
+        setting_default_privacy: Julkaisun yksityisyys
+        type: Tuonti tyyppi
+        username: Käyttäjänimi
+      interactions:
+        must_be_follower: Estä ilmoitukset käyttäjiltä jotka eivät seuraa sinua
+        must_be_following: Estä ilmoitukset käyttäjiltä joita et seuraa
+      notification_emails:
+        digest: Send digest e-mails
+        favourite: Lähetä s-posti kun joku tykkää statuksestasi
+        follow: Lähetä s-posti kun joku seuraa sinua
+        follow_request: Lähetä s-posti kun joku pyytää seurata sinua
+        mention: Lähetä s-posti kun joku mainitsee sinut
+        reblog: Lähetä s-posti kun joku uudestaanblogaa julkaisusi
+    'no': 'Ei'
+    required:
+      mark: "*"
+      text: vaaditaan
+    'yes': 'Kyllä'
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 0fcf89140..fd0373436 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -1,26 +1,42 @@
 ---
 fr:
   simple_form:
+    hints:
+      defaults:
+        avatar: Au format PNG, GIF ou JPG. 2Mo maximum. Sera réduit à 120x120px
+        display_name: 30 caractères maximum
+        header: Au format PNG, GIF ou JPG. 2Mo maximum. Sera réduit à 700x335px
+        locked: Vous devrez approuver chaque abonné⋅e et vos statuts ne s'afficheront qu'à vos abonné⋅es
+        note: 160 caractères maximum
+      imports:
+        data: Un fichier CSV généré par une autre instance de Mastodon
     labels:
       defaults:
         avatar: Image de profil
         confirm_new_password: Confirmation du nouveau mot de passe
         confirm_password: Confirmation du mot de passe
         current_password: Mot de passe actuel
+        data: Données
         display_name: Nom public
         email: Adresse courriel
         header: Image d’en-tête
         locale: Langue
+        locked: Rendre le compte privé
         new_password: Nouveau mot de passe
         note: Présentation
+        otp_attempt: Code d'identification à deux facteurs
         password: Mot de passe
+        setting_default_privacy: Confidentialité des statuts
+        type: Type d'import
         username: Identifiant
       interactions:
         must_be_follower: Masquer les notifications des personnes qui ne vous suivent pas
         must_be_following: Masquer les notifications des personnes que vous ne suivez pas
       notification_emails:
-        favourite: Envoyer un courriel lorsque quelqu’un ajoute mes statut à ses favoris
+        digest: Envoyer des emails récapitulatifs
+        favourite: Envoyer un courriel lorsque quelqu’un ajoute mes statuts à ses favoris
         follow: Envoyer un courriel lorsque quelqu’un me suit
+        follow_request: Envoyer un courriel lorsque quelqu'un demande à me suivre
         mention: Envoyer un courriel lorsque quelqu’un me mentionne
         reblog: Envoyer un courriel lorsque quelqu’un partage mes statuts
     'no': Non
diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml
new file mode 100644
index 000000000..7e705b19b
--- /dev/null
+++ b/config/locales/simple_form.no.yml
@@ -0,0 +1,46 @@
+---
+'no':
+  simple_form:
+    hints:
+      defaults:
+        avatar: PNG, GIF eller JPG. Maksimalt 2MB. Vil bli nedskalert til 120x120px
+        display_name: Maksimalt 30 tegn
+        header: PNG, GIF eller JPG. Maksimalt 2MB. Vil bli nedskalert til 700x335px
+        locked: Krever at du manuelt godkjenner følgere og setter standard beskyttelse av poster til kun-følgere
+        note: Maksimalt 160 tegn
+      imports:
+        data: CSV fil eksportert fra en annen Mastodon instans
+    labels:
+      defaults:
+        avatar: Avatar
+        confirm_new_password: Bekreft nytt passord
+        confirm_password: Bekreft passord
+        current_password: Nåværende passord
+        data: Data
+        display_name: Visningsnavn
+        email: E-post adresse
+        header: Header
+        locale: Språk
+        locked: Endre konto til privat
+        new_password: Nytt passord
+        note: Biografi
+        otp_attempt: To-faktor kode
+        password: Passord
+        setting_default_privacy: Leserettigheter for poster
+        type: Importeringstype
+        username: Brukernavn
+      interactions:
+        must_be_follower: Blokker meldinger fra ikke-følgere
+        must_be_following: Blokker meldinger fra folk du ikke følger
+      notification_emails:
+        digest: Send oppsummerings eposter
+        favourite: Send e-post når noen setter din status som favoritt
+        follow: Send e-post når noen følger deg
+        follow_request: Send e-post når noen spør om å få følge deg
+        mention: Send e-post når noen nevner deg
+        reblog: Send e-post når noen reblogger din status
+    'no': 'Nei'
+    required:
+      mark: "*"
+      text: påkrevd
+    'yes': 'Ja'
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
new file mode 100644
index 000000000..cda4e6838
--- /dev/null
+++ b/config/locales/simple_form.zh-CN.yml
@@ -0,0 +1,42 @@
+---
+zh-CN:
+  simple_form:
+    hints:
+      defaults:
+        avatar: 不超过 2MB,限 PNG, GIF 或 JPG 格式,将缩到 120x120px
+        display_name: 不起过 30 个字符
+        header: 不超过 2MB,限 PNG, GIF 或 JPG 格式,将缩到 700x335px
+        locked: 默认仅向粉丝公开,需要手工设置通过的粉丝。
+        note: 不起过 160 个字符
+    labels:
+      defaults:
+        avatar: 头像
+        confirm_new_password: 确认新密码
+        confirm_password: 确认密码
+        current_password: 当前密码
+        display_name: 显示名
+        email: 邮箱
+        header: 头
+        locale: 语言
+        locked: 隐私模式
+        new_password: 新密码
+        note: Bio
+        otp_attempt: 两步难码
+        password: 密码
+        setting_default_privacy: 推文隐私
+        username: 用户名
+      interactions:
+        must_be_follower: 仅粉丝可私信
+        must_be_following: 仅关注中可私信
+      notification_emails:
+        digest: 发送摘要邮件
+        favourite: 有人收藏你的发送邮件通知
+        follow: 有人关注你时发送邮件通知
+        follow_request: 有人请求关注你时发送邮件通知
+        mention: 有人 AT 你时发送邮件通知
+        reblog: 有人转发时发送邮件通知
+    'no': '否'
+    required:
+      mark: "*"
+      text: 必须
+    'yes': '是'
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 621dfb323..27e8135df 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -1,7 +1,6 @@
 ---
 uk:
   about:
-    about_instance: "<em>%{instance}</em> є інстанцією Mastodon."
     about_mastodon: Mastodon <em> - це вільний</em> соціальний мережевий сервер <em> з відкритим вихідним кодом</em>. Він є <em>децентралізованою</em> альтернативою комерційним платформам, що дозволяє уникнути ризиків монополізації вашого спілкування однією компанією. Будь-який користувач може запустити Mastodon та без проблем брати участь в <em>соціальній мережі</em>.
     get_started: Почати
     source_code: Вихідний код
@@ -36,7 +35,7 @@ uk:
   notification_mailer:
     favourite:
       body: 'Ваш статус подобається %{name}:'
-      subject: "Користувачу %{name} сподобвся ваш статус"
+      subject: Користувачу %{name} сподобвся ваш статус
     follow:
       body: "%{name} тепер підписаний на вас!"
       subject: "%{name} тепер підписаний на вас"
@@ -52,8 +51,5 @@ uk:
   settings:
     edit_profile: Редагувати профіль
     preferences: Налаштування
-  stream_entries:
-    favourited: сподобався допис від
-    is_now_following: тепер підписаний(-а) на
   will_paginate:
     page_gap: "&hellip;"
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
new file mode 100644
index 000000000..78c4d46e2
--- /dev/null
+++ b/config/locales/zh-CN.yml
@@ -0,0 +1,154 @@
+---
+zh-CN:
+  about:
+    about_mastodon: Mastodon <em>开源、自由</em>社交网络。<em>去中心化</em>的商业平台替代,避免单一商业公司垄断沟通。可选择、可信任地任意交流。任何人均可以运行自己的 Mastodon 并进行无缝交流。
+    about_this: 关于本实例
+    business_email: 商务邮件:
+    contact: 联络
+    description_headline: 去中心化 %{domain} 是什么?
+    domain_count_after: 其它实例
+    domain_count_before: Connected to
+    features:
+      api: 对APP 和服务开放的 API
+      blocks: Rich block and muting tools
+      characters: 每个推多达 500 字符
+      chronology: 按时间线排序
+      ethics: 良心之作:没有广告,没有数据追踪
+      gifv: GIFV 与小视频
+      privacy: 细粒度,可按推设置隐私
+      public: 公共时间线
+    features_headline: Mastodon 与众不同之处
+    get_started: 立即开始
+    links: 链接
+    other_instances: 其它实例
+    source_code: 源码
+    status_count_after: statuses
+    status_count_before: Who authored
+    terms: 条款
+    user_count_after: users
+    user_count_before: Home to
+  accounts:
+    follow: 关注
+    followers: 粉丝
+    following: 关注
+    nothing_here: 神马都没有!
+    people_followed_by: 正关注
+    people_who_follow: 粉丝
+    posts: 推
+    remote_follow: Remote follow
+    unfollow: 取关
+  application_mailer:
+    settings: '更改邮件设置: %{link}'
+    signature: 来自 %{instance} 的提醒
+    view: 查看:
+  applications:
+    invalid_url: URL 无效
+  auth:
+    change_password: 更换密码
+    didnt_get_confirmation: 没有收到确认邮件?
+    forgot_password: 忘记密码?
+    login: 登录
+    logout: 登出
+    register: 注册
+    resend_confirmation: 重发确认邮件
+    reset_password: 重置密码
+    set_new_password: 设置新密码
+  authorize_follow:
+    error: Unfortunately, there was an error looking up the remote account
+    follow: 关注
+    prompt_html: 'You (<strong>%{self}</strong>) have requested to follow:'
+    title: 关注 %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: 大约 %{count} 小时
+      about_x_months: 大约 %{count} 月
+      about_x_years: 大约 %{count} 年
+      almost_x_years: 几乎 %{count} 年
+      half_a_minute: 刚刚
+      less_than_x_minutes: "%{count} 分"
+      less_than_x_seconds: 刚刚
+      over_x_years: 超过 %{count} 年
+      x_days: "%{count} 天"
+      x_minutes: "%{count} 分"
+      x_months: "%{count} 月"
+      x_seconds: "%{count} 秒"
+  exports:
+    blocks: You block
+    csv: CSV
+    follows: 关注
+    storage: 媒体文件
+  generic:
+    changes_saved_msg: 保存成功!
+    powered_by: 基于 %{link} 构建
+    save_changes: 保存
+    validation_errors:
+      one: 出错了!什么鬼?
+      other: 出错了!什么鬼?
+  landing_strip_html: <strong>%{name}</strong> is a user on <strong>%{domain}</strong>. You can follow them or interact with them if you have an account anywhere in the fediverse. If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
+  notification_mailer:
+    digest:
+      body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:'
+      mention: "%{name} mentioned you in:"
+      new_followers_summary:
+        one: 有人关注你了!耶!
+        other: 有 %{count} 个人关注了你!别鸡动!
+      subject:
+        one: "你有一个新提醒 \U0001F418"
+        other: "%{count} 个提醒太多,赶快去看看 \U0001F418"
+    favourite:
+      body: "%{name} 赞你"
+      subject: "%{name} 对你点赞"
+    follow:
+      body: "%{name} 关注了你"
+      subject: "%{name} 关注了你"
+    follow_request:
+      body: "%{name} 要关注你"
+      subject: 'Pending follower: %{name}'
+    mention:
+      body: 'You were mentioned by %{name} in:'
+      subject: You were mentioned by %{name}
+    reblog:
+      body: 'Your status was boosted by %{name}:'
+      subject: "%{name} boosted your status"
+  pagination:
+    next: 下一页
+    prev: 上一页
+  remote_follow:
+    acct: Enter your username@domain you want to follow from
+    missing_resource: Could not find the required redirect URL for your account
+    proceed: Proceed to follow
+    prompt: 'You are going to follow:'
+  settings:
+    authorized_apps: 已授权 APP
+    back: 返回
+    edit_profile: 更改个人信息
+    export: 数据导出
+    preferences: 设置
+    settings: 设置
+    two_factor_auth: 两步验证
+  statuses:
+    open_in_web: 浏览器中打开
+    over_character_limit: 超出范围 %{max}
+    visibilities:
+      private: 仅向粉丝公开
+      public: 公开
+      unlisted: 公开但不显示在公共时间线中
+  stream_entries:
+    click_to_show: 显示
+    reblogged: 转发
+    sensitive_content: 敏感内容Sensitive content
+  time:
+    formats:
+      default: "%b %d, %Y, %H:%M"
+  two_factor_auth:
+    description_html: 启用<strong>两步验证</strong>后,登录时强制要求手机上生成的两步验证码
+    disable: 禁用
+    enable: 启用
+    instructions_html: "<strong>使用 Google Authenticator 或类似 APP 扫描二维码</strong>。现在起,APP 将会生成登陆时必须的两步验证码。"
+    plaintext_secret_html: 密钥: <samp>%{secret}</samp>
+    warning: 如果你现在没有 Google Authenticator 或类似授权 APP,你应该先「禁用」本功能,否则你将不能正常登陆。
+  users:
+    invalid_email: 无效的邮箱
+    invalid_otp_token: 无效的两步验证码
+  will_paginate:
+    page_gap: "&hellip;"
diff --git a/config/navigation.rb b/config/navigation.rb
index b2930f62f..c6b7b9767 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -9,13 +9,16 @@ SimpleNavigation::Configuration.run do |navigation|
       settings.item :preferences, safe_join([fa_icon('sliders fw'), t('settings.preferences')]), settings_preferences_url
       settings.item :password, safe_join([fa_icon('cog fw'), t('auth.change_password')]), edit_user_registration_url
       settings.item :two_factor_auth, safe_join([fa_icon('mobile fw'), t('settings.two_factor_auth')]), settings_two_factor_auth_url
-      # settings.item :authorized_apps, safe_join([fa_icon('list fw'), 'Authorized Apps']), oauth_authorized_applications_url
+      settings.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url
+      settings.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url
+      settings.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url
     end
 
-    primary.item :admin, safe_join([fa_icon('cogs fw'), 'Administration']), admin_accounts_url, if: proc { current_user.admin? } do |admin|
+    primary.item :admin, safe_join([fa_icon('cogs fw'), 'Administration']), admin_reports_url, if: proc { current_user.admin? } do |admin|
+      admin.item :reports, safe_join([fa_icon('flag fw'), 'Reports']), admin_reports_url, highlights_on: %r{/admin/reports}
       admin.item :accounts, safe_join([fa_icon('users fw'), 'Accounts']), admin_accounts_url, highlights_on: %r{/admin/accounts}
       admin.item :pubsubhubbubs, safe_join([fa_icon('paper-plane-o fw'), 'PubSubHubbub']), admin_pubsubhubbub_index_url
-      admin.item :domain_blocks, safe_join([fa_icon('lock fw'), 'Domain Blocks']), admin_domain_blocks_url
+      admin.item :domain_blocks, safe_join([fa_icon('lock fw'), 'Domain Blocks']), admin_domain_blocks_url, highlights_on: %r{/admin/domain_blocks}
       admin.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url
       admin.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url
       admin.item :settings, safe_join([fa_icon('cogs fw'), 'Site Settings']), admin_settings_url
diff --git a/config/routes.rb b/config/routes.rb
index e17d54995..ca77191f7 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -4,7 +4,6 @@ require 'sidekiq/web'
 
 Rails.application.routes.draw do
   mount LetterOpenerWeb::Engine, at: 'letter_opener' if Rails.env.development?
-  mount ActionCable.server, at: 'cable'
 
   authenticate :user, lambda { |u| u.admin? } do
     mount Sidekiq::Web, at: 'sidekiq', as: :sidekiq
@@ -25,6 +24,8 @@ Rails.application.routes.draw do
     confirmations:      'auth/confirmations',
   }
 
+  get '/users/:username', to: redirect('/@%{username}'), constraints: { format: :html }
+
   resources :accounts, path: 'users', only: [:show], param: :username do
     resources :stream_entries, path: 'updates', only: [:show] do
       member do
@@ -44,9 +45,20 @@ Rails.application.routes.draw do
     end
   end
 
+  get '/@:username', to: 'accounts#show', as: :short_account
+  get '/@:account_username/:id', to: 'statuses#show', as: :short_account_status
+
   namespace :settings do
     resource :profile, only: [:show, :update]
     resource :preferences, only: [:show, :update]
+    resource :import, only: [:show, :create]
+
+    resource :export, only: [:show] do
+      collection do
+        get :follows, to: 'exports#download_following_list'
+        get :blocks, to: 'exports#download_blocking_list'
+      end
+    end
 
     resource :two_factor_auth, only: [:show] do
       member do
@@ -65,12 +77,24 @@ Rails.application.routes.draw do
 
   namespace :admin do
     resources :pubsubhubbub, only: [:index]
-    resources :domain_blocks, only: [:index, :create]
+    resources :domain_blocks, only: [:index, :new, :create]
     resources :settings, only: [:index, :update]
 
-    resources :accounts, only: [:index, :show, :update] do
+    resources :reports, only: [:index, :show] do
+      member do
+        post :resolve
+        post :silence
+        post :suspend
+        post :remove
+      end
+    end
+
+    resources :accounts, only: [:index, :show] do
       member do
+        post :silence
+        post :unsilence
         post :suspend
+        post :unsuspend
       end
     end
   end
@@ -111,11 +135,17 @@ Rails.application.routes.draw do
       get '/timelines/public',   to: 'timelines#public', as: :public_timeline
       get '/timelines/tag/:id',  to: 'timelines#tag', as: :hashtag_timeline
 
+      get '/search', to: 'search#index', as: :search
+
       resources :follows,    only: [:create]
       resources :media,      only: [:create]
       resources :apps,       only: [:create]
       resources :blocks,     only: [:index]
+      resources :mutes,      only: [:index]
       resources :favourites, only: [:index]
+      resources :reports,    only: [:index, :create]
+
+      resource :instance, only: [:show]
 
       resources :follow_requests, only: [:index] do
         member do
@@ -146,6 +176,8 @@ Rails.application.routes.draw do
           post :unfollow
           post :block
           post :unblock
+          post :mute
+          post :unmute
         end
       end
     end
diff --git a/config/settings.yml b/config/settings.yml
index a78bd067d..ffcc1eaa7 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -1,18 +1,23 @@
 # config/app.yml for rails-settings-cached
 defaults: &defaults
+  site_title: 'Mastodon'
   site_description: ''
   site_extended_description: ''
   site_contact_username: ''
   site_contact_email: ''
+  open_registrations: true
+  closed_registrations_message: ''
   notification_emails:
     follow: false
     reblog: false
     favourite: false
     mention: false
     follow_request: true
+    digest: true
   interactions:
     must_be_follower: false
     must_be_following: false
+
 development:
   <<: *defaults