about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
authorDavid Yip <yipdw@member.fsf.org>2017-12-15 12:20:56 -0600
committerDavid Yip <yipdw@member.fsf.org>2017-12-15 12:20:56 -0600
commit82b2e224a26765caf743b24844912faa2de9873a (patch)
tree1ee49dd3dbcef7867ad93f875262951612815851 /config
parent6abb0950c6f694607cdc6a0c564751400d52ad5a (diff)
parente0a573a2cef924fdfec2cd7ec96a712fe2de1511 (diff)
Merge branch 'gs-master' into prevent-local-only-federation
 Conflicts:
	db/schema.rb
Diffstat (limited to 'config')
-rw-r--r--config/application.rb1
-rw-r--r--config/initializers/locale.rb6
-rw-r--r--config/initializers/ostatus.rb9
-rw-r--r--config/initializers/paperclip.rb47
-rw-r--r--config/initializers/rack_attack.rb57
-rw-r--r--config/locales/activerecord.ar.yml13
-rw-r--r--config/locales/ar.yml91
-rw-r--r--config/locales/ca.yml6
-rw-r--r--config/locales/de.yml31
-rw-r--r--config/locales/devise.ar.yml3
-rw-r--r--config/locales/devise.fr.yml2
-rw-r--r--config/locales/devise.ja.yml14
-rw-r--r--config/locales/devise.no.yml6
-rw-r--r--config/locales/devise.pt.yml2
-rw-r--r--config/locales/doorkeeper.ar.yml10
-rw-r--r--config/locales/doorkeeper.gl.yml33
-rw-r--r--config/locales/doorkeeper.ja.yml16
-rw-r--r--config/locales/doorkeeper.nl.yml4
-rw-r--r--config/locales/doorkeeper.no.yml8
-rw-r--r--config/locales/doorkeeper.oc.yml6
-rw-r--r--config/locales/doorkeeper.zh-CN.yml2
-rw-r--r--config/locales/en.yml16
-rw-r--r--config/locales/es.yml2
-rw-r--r--config/locales/fr.yml27
-rw-r--r--config/locales/ja.yml77
-rw-r--r--config/locales/nl.yml125
-rw-r--r--config/locales/no.yml36
-rw-r--r--config/locales/oc.yml67
-rw-r--r--config/locales/pl.yml7
-rw-r--r--config/locales/pt-BR.yml81
-rw-r--r--config/locales/simple_form.ar.yml9
-rw-r--r--config/locales/simple_form.en.yml3
-rw-r--r--config/locales/simple_form.gl.yml75
-rw-r--r--config/locales/simple_form.ja.yml11
-rw-r--r--config/locales/simple_form.nl.yml24
-rw-r--r--config/locales/simple_form.oc.yml6
-rw-r--r--config/locales/simple_form.zh-CN.yml18
-rw-r--r--config/locales/zh-CN.yml100
-rw-r--r--config/navigation.rb6
-rw-r--r--config/routes.rb5
-rw-r--r--config/settings.yml1
-rw-r--r--config/webpack/configuration.js7
-rw-r--r--config/webpack/generateLocalePacks.js108
-rw-r--r--config/webpack/shared.js11
44 files changed, 838 insertions, 351 deletions
diff --git a/config/application.rb b/config/application.rb
index b54ea1c40..26df20513 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -40,6 +40,7 @@ module Mastodon
       :fa,
       :fi,
       :fr,
+      :gl,
       :he,
       :hr,
       :hu,
diff --git a/config/initializers/locale.rb b/config/initializers/locale.rb
new file mode 100644
index 000000000..04ed31646
--- /dev/null
+++ b/config/initializers/locale.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'flavours', '*', 'names.{rb,yml}').to_s]
+I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'flavours', '*', 'names', '*.{rb,yml}').to_s]
+I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'skins', '*', '*', 'names.{rb,yml}').to_s]
+I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'skins', '*', '*', 'names', '*.{rb,yml}').to_s]
diff --git a/config/initializers/ostatus.rb b/config/initializers/ostatus.rb
index ba96fda22..bb8591f74 100644
--- a/config/initializers/ostatus.rb
+++ b/config/initializers/ostatus.rb
@@ -17,9 +17,12 @@ Rails.application.configure do
   config.x.alternate_domains = alternate_domains.split(/\s*,\s*/)
 
   config.action_mailer.default_url_options = { host: web_host, protocol: https ? 'https://' : 'http://', trailing_slash: false }
-  config.x.streaming_api_base_url          = 'ws://localhost:4000'
 
-  if Rails.env.production?
-    config.x.streaming_api_base_url = ENV.fetch('STREAMING_API_BASE_URL') { "ws#{https ? 's' : ''}://#{web_host}" }
+  config.x.streaming_api_base_url = ENV.fetch('STREAMING_API_BASE_URL') do
+    if Rails.env.production?
+      "ws#{https ? 's' : ''}://#{web_host}"
+    else
+      "ws://#{ENV['REMOTE_DEV'] == 'true' ? host.split(':').first : 'localhost'}:4000"
+    end
   end
 end
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index 14bd034e6..8aa1d1b6e 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -14,40 +14,45 @@ Paperclip::Attachment.default_options.merge!(
 )
 
 if ENV['S3_ENABLED'] == 'true'
-  require 'fog/aws'
+  require 'aws-sdk'
+  Aws.eager_autoload!(services: %w(S3))
 
-  s3_protocol           = ENV.fetch('S3_PROTOCOL') { 'https' }
-  s3_hostname           = ENV.fetch('S3_HOSTNAME') { "s3-#{ENV['S3_REGION']}.amazonaws.com" }
-  aws_signature_version = ENV['S3_SIGNATURE_VERSION'] == 's3' ? 2 : ENV['S3_SIGNATURE_VERSION'].to_i
-  aws_signature_version = 4 if aws_signature_version.zero?
+  s3_region   = ENV.fetch('S3_REGION')   { 'us-east-1' }
+  s3_protocol = ENV.fetch('S3_PROTOCOL') { 'https' }
+  s3_hostname = ENV.fetch('S3_HOSTNAME') { "s3-#{s3_region}.amazonaws.com" }
 
   Paperclip::Attachment.default_options.merge!(
-    fog_credentials: {
-      provider: 'AWS',
-      aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
-      aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
-      aws_signature_version: aws_signature_version,
-      region: ENV.fetch('S3_REGION') { 'us-east-1' },
-      scheme: s3_protocol,
-      host: s3_hostname
+    storage: :s3,
+    s3_protocol: s3_protocol,
+    s3_host_name: s3_hostname,
+    s3_headers: {
+      'Cache-Control' => 'max-age=315576000',
+    },
+    s3_permissions: ENV.fetch('S3_PERMISSION') { 'public-read' },
+    s3_region: s3_region,
+    s3_credentials: {
+      bucket: ENV['S3_BUCKET'],
+      access_key_id: ENV['AWS_ACCESS_KEY_ID'],
+      secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
     },
-    fog_directory: ENV['S3_BUCKET'],
-    fog_options: {
-      acl: ENV.fetch('S3_PERMISSION') { 'public-read' },
-      cache_control: 'max-age=315576000',
+    s3_options: {
+      signature_version: ENV.fetch('S3_SIGNATURE_VERSION') { 'v4' },
     }
   )
 
   if ENV.has_key?('S3_ENDPOINT')
-    Paperclip::Attachment.default_options[:fog_credentials].merge!(
+    Paperclip::Attachment.default_options[:s3_options].merge!(
       endpoint: ENV['S3_ENDPOINT'],
-      path_style: true
+      force_path_style: true
     )
-    Paperclip::Attachment.default_options[:fog_host] = "#{s3_protocol}://#{s3_hostname}/#{ENV['S3_BUCKET']}"
+    Paperclip::Attachment.default_options[:url] = ':s3_path_url'
   end
 
   if ENV.has_key?('S3_CLOUDFRONT_HOST')
-    Paperclip::Attachment.default_options[:fog_host] = "#{s3_protocol}://#{ENV['S3_CLOUDFRONT_HOST']}"
+    Paperclip::Attachment.default_options.merge!(
+      url: ':s3_alias_url',
+      s3_host_alias: ENV['S3_CLOUDFRONT_HOST']
+    )
   end
 elsif ENV['SWIFT_ENABLED'] == 'true'
   require 'fog/openstack'
diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index 53cb106ca..b38fb302b 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -1,6 +1,43 @@
 # frozen_string_literal: true
 
+require 'doorkeeper/grape/authorization_decorator'
+
 class Rack::Attack
+  class Request
+    def authenticated_token
+      return @token if defined?(@token)
+
+      @token = Doorkeeper::OAuth::Token.authenticate(
+        Doorkeeper::Grape::AuthorizationDecorator.new(self),
+        *Doorkeeper.configuration.access_token_methods
+      )
+    end
+
+    def authenticated_user_id
+      authenticated_token&.resource_owner_id
+    end
+
+    def unauthenticated?
+      !authenticated_user_id
+    end
+
+    def api_request?
+      path.start_with?('/api')
+    end
+
+    def web_request?
+      !api_request?
+    end
+  end
+
+  PROTECTED_PATHS = %w(
+    /auth/sign_in
+    /auth
+    /auth/password
+  ).freeze
+
+  PROTECTED_PATHS_REGEX = Regexp.union(PROTECTED_PATHS.map { |path| /\A#{Regexp.escape(path)}/ })
+
   # Always allow requests from localhost
   # (blocklist & throttles are skipped)
   Rack::Attack.safelist('allow from localhost') do |req|
@@ -8,24 +45,16 @@ class Rack::Attack
     '127.0.0.1' == req.ip || '::1' == req.ip
   end
 
-  # Rate limits for the API
-  throttle('api', limit: 300, period: 5.minutes) do |req|
-    req.ip if req.path =~ /\A\/api\/v/
-  end
-
-  # Rate limit logins
-  throttle('login', limit: 5, period: 5.minutes) do |req|
-    req.ip if req.path == '/auth/sign_in' && req.post?
+  throttle('throttle_authenticated_api', limit: 300, period: 5.minutes) do |req|
+    req.api_request? && req.authenticated_user_id
   end
 
-  # Rate limit sign-ups
-  throttle('register', limit: 5, period: 5.minutes) do |req|
-    req.ip if req.path == '/auth' && req.post?
+  throttle('throttle_unauthenticated_api', limit: 7_500, period: 5.minutes) do |req|
+    req.ip if req.api_request?
   end
 
-  # Rate limit forgotten passwords
-  throttle('reminder', limit: 5, period: 5.minutes) do |req|
-    req.ip if req.path == '/auth/password' && req.post?
+  throttle('protected_paths', limit: 5, period: 5.minutes) do |req|
+    req.ip if req.post? && req.path =~ PROTECTED_PATHS_REGEX
   end
 
   self.throttled_response = lambda do |env|
diff --git a/config/locales/activerecord.ar.yml b/config/locales/activerecord.ar.yml
new file mode 100644
index 000000000..d5d44aaa6
--- /dev/null
+++ b/config/locales/activerecord.ar.yml
@@ -0,0 +1,13 @@
+---
+ar:
+  activerecord:
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: فقط حروف و أرقام و تسطير سفلي
+        status:
+          attributes:
+            reblog:
+              taken: المنشور موجود
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index a96b353c1..6dc8bc1bb 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -57,7 +57,65 @@ ar:
       order:
         title: الترتيب
       profile_url: رابط الملف الشخصي
+      role: التصريحات
+      roles:
+        admin: مدير
+        user: مستخدِم
+      search: البحث
+      statuses: المنشورات
+      title: الحسابات
+      username: إسم المستخدم
+      web: الويب
+    custom_emojis:
+      copy: نسخ
+      delete: حذف
+      emoji: إيموجي
+      enable: تفعيل
+      upload: رفع
+    domain_blocks:
+      domain: النطاق
+      show:
+        undo: إلغاء
+      undo: إلغاء
+    email_domain_blocks:
+      delete: حذف
+      domain: النطاق
+      new:
+        create: إضافة نطاق
+    instances:
+      domain_name: النطاق
+      search: البحث
+    reports:
+      are_you_sure: هل أنت متأكد ؟
+      comment:
+        label: تعليق
+      delete: حذف
+      report_contents: المحتويات
+      reported_by: أبلغ عنه من طرف
+      status: الحالة
+      title: التقارير
+      view: عرض
+    settings:
+      contact_information:
+        email: البريد الإلكتروني المهني
+      registrations:
+        deletion:
+          desc_html: السماح لأي مستخدم إغلاق حسابه
+        open:
+          title: فتح التسجيل
+      site_terms:
+        title: شروط الخدمة المخصصة
+      site_title: إسم مثيل الخادم
+      title: إعدادات الموقع
+    statuses:
+      back_to_account: العودة إلى صفحة الحساب
+      batch:
+        delete: حذف
+      media:
+        title: الوسائط
+    title: الإدارة
   application_mailer:
+    salutation: "%{name},"
     settings: 'تغيير تفضيلات البريد الإلكتروني : %{link}'
     signature: إشعارات ماستدون من %{instance}
     view: 'View:'
@@ -65,10 +123,12 @@ ar:
     invalid_url: إن الرابط المقدم غير صالح
   auth:
     change_password: الهوية
+    delete_account: حذف حساب
     didnt_get_confirmation: لم تتلق تعليمات التأكيد ؟
     forgot_password: نسيت كلمة المرور ؟
     login: تسجيل الدخول
     logout: خروج
+    migrate_account: الإنتقال إلى حساب آخر
     register: إنشاء حساب
     resend_confirmation: إعادة إرسال تعليمات التأكيد
     reset_password: إعادة تعيين كلمة المرور
@@ -91,14 +151,21 @@ ar:
       x_minutes: "%{count}د"
       x_months: "%{count} شه"
       x_seconds: "%{count}ث"
+  deletes:
+    bad_password_msg: محاولة جيدة يا هاكرز ! كلمة السر خاطئة
+    proceed: حذف حساب
+    success_msg: تم حذف حسابك بنجاح
   exports:
     blocks: قمت بحظر
     csv: CSV
     follows: أنت تتبع
     storage: ذاكرة التخزين
+  followers:
+    domain: النطاق
+    followers_count: عدد المتابِعين
   generic:
     changes_saved_msg: تم حفظ التعديلات بنجاح !
-    powered_by: powered by %{link}
+    powered_by: مدعوم بـ %{link}
     save_changes: حفظ التغييرات
     validation_errors:
       one: Something isn't quite right yet! Please review the error below
@@ -112,14 +179,19 @@ ar:
     upload: تحميل
   landing_strip_html: "<strong>%{name}</strong> is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse.."
   landing_strip_signup_html: If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
+  lists:
+    errors:
+      limit: لقد بلغت الحد الأقصى للقوائم
   media_attachments:
     validations:
       images_and_video: ليس بالإمكان إرفاق فيديو في منشور يحتوي مسبقا على صور
       too_many: لا يمكن إرفاق أكثر من 4 ملفات
+  migrations:
+    acct: username@domain للحساب الجديد
   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:"
+      mention: "%{name} أشار إليك في :"
       new_followers_summary:
         one: لقد حصلت على متابع جديد !
         other: لقد تحصلت على %{count} متتبعين جدد ! رائع !
@@ -127,11 +199,11 @@ ar:
         one: "إشعار واحد منذ زيارتك الأخيرة \U0001F418"
         other: "%{count} إشعارات جديدة منذ زيارتك الأخيرة \U0001F418"
     favourite:
-      body: أُعجب %{name} بمنشورك
+      body: 'أُعجب %{name} بمنشورك :'
       subject: "%{name} favourited your status"
     follow:
       body: "%{name} من متتبعيك الآن !"
-      subject: "%{name} من متتبعيك الآن !"
+      subject: "%{name} من متتبعيك الآن"
     follow_request:
       body: "%{name} has requested to follow you"
       subject: 'Pending follower: %{name}'
@@ -155,16 +227,21 @@ ar:
   pagination:
     next: التالي
     prev: السابق
+  preferences:
+    languages: اللغات
+    other: إعدادات أخرى
+    publishing: النشر
   remote_follow:
-    acct: Enter your username@domain you want to follow from
+    acct: قم بإدخال عنوان حسابك username@domain الذي من خلاله تود المتابعة
     missing_resource: Could not find the required redirect URL for your account
-    proceed: Proceed to follow
+    proceed: أكمل المتابعة
     prompt: 'إنك  بصدد متابعة :'
   settings:
     authorized_apps: التطبيقات المرخص لها
     back: عودة إلى ماستدون
     edit_profile: تعديل الملف الشخصي
     export: تصدير البيانات
+    followers: المتابِعون المُرَخّصون
     import: إستيراد
     preferences: التفضيلات
     settings: الإعدادات
@@ -197,7 +274,7 @@ ar:
     recovery_codes: النسخ الإحتياطي لرموز الإسترجاع
     recovery_codes_regenerated: تم إعادة توليد رموز الإسترجاع الإحتياطية بنجاح
     setup: تنشيط
-    wrong_code: الرمز الذي أدخلته غير صالح. تحقق من صحة الوقت على الخادم و الجهاز.
+    wrong_code: الرمز الذي أدخلته غير صالح ! تحقق من صحة الوقت على الخادم و الجهاز ؟
   users:
     invalid_email: عنوان البريد الإلكتروني غير صالح
     invalid_otp_token: الرمز الثنائي غير صالح
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 357e39e31..11bc485da 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -286,7 +286,7 @@ ca:
         desc_html: Mostra una insígnia de personal en una pàgina d'usuari
         title: Mostra insígnia de personal
       site_description:
-        desc_html: Paràgraf introductori a la pàgina principal i en etiquetes meta.<br>Pots utilitzar etiquetes HTML, en particular <code>&lt;a&gt;</code> i <code>&lt;em&gt;</code>.
+        desc_html: Paràgraf introductori a la pàgina principal i en etiquetes meta. Pots utilitzar etiquetes HTML, en particular <code>&lt;a&gt;</code> i <code>&lt;em&gt;</code>.
         title: Descripció del lloc
       site_description_extended:
         desc_html: Un bon lloc per al codi de conducta, regles, directrius i altres coses que distingeixen la vostra instància. Pots utilitzar etiquetes HTML
@@ -410,7 +410,7 @@ ca:
     storage: Emmagatzematge
   followers:
     domain: Domini
-    explanation_html: Si desitges garantir la privacitat de les teves publicacions, has de ser conscient de qui t'està seguint. <strong> Les publicacions privades es lliuren a totes les instàncies on tens seguidors </ strong>. És possible que vulguis revisar-los i eliminar seguidors si no confies en que la teva privacitat sigui respectada pel personal o el programari d'aquestes instàncies.
+    explanation_html: Si desitges garantir la privacitat de les teves publicacions, has de ser conscient de qui t'està seguint. <strong> Les publicacions privades es lliuren a totes les instàncies on tens seguidors </strong>. És possible que vulguis revisar-los i eliminar seguidors si no confies en que la teva privacitat sigui respectada pel personal o el programari d'aquestes instàncies.
     followers_count: Nombre de seguidors
     lock_link: Bloca el teu compte
     purge: Elimina dels seguidors
@@ -678,8 +678,6 @@ ca:
 
       <p>Originalment adaptat a la <a href="https://github.com/discourse/discourse">política de privadesa del Discurs</a>.</p>
     title: "%{instance} Condicions del servei i política de privadesa"
-  themes:
-    default: Mastodont
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 470395767..39867e373 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -49,7 +49,7 @@ de:
     reserved_username: Dieser Profilname ist belegt
     roles:
       admin: Admin
-      moderator: Mod
+      moderator: Moderator
     unfollow: Entfolgen
   admin:
     account_moderation_notes:
@@ -174,6 +174,7 @@ de:
       shortcode: Shortcode
       shortcode_hint: Mindestens 2 Zeichen, nur Buchstaben, Ziffern und Unterstriche
       title: Eigene Emojis
+      updated_msg: Emoji erfolgreich aktualisiert!
       upload: Hochladen
     domain_blocks:
       add_new: Neu hinzufügen
@@ -223,6 +224,13 @@ de:
       reset: Zurücksetzen
       search: Suchen
       title: Bekannte Instanzen
+    invites:
+      filter:
+        all: Alle
+        available: Verfügbar
+        expired: Ausgelaufen
+        title: Filter
+      title: Einladungen
     reports:
       action_taken_by: Maßnahme ergriffen durch
       are_you_sure: Bist du dir sicher?
@@ -261,6 +269,8 @@ de:
         deletion:
           desc_html: Allen erlauben, ihr Konto eigenmächtig zu löschen
           title: Kontolöschung erlauben
+        min_invite_role:
+          disabled: Niemand
         open:
           desc_html: Allen erlauben, ein Konto zu erstellen
           title: Registrierung öffnen
@@ -412,12 +422,31 @@ de:
       following: Folgeliste
       muting: Stummschaltungsliste
     upload: Hochladen
+  invites:
+    delete: Deaktivieren
+    expires_in:
+      '1800': 30 Minuten
+      '21600': 6 Stunden
+      '3600': 1 Stunde
+      '43200': 12 Stunden
+      '86400': 1 Tag
+    expires_in_prompt: Nie
+    generate: Generieren
+    max_uses:
+      one: 1 mal verwendet
+      other: "%{count} mal verwendet"
+    max_uses_prompt: Kein Limit
   landing_strip_html: "<strong>%{name}</strong> hat ein Profil auf %{link_to_root_path}. Du kannst folgen oder interagieren, sofern du ein Konto irgendwo im Fediversum hast."
   landing_strip_signup_html: Wenn nicht, kannst du dich <a href="%{sign_up_path}">hier anmelden</a>.
   media_attachments:
     validations:
       images_and_video: Es kann kein Video an einen Beitrag, der bereits Bilder enthält, angehängt werden
       too_many: Es können nicht mehr als 4 Bilder angehängt werden
+  migrations:
+    acct: benutzername@domain des neuen Accounts
+    proceed: Speichern
+  moderation:
+    title: Moderation
   notification_mailer:
     digest:
       body: 'Hier ist eine kurze Zusammenfasung dessen, was du auf %{instance} seit deinem letzten Besuch am %{since} verpasst hast:'
diff --git a/config/locales/devise.ar.yml b/config/locales/devise.ar.yml
index 4fd19244d..bb91cb372 100644
--- a/config/locales/devise.ar.yml
+++ b/config/locales/devise.ar.yml
@@ -8,8 +8,11 @@ ar:
       inactive: لم يتم تنشيط حسابك بعد.
       last_attempt: بإمكانك إعادة المحاولة مرة واحدة قبل أن يتم قفل حسابك.
       locked: إن حسابك مقفل.
+      unauthenticated: يجب عليك تسجيل الدخول أو إنشاء حساب قبل المواصلة.
       unconfirmed: يجب عليك تأكيد عنوان بريدك الإلكتروني قبل المواصلة.
     mailer:
+      confirmation_instructions:
+        subject: 'ماستدون : تعليمات التأكيد لمثيل الخادوم  %{instance}'
       password_change:
         subject: 'ماستدون : تم تغيير كلمة المرور'
       reset_password_instructions:
diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml
index cb4d5d5f6..a9817044d 100644
--- a/config/locales/devise.fr.yml
+++ b/config/locales/devise.fr.yml
@@ -19,7 +19,7 @@ fr:
       confirmation_instructions:
         subject: Merci de confirmer votre inscription sur %{instance}
       password_change:
-        subject: Votre mot de passe a été modifié avec succés.
+        subject: Votre mot de passe a été modifié avec succès.
       reset_password_instructions:
         subject: Instructions pour changer votre mot de passe
       unlock_instructions:
diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml
index aa333920e..1a46b80b5 100644
--- a/config/locales/devise.ja.yml
+++ b/config/locales/devise.ja.yml
@@ -35,7 +35,7 @@ ja:
       updated_not_active: パスワードは正常に更新されました。
     registrations:
       destroyed: アカウントの作成はキャンセルされました。またのご利用をお待ちしています。
-      signed_up: アカウントの作成が完了しました。Mastodonへようこそ!
+      signed_up: アカウントの作成が完了しました。Mastodonへようこそ。
       signed_up_but_inactive: アカウントの作成が完了しました。しかし、アカウントが有効化されていないためログインできませんでした。
       signed_up_but_locked: アカウントの作成が完了しました。しかし、アカウントがロックされているためログインできませんでした。
       signed_up_but_unconfirmed: メールアドレスの確認用のリンクが入力したメールアドレスに送信されました。メール内のリンクをクリックしてアカウントを有効化してください。
@@ -51,11 +51,11 @@ ja:
       unlocked: アカウントロックは正常に解除されました。続行するにはログインしてください。
   errors:
     messages:
-      already_confirmed: は確認されました。ログインを試してください。
-      confirmation_period_expired: "%{period}以内に確認が必要です。再度試してください。"
-      expired: は期限切れです。再度試してください。
-      not_found: 見つかりません。
-      not_locked: ロックされていません。
+      already_confirmed: は確認されました。ログインを試してください
+      confirmation_period_expired: "%{period}以内に確認が必要です。再度試してください"
+      expired: は期限切れです。再度試してください
+      not_found: 見つかりません
+      not_locked: ロックされていません
       not_saved:
         one: エラーが発生したため、%{resource}の保存に失敗しました。
-        other: "%{count}個のエラーが発生したため、保存に失敗しました。 %{resource}"
+        other: "%{count}個のエラーが発生したため、%{resource}の保存に失敗しました:"
diff --git a/config/locales/devise.no.yml b/config/locales/devise.no.yml
index 1bb14d265..5d3e71495 100644
--- a/config/locales/devise.no.yml
+++ b/config/locales/devise.no.yml
@@ -34,7 +34,7 @@
       updated: Passordet ditt er endret. Du er nå logget inn.
       updated_not_active: Passordet ditt er endret.
     registrations:
-      destroyed: Adjø! Kontoen din er slettet. På gjensyn!
+      destroyed: Adjø! Kontoen din er slettet. På gjensyn.
       signed_up: Velkommen! Registreringen var vellykket.
       signed_up_but_inactive: Registreringen var vellykket. Vi kunne dessverre ikke logge deg inn fordi kontoen din ennå ikke har blitt aktivert.
       signed_up_but_locked: Registreringen var vellykket. Vi kunne dessverre ikke logge deg inn fordi kontoen din har blitt låst.
@@ -51,8 +51,8 @@
       unlocked: Kontoen din ble åpnet uten problemer. Logg på for å fortsette.
   errors:
     messages:
-      already_confirmed: har allerede blitt bekreftet, prøv å logge på istedet.
-      confirmation_period_expired: må bekreftes innen %{period}. Spør om en ny e-mail for bekreftelse istedet.
+      already_confirmed: har allerede blitt bekreftet, prøv å logge på istedet
+      confirmation_period_expired: må bekreftes innen %{period}. Spør om en ny e-post for bekreftelse istedet
       expired: har utløpt, spør om en ny en istedet
       not_found: ikke funnet
       not_locked: var ikke låst
diff --git a/config/locales/devise.pt.yml b/config/locales/devise.pt.yml
index dc87cefdd..a09443a9a 100644
--- a/config/locales/devise.pt.yml
+++ b/config/locales/devise.pt.yml
@@ -10,7 +10,7 @@ pt:
       inactive: A tua conta ainda não está ativada.
       invalid: "%{authentication_keys} ou palavra-passe não válida."
       last_attempt: Tens mais uma tentativa antes de a tua conta ficar bloqueada.
-      locked: A tua conta está bloqueada
+      locked: A tua conta está bloqueada.
       not_found_in_database: "%{authentication_keys} ou palavra-passe não válida."
       timeout: A tua sessão expirou. Por favor, entra de novo para continuares.
       unauthenticated: Precisas de entrar na tua conta ou registares-te antes de continuar.
diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml
index 1925d5a65..107677837 100644
--- a/config/locales/doorkeeper.ar.yml
+++ b/config/locales/doorkeeper.ar.yml
@@ -5,6 +5,8 @@ ar:
       doorkeeper/application:
         name: التسمية
         redirect_uri: Redirect URI
+        scopes: المجالات
+        website: تطبيق الويب
     errors:
       models:
         doorkeeper/application:
@@ -33,9 +35,13 @@ ar:
         redirect_uri: إستخدم خطا واحدا لكل رابط
         scopes: Separate scopes with spaces. Leave blank to use the default scopes.
       index:
+        application: تطبيق
         callback_url: رابط رد النداء
+        delete: حذف
         name: التسمية
         new: تطبيق جديد
+        scopes: المجالات
+        show: عرض
         title: تطبيقاتك
       new:
         title: تطبيق جديد
@@ -43,7 +49,7 @@ ar:
         actions: Actions
         application_id: معرف التطبيق
         callback_urls: روابط رد النداء
-        scopes: Scopes
+        scopes: المجالات
         secret: السر
         title: 'تطبيق : %{name}'
     authorizations:
@@ -67,7 +73,7 @@ ar:
         application: التطبيق
         created_at: صُرّح له في
         date_format: "%d-%m-%Y %H:%M:%S"
-        scopes: Scopes
+        scopes: المجالات
         title: تطبيقاتك المرخص لها
     errors:
       messages:
diff --git a/config/locales/doorkeeper.gl.yml b/config/locales/doorkeeper.gl.yml
new file mode 100644
index 000000000..863438454
--- /dev/null
+++ b/config/locales/doorkeeper.gl.yml
@@ -0,0 +1,33 @@
+gl:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Nome do aplicativo
+        redirect_uri: URI a redireccionar
+        website: Sitio web do aplicativo
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: non pode conter un fragmento.
+              invalid_uri: debe ser un URI válido.
+              relative_uri: debe ser un URI absoluto.
+              secured_uri: debe ser un URI HTTPS/SSL.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Autorizar
+        cancel: Cancelar
+        destroy: Destruír
+        edit: Editar
+        submit: Enviar
+      confirmations:
+        destroy: Está segura?
+      edit:
+        title: Editar aplicativo
+      form:
+        error: Eeeeepa! Comprobe os posibles erros no formulario
+      help:
+        native_redirect_uri: Utilice %{native_redirect_uri} para probas locais
+        redirect_uri: Utilice unha liña por URI
diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml
index 1f145eaa3..96956c60f 100644
--- a/config/locales/doorkeeper.ja.yml
+++ b/config/locales/doorkeeper.ja.yml
@@ -29,10 +29,10 @@ ja:
       edit:
         title: アプリの編集
       form:
-        error: フォームにエラーが無いか確認してください。
+        error: フォームにエラーが無いか確認してください
       help:
         native_redirect_uri: ローカルテストに %{native_redirect_uri} を使用
-        redirect_uri: 一行に一つのURLを入力してください。
+        redirect_uri: 一行に一つのURLを入力してください
         scopes: アクセス権は半角スペースで区切ることができます。 空白のままにするとデフォルトを使用します。
       index:
         application: アプリ
@@ -57,11 +57,11 @@ ja:
         authorize: 承認
         deny: 拒否
       error:
-        title: エラーが発生しました。
+        title: エラーが発生しました
       new:
         able_to: このアプリは以下のことができます
-        prompt: アプリ %{client_name} があなたのアカウントへのアクセスを要求しています。
-        title: 認証が必要です。
+        prompt: アプリ %{client_name} があなたのアカウントへのアクセスを要求しています
+        title: 認証が必要です
       show:
         title: 認証コードをコピーしてアプリに貼り付けて下さい。
     authorized_applications:
@@ -83,12 +83,12 @@ ja:
         invalid_grant: 指定された認証許可は無効であるか、期限切れ、取り消されている、リダイレクトURIの不一致、または別のクライアントに発行されています。
         invalid_redirect_uri: 無効なリダイレクトURIが含まれています。
         invalid_request: リクエストに必要なパラメータが欠けているか、サポートされていないパラメータが含まれている、または不正なフォーマットです。
-        invalid_resource_owner: 指定されたリソース所有者のクレデンシャルが無効であるか、リソース所有者が見つかりません。
+        invalid_resource_owner: 指定されたリソース所有者のクレデンシャルが無効であるか、リソース所有者が見つかりません
         invalid_scope: 要求されたアクセス権は無効であるか、不明、または不正なフォーマットです。
         invalid_token:
           expired: アクセストークンの有効期限が切れています
-          revoked: アクセストークンは取り消されています。
-          unknown: アクセストークンが無効です。
+          revoked: アクセストークンは取り消されています
+          unknown: アクセストークンが無効です
         resource_owner_authenticator_not_configured: Doorkeeper.configure.resource_owner_authenticator が設定されていないため、リソース所有者の検索に失敗しました。
         server_error: 認証サーバーに予期せぬ例外が発生したため、リクエストを実行できなくなりました。
         temporarily_unavailable: 現在、認証サーバーに一時的な過負荷が掛かっているか、またはメンテナンス中のため、リクエストを処理できません。
diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml
index 3dd0a7d26..5c9c9047f 100644
--- a/config/locales/doorkeeper.nl.yml
+++ b/config/locales/doorkeeper.nl.yml
@@ -60,10 +60,10 @@ nl:
         title: Er is een fout opgetreden
       new:
         able_to: Deze toepassing zal in staat zijn om
-        prompt: "%{client_name} autoriseren om je account te gebruiken"
+        prompt: "%{client_name} autoriseren om jouw account te gebruiken"
         title: Autorisatie vereist
       show:
-        title: Kopieer deze autorisatiecode en plak het in de applicatie.
+        title: Kopieer deze autorisatiecode en plak het in de toepassing.
     authorized_applications:
       buttons:
         revoke: Intrekken
diff --git a/config/locales/doorkeeper.no.yml b/config/locales/doorkeeper.no.yml
index ba061e0ca..5b4dc9d6c 100644
--- a/config/locales/doorkeeper.no.yml
+++ b/config/locales/doorkeeper.no.yml
@@ -5,6 +5,7 @@
       doorkeeper/application:
         name: Navn
         redirect_uri: Omdirigerings-URI
+        website: Applikasjonsnettside
     errors:
       models:
         doorkeeper/application:
@@ -33,9 +34,12 @@
         redirect_uri: Bruk én linje per URI
         scopes: Adskill omfang med mellomrom. La det være blankt for å bruke standard omfang.
       index:
+        application: Applikasjon
         callback_url: Callback-URL
+        delete: Fjern
         name: Navn
         new: Ny applikasjon
+        show: Vis
         title: Dine applikasjoner
       new:
         title: Nye applikasjoner
@@ -57,7 +61,7 @@
         prompt: Applikasjon %{client_name} spør om tilgang til din konto
         title: Autorisasjon påkrevd
       show:
-        title: Copy this authorization code and paste it to the application.
+        title: Kopier denne koden og lim den inn i programmet.
     authorized_applications:
       buttons:
         revoke: Opphev
@@ -77,7 +81,7 @@
         invalid_grant: Autoriseringen er ugyldig, utløpt, opphevet, stemmer ikke overens med omdirigerings-URIen eller var utstedt til en annen klient.
         invalid_redirect_uri: Den inkluderte omdirigerings-URLen er ikke gyldig.
         invalid_request: Forespørslen mangler en eller flere parametere, inkluderte en parameter som ikke støttes eller har feil struktur.
-        invalid_resource_owner: Ressurseierens detaljer er ikke gyldige, eller så kan ikke eieren finnes.
+        invalid_resource_owner: Ressurseierens detaljer er ikke gyldige, eller så er det ikke mulig å finne eieren
         invalid_scope: Det etterspurte omfanget er ugyldig, ukjent eller har feil struktur.
         invalid_token:
           expired: Tilgangsbeviset har utløpt
diff --git a/config/locales/doorkeeper.oc.yml b/config/locales/doorkeeper.oc.yml
index 1ec1b69e8..d83d07438 100644
--- a/config/locales/doorkeeper.oc.yml
+++ b/config/locales/doorkeeper.oc.yml
@@ -60,7 +60,7 @@ oc:
         title: I a agut un error
       new:
         able_to: Aquesta aplicacion poirà
-        prompt: L’aplicacion %{client_name} demanda l’accès al vòstre compte.
+        prompt: L’aplicacion %{client_name} demanda l’accès al vòstre compte
         title: Cal l’autorizacion
       show:
         title: Copiatz lo còdi d’autorizacion e pegatz-lo dins l’aplicacion.
@@ -83,8 +83,8 @@ oc:
         invalid_grant: L’acòrdi d’autorizacion donadat es pas valid, expirat, revocat, una redireccion URI utilizat en la demanda d’autorizacion no correspond, o a estat desliurat a un altre client.
         invalid_redirect_uri: L’URL de redireccion es pas valida.
         invalid_request: La demanda a un paramètre que li manca, a una valor qu’es pas suportada, o quicòm mal format.
-        invalid_resource_owner: La qualificacion del proprietari de la ressorça donada es pas valid, o lo proprietari de la ressorça se pòt pas trobar.
-        invalid_scope: L’encastre demandat es pas valid, o mal format.
+        invalid_resource_owner: La qualificacion del proprietari de la ressorça donada es pas valida, o lo proprietari de la ressorça es pas trobable
+        invalid_scope: L’encastre demandat es pas valid, o d’un marrit format.
         invalid_token:
           expired: Lo geton d’accès a expirat
           revoked: Lo geton d’accès a estat revocat
diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml
index 0eb5a0ab6..90c484369 100644
--- a/config/locales/doorkeeper.zh-CN.yml
+++ b/config/locales/doorkeeper.zh-CN.yml
@@ -114,6 +114,6 @@ zh-CN:
       application:
         title: 需要 OAuth 认证
     scopes:
-      follow: 关注(或取消关注)、屏蔽(或取消屏蔽)用户
+      follow: 关注或屏蔽用户
       read: 读取你的帐户数据
       write: 为你发表嘟文
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 0ca320e1a..b283f94f0 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -116,6 +116,7 @@ en:
       roles:
         admin: Administrator
         moderator: Moderator
+        staff: Staff
         user: User
       salmon_url: Salmon URL
       search: Search
@@ -160,6 +161,7 @@ en:
         update_status: "%{name} updated status by %{target}"
       title: Audit log
     custom_emojis:
+      by_domain: Domain
       copied_msg: Successfully created local copy of the emoji
       copy: Copy
       copy_failed_msg: Could not make a local copy of that emoji
@@ -343,7 +345,7 @@ en:
     warning: Be very careful with this data. Never share it with anyone!
     your_token: Your access token
   auth:
-    agreement_html: By signing up you agree to <a href="%{rules_path}">our terms of service</a> and <a href="%{terms_path}">privacy policy</a>.
+    agreement_html: By signing up you agree to follow <a href="%{rules_path}">the rules of the instance</a> and <a href="%{terms_path}">our terms of service</a>.
     change_password: Security
     delete_account: Delete account
     delete_account_html: If you wish to delete your account, you can <a href="%{path}">proceed here</a>. You will be asked for confirmation.
@@ -424,6 +426,7 @@ en:
     changes_saved_msg: Changes successfully saved!
     powered_by: powered by %{link}
     save_changes: Save changes
+    use_this: Use this
     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
@@ -466,6 +469,9 @@ en:
     remove_all: Remove all
   landing_strip_html: "<strong>%{name}</strong> is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse."
   landing_strip_signup_html: If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
+  lists:
+    errors:
+      limit: You have reached the maximum amount of lists
   media_attachments:
     validations:
       images_and_video: Cannot attach a video to a status that already contains images
@@ -587,6 +593,7 @@ en:
     development: Development
     edit_profile: Edit profile
     export: Data export
+    flavours: Flavours
     followers: Authorized followers
     import: Import
     keyword_mutes: Muted keywords
@@ -594,17 +601,18 @@ en:
     notifications: Notifications
     preferences: Preferences
     settings: Settings
-    two_factor_authentication: Two-factor Authentication
+    two_factor_authentication: Two-factor Auth
     your_apps: Your applications
   statuses:
     open_in_web: Open in web
     over_character_limit: character limit of %{max} exceeded
     pin_errors:
-      limit: Too many toots pinned
+      limit: You have already pinned the maximum number of toots
       ownership: Someone else's toot cannot be pinned
       private: Non-public toot cannot be pinned
       reblog: A boost cannot be pinned
     show_more: Show more
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: Followers-only
       private_long: Only show to followers
@@ -687,8 +695,6 @@ en:
 
       <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
     title: "%{instance} Terms of Service and Privacy Policy"
-  themes:
-    default: Mastodon
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 18b93b08e..d9084787d 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -678,8 +678,6 @@ es:
 
       <p>Adaptado originalmente del <a href="https://github.com/discourse/discourse">discurso de las políticas de privacidad</a>.</p>
     title: Términos del Servicio y Políticas de Privacidad de %{instance}
-  themes:
-    default: Mastodon
   time:
     formats:
       default: "%d de %b del %Y, %H:%M"
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index cd97f5967..adcb11f18 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -116,6 +116,7 @@ fr:
       roles:
         admin: Administrateur
         moderator: Modérateur
+        staff: Personnel
         user: Utilisateur
       salmon_url: URL Salmon
       search: Rechercher
@@ -135,12 +136,13 @@ fr:
       web: Web
     action_logs:
       actions:
-        confirm_user: "%{name} adresse e-mail confirmée de l'utilisateur %{target}"
+        confirm_user: "%{name} adresse courriel confirmée de l'utilisateur %{target}"
         create_custom_emoji: "%{name} a importé de nouveaux emoji %{target}"
         create_domain_block: "%{name} a bloqué le domaine %{target}"
-        create_email_domain_block: "%{name} a blacklisté le domaine de l'e-mail %{target}"
+        create_email_domain_block: "%{name} a mis le domaine du courriel %{target} sur liste noire"
+        demote_user: "%{name} a rétrogradé l'utilisateur %{target}"
         destroy_domain_block: "%{name} a débloqué le domaine %{target}"
-        destroy_email_domain_block: "%{name} a mis le domaine de l'e-mail %{target} sur liste blanche"
+        destroy_email_domain_block: "%{name} a mis le domaine du courriel %{target} sur liste blanche"
         destroy_status: "%{name} a enlevé le statut de %{target}"
         disable_2fa_user: "%{name} a désactivé l'authentification à deux facteurs pour l'utilisateur %{target}"
         disable_custom_emoji: "%{name} a désactivé l'emoji %{target}"
@@ -159,6 +161,7 @@ fr:
         update_status: "%{name} a mis à jour le statut de %{target}"
       title: Journal d'audit
     custom_emojis:
+      by_domain: Domaine
       copied_msg: Copie locale de l’émoji créée avec succès !
       copy: Copier
       copy_failed_msg: Impossible de faire une copie locale de cet émoji
@@ -191,7 +194,7 @@ fr:
         create: Créer le blocage
         hint: Le blocage de domaine n’empêchera pas la création de comptes dans la base de données, mais il appliquera automatiquement et rétrospectivement des méthodes de modération spécifiques sur ces comptes.
         severity:
-          desc_html: "<strong>Silence</strong> rendra les messages des comptes concernés invisibles à ceux qui ne les suivent pas. <strong>Suspendre</strong> supprimera tout le contenu des comptes concernés, les médias, et les données du profil."
+          desc_html: "<strong>Silence</strong> rendra les messages des comptes concernés invisibles à ceux qui ne les suivent pas. <strong>Suspendre</strong> supprimera tout le contenu des comptes concernés, les médias, et les données du profil. Utilisez <strong>Aucun</strong> si vous voulez simplement rejeter les fichiers multimédia."
           noop: Aucune
           silence: Masqué
           suspend: Suspendre
@@ -285,7 +288,7 @@ fr:
         desc_html: Montrer un badge de responsable sur une page utilisateur
         title: Montrer un badge de responsable
       site_description:
-        desc_html: Affichée sous la forme d’un paragraphe sur la page d’accueil et utilisée comme balise meta.<br/>Vous pouvez utiliser des balises HTML, en particulier <code>&lt;a&gt;</code> et <code>&lt;em&gt;</code>.
+        desc_html: Paragraphe introductif sur la page d'accueil et dans les balises meta. Vous pouvez utiliser des balises HTML, en particulier <code>&lt;a&gt;</code> et <code>&lt;em&gt;</code>.
         title: Description du site
       site_description_extended:
         desc_html: Affichée sur la page d’informations complémentaires du site<br>Vous pouvez utiliser des balises HTML
@@ -342,7 +345,7 @@ fr:
     warning: Soyez prudent⋅e avec ces données. Ne les partagez pas !
     your_token: Votre jeton d’accès
   auth:
-    agreement_html: En vous inscrivant, vous souscrivez à <a href="%{rules_path}">nos conditions d’utilisation</a> ainsi qu’à <a href="%{terms_path}">notre politique de confidentialité</a>.
+    agreement_html: En vous inscrivant, vous souscrivez <a href="%{rules_path}">aux règles de l’instance</a> et à <a href="%{terms_path}">nos conditions d’utilisation</a>.
     change_password: Sécurité
     delete_account: Supprimer le compte
     delete_account_html: Si vous désirez supprimer votre compte, vous pouvez <a href="%{path}">cliquer ici</a>. Il vous sera demandé de confirmer cette action.
@@ -454,9 +457,12 @@ fr:
     table:
       expires_at: Expire
       uses: Utilise
-    title: Personnes invitées
+    title: Inviter des gens
   landing_strip_html: <strong>%{name}</strong> utilise %{link_to_root_path}. Vous pouvez læ suivre et interagir si vous possédez un compte quelque part dans le "fediverse".
   landing_strip_signup_html: Si ce n’est pas le cas, vous pouvez <a href="%{sign_up_path}">en créer un ici</a>.
+  lists:
+    errors:
+      limit: Vous avez atteint le nombre maximum de listes
   media_attachments:
     validations:
       images_and_video: Impossible de joindre une vidéo à un statut contenant déjà des images
@@ -590,11 +596,12 @@ fr:
     open_in_web: Ouvrir sur le web
     over_character_limit: limite de caractères dépassée de %{max} caractères
     pin_errors:
-      limit: Trop de pouets épinglés
+      limit: Vous avez déjà épinglé le nombre maximum de pouets
       ownership: Vous ne pouvez pas épingler un statut ne vous appartenant pas
       private: Les statuts non-publics ne peuvent pas être épinglés
       reblog: Un partage ne peut pas être épinglé
     show_more: Afficher plus
+    title: '%{name} : "%{quote}"'
     visibilities:
       private: Abonné⋅e⋅s uniquement
       private_long: Seul⋅e⋅s vos abonné⋅e⋅s verront vos statuts
@@ -677,8 +684,6 @@ fr:
 
       <p>Originellement adapté à partir de la politique de confidentialité de <a href="https://github.com/discourse/discourse">Discourse</a>.</p>
     title: "%{instance} Conditions d’utilisations et politique de confidentialité"
-  themes:
-    default: Mastodon
   time:
     formats:
       default: "%d %b %Y, %H:%M"
@@ -695,7 +700,7 @@ fr:
     manual_instructions: 'Si vous ne pouvez pas scanner ce QR code et devez l’entrer manuellement, voici le secret en clair :'
     recovery_codes: Codes de récupération
     recovery_codes_regenerated: Codes de récupération régénérés avec succès
-    recovery_instructions_html: Si vous perdez l’accès à votre téléphone, vous pouvez utiliser un des codes de récupération ci-dessous pour récupérer l’accès à votre compte. Conservez les codes de récupération en toute sécurité, par exemple, en les imprimant et en les stockant avec vos autres documents importants.
+    recovery_instructions_html: Si vous perdez l’accès à votre téléphone, vous pouvez utiliser un des codes de récupération ci-dessous pour retrouver l’accès à votre compte. <strong>Conservez les codes de récupération en sécurité</strong>. Par exemple, en les imprimant et en les stockant avec vos autres documents importants.
     setup: Installer
     wrong_code: Les codes entrés sont incorrects ! L’heure du serveur et celle de votre appareil sont-elles correctes ?
   users:
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 3097fb22b..8974a8f82 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -24,7 +24,7 @@ ja:
       within_reach_body: デベロッパーフレンドリーな API により実現された、iOS や Android、その他様々なプラットフォームのためのアプリでどこでも友人とやりとりできます。
       within_reach_title: いつでも身近に
     find_another_instance: 他のインスタンスを探す
-    generic_description: "%{domain} は、Mastodon インスタンスの一つです。"
+    generic_description: "%{domain} は、Mastodon インスタンスの一つです"
     hosted_on: Mastodon hosted on %{domain}
     learn_more: もっと詳しく
     other_instances: 他のインスタンス
@@ -40,13 +40,13 @@ ja:
     following: フォロー中
     media: メディア
     moved_html: "%{name} さんは引っ越しました %{new_profile_link}:"
-    nothing_here: 何もありません
+    nothing_here: 何もありません!
     people_followed_by: "%{name} さんがフォロー中のアカウント"
     people_who_follow: "%{name} さんをフォロー中のアカウント"
     posts: トゥート
     posts_with_replies: トゥートと返信
     remote_follow: リモートフォロー
-    reserved_username: このユーザー名は予約されています。
+    reserved_username: このユーザー名は予約されています
     roles:
       admin: Admin
       moderator: Mod
@@ -56,9 +56,9 @@ ja:
       account: モデレータ
       create: 書き込む
       created_at: 日付
-      created_msg: モデレーションメモを書き込みました
+      created_msg: モデレーションメモを書き込みました!
       delete: 削除
-      destroyed_msg: モデレーションメモを削除しました
+      destroyed_msg: モデレーションメモを削除しました!
     accounts:
       are_you_sure: 本当に実行しますか?
       by_domain: ドメイン
@@ -151,7 +151,7 @@ ja:
         memorialize_account: "%{name} さんが %{target} さんを追悼アカウントページに登録しました"
         promote_user: "%{name} さんが %{target} さんを昇格しました"
         reset_password_user: "%{name} さんが %{target} さんのパスワードをリセットしました"
-        resolve_report: "%{name} さんがレポート %{target} を棄却しました"
+        resolve_report: "%{name} さんがレポート %{target} を解決済みにしました"
         silence_account: "%{name} さんが %{target} さんをサイレンスにしました"
         suspend_account: "%{name} さんが %{target} さんを停止しました"
         unsilence_account: "%{name} さんが %{target} さんのサイレンスを解除しました"
@@ -163,25 +163,25 @@ ja:
       copied_msg: 絵文字のコピーをローカルに作成しました
       copy: コピー
       copy_failed_msg: 絵文字のコピーをローカルに作成できませんでした
-      created_msg: 絵文字の追加に成功しました
+      created_msg: 絵文字の追加に成功しました!
       delete: 削除
-      destroyed_msg: 絵文字の削除に成功しました
+      destroyed_msg: 絵文字の削除に成功しました!
       disable: 無効化
       disabled_msg: 絵文字を無効化しました
       emoji: 絵文字
       enable: 有効化
       enabled_msg: 絵文字を有効化しました
-      image_hint: 50KBまでのPNG画像を利用できます。
+      image_hint: 50KBまでのPNG画像を利用できます
       listed: 収載
       new:
         title: 新規カスタム絵文字の追加
       overwrite: 上書き
       shortcode: ショートコード
-      shortcode_hint: 2文字以上の半角英数字とアンダーバーのみ利用できます。
+      shortcode_hint: 2文字以上の半角英数字とアンダーバーのみ利用できます
       title: カスタム絵文字
       unlisted: 未収載
       update_failed_msg: 絵文字を更新できませんでした
-      updated_msg: 絵文字の更新に成功しました
+      updated_msg: 絵文字の更新に成功しました!
       upload: アップロード
     domain_blocks:
       add_new: 新規追加
@@ -192,13 +192,13 @@ ja:
         create: ブロックを作成
         hint: ドメインブロックはデータベース中のアカウント項目の作成を妨げませんが、遡って自動的に指定されたモデレーションをそれらのアカウントに適用します。
         severity:
-          desc_html: "<strong>サイレンス</strong>はアカウントのトゥートをフォローしていない人から隠します。<strong>停止</strong>はそのアカウントのコンテンツ、メディア、プロフィールデータをすべて削除します。"
+          desc_html: "<strong>サイレンス</strong>はアカウントのトゥートをフォローしていない人から隠します。<strong>停止</strong>はそのアカウントのコンテンツ、メディア、プロフィールデータをすべて削除します。メディアファイルの拒否は<strong>なし</strong>を使います。"
           noop: なし
           silence: サイレンス
           suspend: 停止
         title: 新規ドメインブロック
       reject_media: メディアファイルを拒否
-      reject_media_hint: ローカルに保存されたメディアファイルを削除し、今後のダウンロードを拒否します。停止とは無関係です。
+      reject_media_hint: ローカルに保存されたメディアファイルを削除し、今後のダウンロードを拒否します。停止とは無関係です
       severities:
         noop: なし
         silence: サイレンス
@@ -271,7 +271,7 @@ ja:
         username: 連絡先のユーザー名
       registrations:
         closed_message:
-          desc_html: 新規登録を停止しているときにフロントページに表示されます。HTMLタグが使えます。
+          desc_html: 新規登録を停止しているときにフロントページに表示されます。HTMLタグが使えます
           title: 新規登録停止時のメッセージ
         deletion:
           desc_html: 誰でも自分のアカウントを削除できるようにします
@@ -289,14 +289,14 @@ ja:
         desc_html: フロントページへの表示と meta タグに使用される紹介文です。HTMLタグ、特に<code>&lt;a&gt;</code> と <code>&lt;em&gt;</code>が使えます。
         title: インスタンスの説明
       site_description_extended:
-        desc_html: あなたのインスタンスにおける行動規範やルール、ガイドライン、そのほかの記述をする際に最適な場所です。HTMLタグが使えます。
+        desc_html: あなたのインスタンスにおける行動規範やルール、ガイドライン、そのほかの記述をする際に最適な場所です。HTMLタグが使えます
         title: カスタム詳細説明
       site_terms:
-        desc_html: あなたは独自のプライバシーポリシーや利用規約、そのほかの法的根拠を書くことができます。HTMLタグが使えます。
+        desc_html: あなたは独自のプライバシーポリシーや利用規約、そのほかの法的根拠を書くことができます。HTMLタグが使えます
         title: カスタム利用規約
       site_title: インスタンスの名前
       thumbnail:
-        desc_html: OpenGraphとAPIによるプレビューに使用されます。サイズは1200×630px推奨です。
+        desc_html: OpenGraphとAPIによるプレビューに使用されます。サイズは1200×630px推奨です
         title: インスタンスのサムネイル
       timeline_preview:
         desc_html: ランディングページに公開タイムラインを表示します
@@ -333,7 +333,7 @@ ja:
     salutation: "%{name} さん"
     settings: 'メール設定の変更: %{link}'
     signature: Mastodon %{instance} インスタンスからの通知
-    view: リンク
+    view: 'リンク:'
   applications:
     created: アプリが作成されました
     destroyed: アプリが削除されました
@@ -359,12 +359,12 @@ ja:
     reset_password: パスワードを再発行
     set_new_password: 新しいパスワード
   authorize_follow:
-    error: 残念ながら、リモートアカウント情報の取得中にエラーが発生しました。
+    error: 残念ながら、リモートアカウント情報の取得中にエラーが発生しました
     follow: フォロー
     follow_request: 'あなたは以下のアカウントにフォローリクエストを送信しました:'
     following: '成功! あなたは現在以下のアカウントをフォローしています:'
     post_follow:
-      close: またはこのウィンドウを閉じます
+      close: またはこのウィンドウを閉じます。
       return: ユーザーのプロフィールに戻る
       web: Web を開く
     title: "%{acct} をフォロー"
@@ -384,7 +384,7 @@ ja:
       x_seconds: "%{count}秒"
   deletes:
     bad_password_msg: パスワードが違います
-    confirm_password: 本人確認のため、現在のパスワードを入力してください。
+    confirm_password: 本人確認のため、現在のパスワードを入力してください
     description_html: あなたのアカウントに含まれるコンテンツは全て削除され、アカウントは無効化されます。これは恒久的なもので、<strong>取り消すことはできません</strong>。なりすましを防ぐために、同じユーザー名で再度登録することはできなくなります。
     proceed: アカウントを削除する
     success_msg: アカウントは正常に削除されました
@@ -397,7 +397,7 @@ ja:
     '422':
       content: セキュリティ認証に失敗しました。Cookieをブロックしていませんか?
       title: セキュリティ認証に失敗
-    '429': リクエストの制限に達しました。
+    '429': リクエストの制限に達しました
     '500':
       content: もうしわけありませんが、なにかが間違っています。
       title: このページは正しくありません
@@ -419,23 +419,24 @@ ja:
       other: "%{count} 個のドメインからソフトブロックするフォロワーを処理中..."
     true_privacy_html: "<strong>プライバシーの保護はエンドツーエンドの暗号化でのみ実現可能</strong>であることに留意ください。"
     unlocked_warning_html: 誰でもあなたをフォローすることができ、あなたのプライベート投稿をすぐに見ることができます。フォローする人を限定したい場合は%{lock_link}に設定してください。
-    unlocked_warning_title: このアカウントは非公開アカウントに設定されていません。
+    unlocked_warning_title: このアカウントは非公開アカウントに設定されていません
   generic:
-    changes_saved_msg: 正常に変更されました
+    changes_saved_msg: 正常に変更されました!
     powered_by: powered by %{link}
     save_changes: 変更を保存
+    use_this: これを使う
     validation_errors:
-      one: エラーが発生しました。以下のエラーを確認してください。
-      other: エラーが発生しました。以下の%{count}個のエラーを確認してください。
+      one: エラーが発生しました! 以下のエラーを確認してください
+      other: エラーが発生しました! 以下の%{count}個のエラーを確認してください
   imports:
     preface: 他のインスタンスでエクスポートされたファイルから、フォロー/ブロックした情報をこのインスタンス上のアカウントにインポートできます。
-    success: ファイルは正常にアップロードされ、現在処理中です。しばらくしてから確認してください。
+    success: ファイルは正常にアップロードされ、現在処理中です。しばらくしてから確認してください
     types:
       blocking: ブロックしたアカウントリスト
       following: フォロー中のアカウントリスト
       muting: ミュートしたアカウントリスト
     upload: アップロード
-  in_memoriam_html: 故人を偲んで
+  in_memoriam_html: 故人を偲んで。
   invites:
     delete: 無効化
     expired: 期限切れ
@@ -451,7 +452,7 @@ ja:
       one: '1'
       other: "%{count}"
     max_uses_prompt: 無制限
-    prompt: リンクを生成・共有してこのインスタンスへの新規登録を受け付けることができます。
+    prompt: リンクを生成・共有してこのインスタンスへの新規登録を受け付けることができます
     table:
       expires_at: 有効期限
       uses: 使用
@@ -466,15 +467,18 @@ ja:
     remove_all: すべて削除
   landing_strip_html: "<strong>%{name}</strong> さんはインスタンス %{link_to_root_path} のユーザーです。アカウントさえ持っていればフォローしたり会話したりできます。"
   landing_strip_signup_html: もしお持ちでないなら <a href="%{sign_up_path}">こちら</a> からサインアップできます。
+  lists:
+    errors:
+      limit: リストの上限に達しました
   media_attachments:
     validations:
-      images_and_video: 既に画像が追加されているため、動画を追加することはできません。
-      too_many: 追加できるファイルは4つまでです。
+      images_and_video: 既に画像が追加されているため、動画を追加することはできません
+      too_many: 追加できるファイルは4つまでです
   migrations:
     acct: 引っ越し先の ユーザー名@ドメイン
     currently_redirecting: 'あなたのプロフィールは引っ越し先が設定されています:'
     proceed: 保存
-    updated_msg: アカウントの引っ越し設定を更新しました
+    updated_msg: アカウントの引っ越し設定を更新しました!
   moderation:
     title: モデレーション
   notification_mailer:
@@ -491,7 +495,7 @@ ja:
       body: "%{name} さんにお気に入り登録された、あなたのトゥートがあります:"
       subject: "%{name} さんにお気に入りに登録されました"
     follow:
-      body: "%{name} さんにフォローされています"
+      body: "%{name} さんにフォローされています!"
       subject: "%{name} さんにフォローされています"
     follow_request:
       body: "%{name} さんがあなたにフォローをリクエストしました"
@@ -587,6 +591,7 @@ ja:
     development: 開発
     edit_profile: プロフィールを編集
     export: データのエクスポート
+    flavours: フレーバー
     followers: 信頼済みのインスタンス
     import: データのインポート
     migrate: アカウントの引っ越し
@@ -599,7 +604,7 @@ ja:
     open_in_web: Webで開く
     over_character_limit: 上限は %{max}文字までです
     pin_errors:
-      limit: 固定されているトゥートが多すぎます
+      limit: 固定されているトゥートの上限に達しました
       ownership: 他人のトゥートを固定することはできません
       private: 非公開のトゥートを固定することはできません
       reblog: ブーストされたトゥートを固定することはできません
@@ -690,7 +695,7 @@ ja:
     formats:
       default: "%Y年%m月%d日 %H:%M"
   two_factor_authentication:
-    code_hint: 確認するには認証アプリで表示されたコードを入力してください。
+    code_hint: 確認するには認証アプリで表示されたコードを入力してください
     description_html: "<strong>二段階認証</strong>を有効にするとログイン時、電話でコードを受け取る必要があります。"
     disable: 無効
     enable: 有効
@@ -701,7 +706,7 @@ ja:
     lost_recovery_codes: リカバリーコードを使用すると携帯電話を紛失した場合でもアカウントにアクセスできるようになります。 リカバリーコードを紛失した場合もここで再生成することができますが、古いリカバリーコードは無効になります。
     manual_instructions: 'QRコードがスキャンできず、手動での登録を希望の場合はこのシークレットコードを利用してください。:'
     recovery_codes: リカバリーコード
-    recovery_codes_regenerated: リカバリーコードが再生成されました。
+    recovery_codes_regenerated: リカバリーコードが再生成されました
     recovery_instructions_html: 携帯電話を紛失した場合、以下の内どれかのリカバリーコードを使用してアカウントへアクセスすることができます。<strong>リカバリーコードは大切に保全してください。</strong>たとえば印刷してほかの重要な書類と一緒に保管することができます。
     setup: 初期設定
     wrong_code: コードが間違っています。サーバー上の時間とデバイス上の時間が一致していることを確認してください。
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 2410c1112..dca5af57d 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -85,9 +85,9 @@ nl:
         local: Lokaal
         remote: Extern
         title: Locatie
-      login_status: Aanmeld status
-      media_attachments: Media-bijlagen
-      memorialize: Verander in memoriam
+      login_status: Aanmeldstatus
+      media_attachments: Mediabijlagen
+      memorialize: Verander naar in memoriam
       moderation:
         all: Alles
         silenced: Genegeerd
@@ -115,8 +115,9 @@ nl:
       role: Permissies
       roles:
         admin: Beheerder
-        moderator: Moderateur
-        user: Persoon
+        moderator: Moderator
+        staff: Medewerkers
+        user: Gebruiker
       salmon_url: Salmon-URL
       search: Zoeken
       shared_inbox_url: Gedeelde inbox-URL
@@ -135,23 +136,32 @@ nl:
       web: Webapp
     action_logs:
       actions:
-        confirm_user: "%{name} bevestigd e-mailadres van persoon %{target}"
-        create_custom_emoji: "%{name} heeft de nieuwe emoji %{target} geupload"
-        create_domain_block: "%{name} heeft domein %{target} geblokkeerd"
-        create_email_domain_block: "%{name} heeft e-maildomein %{target} geblacklist"
-        demote_user: "%{name} heeft persoon %{target} gedegradeerd"
-        destroy_domain_block: "%{name} heeft domein %{target} vrijgegeven"
-        destroy_email_domain_block: "%{name} heeft e-maildomein %{target} gewhitelist"
-        destroy_status: "%{name} heeft status van %{target} verwijderd"
-        disable_2fa_user: "%{name} heeft tweefactor voorwaarden van persoon %{target} uitgeschakeld"
-        disable_custom_emoji: "%{name} heeft emoji %{target} uitgeschakeld"
-        disable_user: "%{name} heeft de login van persoon %{target} uitgeschakeld"
-        enable_custom_emoji: "%{name} heeft emoji %{target} ingeschakeld"
-        enable_user: "%{name} heeft de login voor persoon %{target} ingeschakeld"
-        memorialize_account: "%{name} heeft %{target}'s account gewijzigd in een memoriam pagina"
-        promote_user: "%{name} heeft persoon %{target} gepromoveerd"
-        reset_password_user: "%{name} heeft het wachtwoord van gebruiker %{target} opnieuw ingesteld"
+        confirm_user: E-mailadres van gebruiker %{target} is door %{name} bevestigd
+        create_custom_emoji: Nieuwe emoji %{target} is door %{name} geüpload
+        create_domain_block: Domein %{target} is door %{name} geblokkeerd
+        create_email_domain_block: E-maildomein %{target} is door %{name} op de zwarte lijst geplaatst
+        demote_user: Gebruiker %{target} is door %{name} gedegradeerd
+        destroy_domain_block: Domein %{target} is door %{name} gedeblokkeerd
+        destroy_email_domain_block: E-maildomein %{target} is door %{name} op de witte lijst geplaatst
+        destroy_status: Toot van %{target} is door %{name} verwijderd
+        disable_2fa_user: Vereisten tweestapsverificatie van %{target} zijn door %{name} uitgeschakeld
+        disable_custom_emoji: Emoji %{target} is door %{name} uitgeschakeld
+        disable_user: Inloggen voor %{target} is door %{name} uitgeschakeld
+        enable_custom_emoji: Emoji %{target} is door %{name} ingeschakeld
+        enable_user: Inloggen voor %{target} is door %{name} ingeschakeld
+        memorialize_account: Account %{target} is door %{name} in een in-memoriampagina veranderd
+        promote_user: Gebruiker %{target} is door %{name} gepromoveerd
+        reset_password_user: Wachtwoord van gebruiker %{target} is door %{name} opnieuw ingesteld
+        resolve_report: Gerapporteerde toots van %{target} zijn door %{name} verworpen
+        silence_account: Account %{target} is door %{name} genegeerd
+        suspend_account: Account %{target} is door %{name} opgeschort
+        unsilence_account: Negeren van account %{target} is door %{name} opgeheven
+        unsuspend_account: Opschorten van account %{target} is door %{name} opgeheven
+        update_custom_emoji: Emoji %{target} is door %{name} bijgewerkt
+        update_status: De toots van %{target} zijn door %{name} bijgewerkt
+      title: Auditlog
     custom_emojis:
+      by_domain: Domein
       copied_msg: Lokale kopie van emoji maken geslaagd
       copy: Kopiëren
       copy_failed_msg: Kan geen lokale kopie van deze emoji maken
@@ -164,11 +174,16 @@ nl:
       enable: Inschakelen
       enabled_msg: Inschakelen van deze emoji geslaagd
       image_hint: PNG van max. 50KB
+      listed: Weergegeven
       new:
         title: Lokale emoji toevoegen
+      overwrite: Overschrijven
       shortcode: Shortcode
       shortcode_hint: Tenminste 2 tekens (alleen alfanumeriek en underscores)
       title: Lokale emoji’s
+      unlisted: Niet weergegeven
+      update_failed_msg: Deze emoji kon niet worden bijgewerkt
+      updated_msg: Bijwerken van emoji is geslaagd!
       upload: Uploaden
     domain_blocks:
       add_new: Nieuwe toevoegen
@@ -185,7 +200,7 @@ nl:
           suspend: Opschorten
         title: Nieuwe domeinblokkade
       reject_media: Mediabestanden verwerpen
-      reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen.
+      reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen
       severities:
         noop: Geen
         silence: Negeren
@@ -197,7 +212,7 @@ nl:
           other: "%{count} accounts in de database aangepast"
         retroactive:
           silence: Alle genegeerde accounts van dit domein niet meer negeren
-          suspend: Alle opgeschorste accounts van dit domein niet meer opschorten
+          suspend: Alle opgeschorte accounts van dit domein niet meer opschorten
         title: Domeinblokkade voor %{domain} ongedaan maken
         undo: Ongedaan maken
       title: Domeinblokkades
@@ -218,6 +233,13 @@ nl:
       reset: Opnieuw
       search: Zoeken
       title: Bekende servers
+    invites:
+      filter:
+        all: Alles
+        available: Beschikbaar
+        expired: Verlopen
+        title: Filter
+      title: Uitnodigingen
     reports:
       action_taken_by: Actie uitgevoerd door
       are_you_sure: Weet je het zeker?
@@ -256,21 +278,27 @@ nl:
         deletion:
           desc_html: Toestaan dat iedereen hun eigen account kan verwijderen
           title: Verwijderen account toestaan
+        min_invite_role:
+          disabled: Niemand
+          title: Uitnodigingen toestaan door
         open:
           desc_html: Toestaan dat iedereen een account kan registereren
           title: Open registratie
+      show_staff_badge:
+        desc_html: Medewerkersbadge op profielpagina tonen
+        title: Medewerkersbadge tonen
       site_description:
-        desc_html: Dit wordt als een alinea op de voorpagina getoond en gebruikt als meta-tag in de paginabron.<br>Je kan HTML gebruiken, zoals <code>&lt;a&gt;</code> en <code>&lt;em&gt;</code>.
+        desc_html: Dit wordt als een alinea op de voorpagina getoond en gebruikt als meta-tag in de paginabron.<br/>Je kan HTML gebruiken, zoals <code>&lt;a&gt;</code> en <code>&lt;em&gt;</code>.
         title: Omschrijving Mastodon-server
       site_description_extended:
         desc_html: Wordt op de uitgebreide informatiepagina weergegeven<br>Je kan ook hier HTML gebruiken
         title: Uitgebreide omschrijving Mastodon-server
       site_terms:
-        desc_html: Je kan hier jouw eigen privacybeleid, gebruikersvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken.
+        desc_html: Je kan hier jouw eigen privacybeleid, gebruikersvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken
         title: Aangepaste gebruikersvoorwaarden
       site_title: Naam Mastodon-server
       thumbnail:
-        desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen.
+        desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen
         title: Thumbnail Mastodon-server
       timeline_preview:
         desc_html: Toon de openbare tijdlijn op de startpagina
@@ -317,7 +345,7 @@ nl:
     warning: Wees voorzichtig met deze gegevens. Deel het nooit met iemand anders!
     your_token: Jouw toegangscode
   auth:
-    agreement_html: Wanneer je op registreren klikt ga je akkoord met <a href="%{rules_path}">onze gebruikersvoorwaarden</a> en <a href="%{terms_path}">ons privacybeleid</a>.
+    agreement_html: Wanneer je op registreren klikt ga je akkoord met het opvolgen van <a href="%{rules_path}">de regels van deze server</a> en <a href="%{terms_path}">onze gebruikersvoorwaarden</a>.
     change_password: Beveiliging
     delete_account: Account verwijderen
     delete_account_html: Wanneer je jouw account graag wilt verwijderen, kan je dat <a href="%{path}">hier doen</a>. We vragen jou daar om een bevestiging.
@@ -326,6 +354,8 @@ nl:
     invalid_reset_password_token: De code om jouw wachtwoord opnieuw in te stellen is verlopen. Vraag een nieuwe aan.
     login: Aanmelden
     logout: Afmelden
+    migrate_account: Naar een andere account verhuizen
+    migrate_account_html: Wanneer je dit account naar een ander account wilt doorverwijzen, kun je <a href="%{path}">dit hier instellen</a>.
     register: Registreren
     resend_confirmation: Verstuur de bevestigingsinstructies nogmaals
     reset_password: Wachtwoord opnieuw instellen
@@ -369,7 +399,7 @@ nl:
     '422':
       content: Veiligheidsverificatie mislukt. Blokkeer je toevallig cookies?
       title: Veiligheidsverificatie mislukt
-    '429': Te veel verbindingsaanvragen.
+    '429': Te veel verbindingsaanvragen
     '500':
       content: Het spijt ons, er is aan onze kant iets fout gegaan.
       title: Er is iets mis
@@ -407,12 +437,43 @@ nl:
       following: Volglijst
       muting: Negeerlijst
     upload: Uploaden
+  in_memoriam_html: In memoriam.
+  invites:
+    delete: Deactiveren
+    expired: Verlopen
+    expires_in:
+      '1800': 30 minuten
+      '21600': 6 uur
+      '3600': 1 uur
+      '43200': 12 uur
+      '86400': 1 dag
+    expires_in_prompt: Nooit
+    generate: Genereren
+    max_uses:
+      one: 1 keer
+      other: "%{count} keer"
+    max_uses_prompt: Onbeperkt
+    prompt: Genereer en deel speciale links om mensen toegang tot deze Mastodon-server te geven
+    table:
+      expires_at: Verloopt op
+      uses: Aantal keer te gebruiken
+    title: Mensen uitnodigen
   landing_strip_html: "<strong>%{name}</strong> is een gebruiker op %{link_to_root_path}. Je kunt deze volgen en ermee communiceren als je op Mastodon (of ergens anders in de fediverse) een account hebt."
   landing_strip_signup_html: Als je dat niet hebt, kun je je <a href="%{sign_up_path}">hier registreren</a>.
+  lists:
+    errors:
+      limit: Je hebt het maximaal aantal lijsten bereikt
   media_attachments:
     validations:
       images_and_video: Een video kan niet aan een toot met afbeeldingen worden gekoppeld
       too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden
+  migrations:
+    acct: gebruikersnaam@domein van het nieuwe account
+    currently_redirecting: 'Jouw profiel wordt nu doorverwezen naar:'
+    proceed: Opslaan
+    updated_msg: Jouw accountmigratie-instelling is succesvol bijgewerkt!
+  moderation:
+    title: Moderatie
   notification_mailer:
     digest:
       body: 'Hier is een korte samenvatting van wat je hebt gemist op %{instance} sinds jouw laatste bezoek op %{since}:'
@@ -448,7 +509,7 @@ nl:
           quadrillion: Q
           thousand: K
           trillion: T
-          unit: ''
+          unit: " "
   pagination:
     next: Volgende
     prev: Vorige
@@ -525,6 +586,7 @@ nl:
     export: Exporteren
     followers: Geautoriseerde volgers
     import: Importeren
+    migrate: Accountmigratie
     notifications: Meldingen
     preferences: Voorkeuren
     settings: Instellingen
@@ -534,11 +596,12 @@ nl:
     open_in_web: In de webapp openen
     over_character_limit: Limiet van %{max} tekens overschreden
     pin_errors:
-      limit: Te veel toots vastgezet
+      limit: Je hebt het maximaal aantal toots al vastgezet
       ownership: Een toot van iemand anders kan niet worden vastgezet
       private: Alleen openbare toots kunnen worden vastgezet
       reblog: Een boost kan niet worden vastgezet
     show_more: Meer tonen
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: Alleen volgers
       private_long: Alleen aan volgers tonen
@@ -637,7 +700,7 @@ nl:
     manual_instructions: Hieronder vind je de geheime code in platte tekst. Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren.
     recovery_codes: Herstelcodes back-uppen
     recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd
-    recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. Zorg ervoor dat je de herstelcodes op een veilige plek bewaard. (Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.)
+    recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. <strong>Zorg ervoor dat je de herstelcodes op een veilige plek bewaard</strong>. Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.
     setup: Instellen
     wrong_code: De ingevoerde code is ongeldig! Klopt de systeemtijd van de server en die van jouw apparaat?
   users:
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 207f86afc..57f8547fc 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -1,13 +1,23 @@
 ---
 'no':
   about:
+    about_hashtag_html: Dette er offentlige toots merket med <strong>#%{hashtag}</strong>. Du kan interagere med dem om du har en konto et sted i fediverset.
     about_mastodon_html: Mastodon er et sosialt nettverk laget med <em>fri programvare</em>. Et <em>desentralisert</em> alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på &mdash; uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket.
     about_this: Om denne instansen
     closed_registrations: Registreringer er for øyeblikket lukket på denne instansen.
     contact: Kontakt
+    contact_missing: Ikke innstilt
+    contact_unavailable: Ikke tilgjengelig
     description_headline: Hva er %{domain}?
     domain_count_after: andre instanser
     domain_count_before: Koblet til
+    extended_description_html: |
+      <h3>En god plassering for regler</h3>
+      <p>En utvidet beskrivelse er ikke satt opp ennå.</p>
+    features:
+      humane_approach_title: En mer menneskelig tilnærming
+      not_a_product_body: Mastodon er ikke et kommerst nettverk. Ingen reklame, ingen datainnsamling, ingen innhegnede hager. Det finnes ingen sentral myndighet.
+      not_a_product_title: Du er en person, ikke et produkt
     other_instances: Andre instanser
     source_code: Kildekode
     status_count_after: statuser
@@ -29,7 +39,7 @@
       are_you_sure: Er du sikker?
       confirm: Bekreft
       confirmed: Bekreftet
-      disable_two_factor_authentication: Disable 2FA
+      disable_two_factor_authentication: Skru av 2FA
       display_name: Visningsnavn
       domain: Domene
       edit: Redigér
@@ -81,12 +91,12 @@
         create: Lag blokkering
         hint: Domeneblokkeringen vil ikke hindre opprettelse av kontooppføringer i databasen, men vil retroaktivt og automatisk benytte spesifikke moderasjonsmetoder på de kontoene.
         severity:
-          desc_html: "<strong>Målbind</strong> vil gjøre kontoens poster usynlige for alle som ikke følger den. <strong>Utvis</storng> fjerner alt innhold, media og profildata fra kontoen."
+          desc_html: "<strong>Målbind</strong> gjør kontoens poster usynlige for alle som ikke følger den. <strong>Utvis</strong> fjerner alt innhold, media og profildata fra kontoen. Bruk <strong>Ingen</strong> hvis du bare vil fjerne mediafiler."
           silence: Målbind
           suspend: Utvis
         title: Ny domeneblokkering
       reject_media: Avvis mediefiler
-      reject_media_hint: Fjerner lokalt lagrede mediefiler og nekter å laste dem ned i fremtiden. Irrelevant for utvisninger.
+      reject_media_hint: Fjerner lokalt lagrede mediefiler og nekter å laste dem ned i fremtiden. Irrelevant for utvisninger
       severities:
         silence: Målbind
         suspend: Utvis
@@ -136,7 +146,7 @@
         open:
           title: Åpen registrering
       site_description:
-        desc_html: Vises som et avsnitt på forsiden og brukes som en meta-tagg.<br> Du kan bruke HTML-tagger, spesielt <code>&lt;a&gt;</code> og <code>&lt;em&gt;</code>.
+        desc_html: Vises som et avsnitt på forsiden og brukes som en meta-tagg. Du kan bruke HTML-tagger, spesielt <code>&lt;a&gt;</code> og <code>&lt;em&gt;</code>.
         title: Nettstedsbeskrivelse
       site_description_extended:
         desc_html: Vises på side for utvidet informasjon.<br>Du kan bruke HTML-tagger
@@ -168,7 +178,7 @@
     reset_password: Nullstill passord
     set_new_password: Sett nytt passord
   authorize_follow:
-    error: Uheldigvis så skjedde det en feil da vi prøvde å få tak i en bruker fra en annen instans.
+    error: Uheldigvis skjedde det en feil da vi prøvde å få tak i en bruker fra en annen instans
     follow: Følg
     title: Følg %{acct}
   datetime:
@@ -191,8 +201,8 @@
     '410': Siden du leter etter finnes ikke lenger.
     '422':
       content: Sikkerhetsverifisering feilet. Blokkerer du informasjonskapsler?
-      title: Sikkerhetsverifisering feilet.
-    '429': Throttled
+      title: Sikkerhetsverifisering feilet
+    '429': Overfyllt
   exports:
     blocks: Du blokkerer
     csv: CSV
@@ -208,7 +218,7 @@
     success:
       one: I ferd med å mykblokkere følgere fra ett domene...
       other: I ferd med å mykblokkere følgere fra %{count} domener...
-    true_privacy_html: Vennligst forstå at <strong>virkelig privatliv kun kan oppnås med ende-til-ende-kryptering.</strong>
+    true_privacy_html: Merk deg at <strong>virkelig privatliv kun kan oppnås med ende-til-ende-kryptering</strong>.
     unlocked_warning_html: Alle kan følge deg for å umiddelbart se dine private statuser. %{lock_link} for å kunne se over og avvise følgere.
     unlocked_warning_title: Din konto er ikke låst
   generic:
@@ -220,7 +230,7 @@
       other: Noe er ikke helt riktig ennå. Det er ennå %{count} feil å rette på
   imports:
     preface: Du kan importere data om brukere du følger eller blokkerer til kontoen din på denne instansen med eksportfiler fra andre instanser.
-    success: Din data ble mottatt og vil bli behandlet så fort som mulig.
+    success: Dine data ble mottatt og vil bli behandlet så fort som mulig
     types:
       blocking: Blokkeringsliste
       following: Følgeliste
@@ -243,8 +253,8 @@
         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 likt av %{name}
-      subject: "%{name} likte din status."
+      body: 'Statusen din ble likt av %{name}:'
+      subject: "%{name} likte statusen din"
     follow:
       body: "%{name} følger deg!"
       subject: "%{name} følger deg"
@@ -382,11 +392,11 @@
     enable: Skru på
     enabled_success: Aktivering av tofaktorautentisering vellykket
     generate_recovery_codes: Generér gjenopprettingskoder
-    instructions_html: "<strong>Scan denne QR-koden i Google Authenticator eller en lignende app på telefonen din</strong>. Fra nå av vil denne applikasjonen generere koder for deg som skal brukes under innlogging"
+    instructions_html: "<strong>Scan denne QR-koden med Google Authenticator eller en lignende app på telefonen din</strong>. Fra nå av vil denne applikasjonen generere koder for deg som skal brukes under innlogging."
     lost_recovery_codes: Gjenopprettingskoder lar deg gjenoppnå tilgang til din konto hvis du mister din telefon. Hvis du har mistet gjenopprettingskodene, kan du regenerere dem her. Dine gamle gjenopprettingskoder vil bli ugyldige.
     manual_instructions: 'Hvis du ikke får scannet QR-koden må du skrive inn følgende kode manuelt:'
     recovery_codes_regenerated: Generering av gjenopprettingskoder vellykket
-    recovery_instructions_html: Hvis du skulle miste tilgang til telefonen din, kan du bruke en av gjenopprettingskodene nedenfor til å gjenopprette tilgang til din konto. Oppbevar gjenopprettingskodene sikkert, for eksempel ved å skrive dem ut og lagre dem sammen med andre viktige dokumenter.
+    recovery_instructions_html: Hvis du skulle miste tilgang til telefonen din, kan du bruke en av gjenopprettingskodene nedenfor til å gjenopprette tilgang til din konto. <strong>Oppbevar gjenopprettingskodene sikkert</strong>, for eksempel ved å skrive dem ut og gjemme dem på et lurt sted bare du vet om.
     setup: Sett opp
     wrong_code: Den angitte koden var ugyldig! Stemmer instansens tid overalt med enhetens tid?
   users:
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index a9bad2d34..97d20bdf8 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -49,6 +49,7 @@ oc:
     reserved_username: Aqueste nom d’utilizaire es reservat
     roles:
       admin: Admin
+      moderator: Mod
     unfollow: Quitar de sègre
   admin:
     account_moderation_notes:
@@ -113,8 +114,9 @@ oc:
       resubscribe: Se tornar abonar
       role: Permissions
       roles:
-        admin: Admin
-        moderator: Mod
+        admin: Administrator
+        moderator: Moderator
+        staff: Personnal
         user: Uitlizaire
       salmon_url: URL Salmon
       search: Cercar
@@ -159,6 +161,7 @@ oc:
         update_status: "%{name} metèt a jorn l’estatut a %{target}"
       title: Audit log
     custom_emojis:
+      by_domain: Domeni
       copied_msg: Còpia locala de l’emoji ben creada
       copy: Copiar
       copy_failed_msg: Fracàs de la còpia locala de l’emoji
@@ -231,7 +234,12 @@ oc:
       search: Cercar
       title: Instàncias conegudas
     invites:
-      title: Covits
+      filter:
+        all: Totes
+        available: Disponibles
+        expired: Expirats
+        title: Filtre
+      title: Convits
     reports:
       action_taken_by: Mesura menada per
       are_you_sure: Es segur ?
@@ -268,8 +276,11 @@ oc:
           desc_html: Afichat sus las pagina d’acuèlh quand las inscripcions son tampadas.<br>Podètz utilizar de balisas HTML
           title: Messatge de barradura de las inscripcions
         deletion:
-          desc_html: Autorizar al monde a suprimir lor compte
+          desc_html: Autorizar lo monde a suprimir lor compte
           title: Possibilitat de suprimir lo compte
+        min_invite_role:
+          disabled: Degun
+          title: Autorizat amb invitacions
         open:
           desc_html: Autorizar lo monde a se marcar
           title: Inscripcions
@@ -277,7 +288,7 @@ oc:
         desc_html: Mostrar lo badge Personal sus la pagina de perfil
         title: Mostrar lo badge personal
       site_description:
-        desc_html: Afichada jos la forma de paragraf sus la pagina d’acuèlh e utilizada coma balisa meta.<br> Podètz utilizar de balisas HTML, coma <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
+        desc_html: Afichada jos la forma de paragraf sus la pagina d’acuèlh e utilizada coma balisa meta. Podètz utilizar de balisas HTML, en particular <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
         title: Descripcion del site
       site_description_extended:
         desc_html: Afichada sus la pagina d’informacion complementària del site<br>Podètz utilizar de balisas HTML
@@ -287,7 +298,7 @@ oc:
         title: Politica de confidencialitat del site
       site_title: Títol del site
       thumbnail:
-        desc_html: Servís pels apercebuts via OpenGraph e las API. Talha de 1200x630px recomandada.
+        desc_html: Servís pels apercebuts via OpenGraph e las API. Talha de 1200x630px recomandada
         title: Miniatura de l’instància
       timeline_preview:
         desc_html: Mostrar lo flux public sus la pagina d’acuèlh
@@ -306,7 +317,7 @@ oc:
         show: Mostrar mèdia
         title: Mèdia
       no_media: Cap mèdia
-      title: Estatuts del compteAccount statuses
+      title: Estatuts del compte
       with_media: Amb mèdia
     subscriptions:
       callback_url: URL de rapèl
@@ -334,7 +345,7 @@ oc:
     warning: Mèfi ! Agachatz de partejar aquela donada amb degun !
     your_token: Vòstre geton d’accès
   auth:
-    agreement_html: En vos marcar acceptatz <a href="%{rules_path}">nòstres tèrmes de servici</a> e <a href="%{terms_path}">politica de confidencialitat</a>.
+    agreement_html: En vos marcar acceptatz <a href="%{rules_path}">las règlas de l’instància</a> e <a href="%{terms_path}">politica de confidencialitat</a>.
     change_password: Seguretat
     delete_account: Suprimir lo compte
     delete_account_html: Se volètz suprimir vòstre compte, podètz <a href="%{path}">o far aquí</a>. Vos demandarem que confirmetz.
@@ -343,6 +354,8 @@ oc:
     invalid_reset_password_token: Lo geton de reïnicializacion es invalid o acabat. Tornatz demandar un geton se vos plai.
     login: Se connectar
     logout: Se desconnectar
+    migrate_account: Mudar endacòm mai
+    migrate_account_html: Se volètz mandar los visitors d’aqueste compte a un autre, podètz<a href="%{path}"> o configurar aquí</a>.
     register: Se marcar
     resend_confirmation: Tornar mandar las instruccions de confirmacion
     reset_password: Reïnicializar lo senhal
@@ -503,18 +516,48 @@ oc:
       muting: Lista de mond que volètz pas legir
     upload: Importar
   in_memoriam_html: En Memòria.
+  invites:
+    delete: Desactivar
+    expired: Expirat
+    expires_in:
+      '1800': 30 minutas
+      '21600': 6 oras
+      '3600': 1 ora
+      '43200': 12 oras
+      '86400': 1 jorn
+    expires_in_prompt: Jamai
+    generate: Generar
+    max_uses:
+      one: 1 persona
+      other: "%{count} personas"
+    max_uses_prompt: Cap limit
+    prompt: Generatz e partejatz los ligams per donar accès a aquesta instància
+    table:
+      expires_at: Expirats
+      uses: Usatges
+    title: Convidar de monde
   landing_strip_html: "<strong>%{name}</strong> utiliza %{link_to_root_path}. Podètz lo/la sègre o interagir amb el o ela s’avètz un compte ont que siasque sul fediverse."
   landing_strip_signup_html: S’es pas lo cas, podètz <a href="%{sign_up_path}">vos marcar aquí</a>.
+  lists:
+    errors:
+      limit: Avètz atengut lo maximum de listas
   media_attachments:
     validations:
       images_and_video: Se pòt pas ajustar una vidèo a un estatut que ten ja d’imatges
       too_many: Se pòt pas ajustar mai de 4 fichièrs
+  migrations:
+    acct: nomutilizaire@domeni del nòu compte
+    currently_redirecting: 'Vòstre perfil es parametrat per mandar a :'
+    proceed: Enregistrar
+    updated_msg: Vòstre paramètre de migracion es ben estat mes a jorn !
+  moderation:
+    title: Moderation
   notification_mailer:
     digest:
       body: 'Trobatz aquí un resumit de çò qu’avètz mancat dempuèi vòstra darrièra visita lo %{since}:'
       mention: "%{name} vos a mencionat dins :"
       new_followers_summary:
-        one: Avètz un nòu seguidor ! Ouà  
+        one: Avètz un nòu seguidor ! Ouà !
         other: Avètz %{count} nòus seguidors ! Qué crane !
       subject:
         one: "Una nòva notificacion dempuèi vòstra darrièra visita \U0001F418"
@@ -621,6 +664,7 @@ oc:
     export: Export donadas
     followers: Seguidors autorizats
     import: Importar
+    migrate: Migracion de compte
     notifications: Notificacions
     preferences: Preferéncias
     settings: Paramètres
@@ -630,11 +674,12 @@ oc:
     open_in_web: Dobrir sul web
     over_character_limit: limit de %{max} caractèrs passat
     pin_errors:
-      limit: Tròp de tuts penjats
+      limit: Avètz ja lo maximum de tuts penjats
       ownership: Se pòt pas penjar lo tut de qualqu’un mai
       private: Se pòt pas penjar los tuts pas publics
       reblog: Se pòt pas penjar un tut partejat
     show_more: Ne veire mai
+    title: '%{name} : "%{quote}"'
     visibilities:
       private: Seguidors solament
       private_long: Mostrar pas qu’als seguidors
@@ -739,4 +784,4 @@ oc:
   users:
     invalid_email: L’adreça de corrièl es invalida
     invalid_otp_token: Còdi d’autentificacion en dos temps invalid
-    signed_in_as: Session a
+    signed_in_as: 'Session a :'
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index baa26f1dc..905557a25 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -469,6 +469,9 @@ pl:
     remove_all: Usuń wszystkie
   landing_strip_html: "<strong>%{name}</strong> ma konto na %{link_to_root_path}. Możesz je śledzić i wejść z nim w interakcję jeśli masz konto gdziekolwiek w Fediwersum."
   landing_strip_signup_html: Jeśli jeszcze go nie masz, możesz <a href="%{sign_up_path}">stworzyć konto</a>.
+  lists:
+    errors:
+      limit: Przekroczyłeś maksymalną liczbę utworzonych list
   media_attachments:
     validations:
       images_and_video: Nie możesz załączyć pliku wideo do wpisu, który zawiera już zdjęcia
@@ -606,7 +609,7 @@ pl:
     open_in_web: Otwórz w przeglądarce
     over_character_limit: limit %{max} znaków przekroczony
     pin_errors:
-      limit: Nie możesz przypiąć więcej wpisów
+      limit: Przekroczyłeś maksymalną liczbę przypiętych wpisów
       ownership: Nie możesz przypiąć cudzego wpisu
       private: Nie możesz przypiąć niepublicznego wpisu
       reblog: Nie możesz przypiąć podbicia wpisu
@@ -693,8 +696,6 @@ pl:
 
       <p>Tekst bazuje na <a href="https://github.com/discourse/discourse">polityce prywatności Discourse</a>.</p>
     title: Zasady korzystania i polityka prywatności %{instance}
-  themes:
-    default: Mastodon
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 760bb69a2..32896ab91 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -67,7 +67,7 @@ pt-BR:
       demote: Rebaixar
       disable: Desativar
       disable_two_factor_authentication: Desativar 2FA
-      disabled: Desativado
+      disabled: Desativada
       display_name: Nome de exibição
       domain: Domínio
       edit: Editar
@@ -121,14 +121,14 @@ pt-BR:
       search: Pesquisar
       shared_inbox_url: URL da Inbox Compartilhada
       show:
-        created_reports: Relatórios criados por esta conta
+        created_reports: Denúncias criadas por esta conta
         report: relatórios
-        targeted_reports: Relatórios feitos sobre esta conta
+        targeted_reports: Denúncias feitas sobre esta conta
       silence: Silêncio
       statuses: Postagens
       subscribe: Inscrever-se
       title: Contas
-      undo_silenced: Retirar silêncio
+      undo_silenced: Desativar silêncio
       undo_suspension: Retirar suspensão
       unsubscribe: Desinscrever-se
       username: Nome de usuário
@@ -151,9 +151,14 @@ pt-BR:
         memorialize_account: "%{name} transformou a conta de %{target} em um memorial"
         promote_user: "%{name} promoveu o usuário %{target}"
         reset_password_user: "%{name} redefiniu a senha do usuário %{target}"
-        resolve_report: "%{name} dispensou o relatório %{target}"
+        resolve_report: "%{name} dispensou a denúncia %{target}"
         silence_account: "%{name} silenciou a conta de %{target}"
         suspend_account: "%{name} suspendeu a conta de %{target}"
+        unsilence_account: "%{name} desativou o silêncio de %{target}"
+        unsuspend_account: "%{name} desativou a suspensão de  %{target}"
+        update_custom_emoji: "%{name} atualizou o emoji %{target}"
+        update_status: "%{name} atualizou o estado de %{target}"
+      title: Auditar relatório
     custom_emojis:
       copied_msg: Cópia local do emoji criada com sucesso
       copy: Copiar
@@ -204,7 +209,7 @@ pt-BR:
           one: Uma conta no banco de dados foi afetada
           other: "%{count} contas no banco de dados foram afetadas"
         retroactive:
-          silence: Retirar silêncio de todas as contas existentes neste domínio
+          silence: Desativar silêncio de todas as contas existentes desse domínio
           suspend: Retirar suspensão de todas as contas neste domínio
         title: Retirar bloqueio de domínio de %{domain}
         undo: Retirar
@@ -217,7 +222,7 @@ pt-BR:
       destroyed_msg: Bloqueio de domínio de e-mail excluído com sucesso
       domain: Domínio
       new:
-        create: Criar bloqueio
+        create: Adicionar domínio
         title: Novo bloqueio de domínio de e-mail
       title: Bloqueio de Domínio de E-mail
     instances:
@@ -226,6 +231,13 @@ pt-BR:
       reset: Resetar
       search: Buscar
       title: Instâncias conhecidas
+    invites:
+      filter:
+        all: Todos
+        available: Disponíveis
+        expired: Expirados
+        title: Filtro
+      title: Convites
     reports:
       action_taken_by: Ação realizada por
       are_you_sure: Você tem certeza?
@@ -238,10 +250,10 @@ pt-BR:
       nsfw:
         'false': Mostrar mídias anexadas
         'true': Esconder mídias anexadas
-      report: 'Reportar #%{id}'
+      report: 'Denúncia #%{id}'
       report_contents: Conteúdos
-      reported_account: Conta reportada
-      reported_by: Reportada por
+      reported_account: Conta denunciada
+      reported_by: Denunciada por
       resolved: Resolvido
       silence_account: Silenciar conta
       status: Status
@@ -264,9 +276,15 @@ pt-BR:
         deletion:
           desc_html: Permitir que qualquer um delete a sua conta
           title: Exclusão aberta de contas
+        min_invite_role:
+          disabled: Ninguém
+          title: Permitir convites de
         open:
           desc_html: Permitir que qualquer um crie uma conta
           title: Cadastro aberto
+      show_staff_badge:
+        desc_html: Mostrar uma insígnia de equipe na página de usuário
+        title: Mostrar insígnia de equipe
       site_description:
         desc_html: Parágrafo introdutório na página inicial e em meta tags. Você pode usar tags HTML, em especial <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
         title: Descrição da instância
@@ -279,7 +297,7 @@ pt-BR:
       site_title: Nome da instância
       thumbnail:
         desc_html: Usada para prévias via OpenGraph e API. Recomenda-se 1200x630px
-        title: Thumbnail da instância
+        title: Miniatura da instância
       timeline_preview:
         desc_html: Exibir a timeline pública na página inicial
         title: Prévia da timeline
@@ -309,7 +327,7 @@ pt-BR:
     title: Administração
   admin_mailer:
     new_report:
-      body: "%{reporter} reportou %{target}"
+      body: "%{reporter} denunciou %{target}"
       subject: Nova denúncia sobre %{instance} (#%{id})
   application_mailer:
     salutation: "%{name},"
@@ -334,9 +352,11 @@ pt-BR:
     invalid_reset_password_token: Token de modificação de senha é inválido ou expirou. Por favor, requisite um novo.
     login: Entrar
     logout: Sair
+    migrate_account: Mudar para uma conta diferente
+    migrate_account_html: Se você quer redirecionar essa conta para uma outra você pode <a href="%{path}">configurar isso aqui</a>.
     register: Cadastrar-se
     resend_confirmation: Reenviar instruções de confirmação
-    reset_password: Modificar senha
+    reset_password: Redefinir senha
     set_new_password: Definir uma nova senha
   authorize_follow:
     error: Infelizmente, ocorreu um erro ao buscar a conta remota
@@ -376,7 +396,7 @@ pt-BR:
     '410': A página pela qual você está procurando não existe mais.
     '422':
       content: A verificação de segurança falhou. Você desativou o uso de cookies?
-      title: Falha na verificação de segurança
+      title: Verificação de segurança falhou
     '429': Muitas requisições
     '500':
       content: Desculpe, algo deu errado.
@@ -416,12 +436,42 @@ pt-BR:
       muting: Lista de silêncio
     upload: Enviar
   in_memoriam_html: Em memória.
+  invites:
+    delete: Desativar
+    expired: Expirados
+    expires_in:
+      '1800': 30 minutos
+      '21600': 6 horas
+      '3600': 1 hora
+      '43200': 12 horas
+      '86400': 1 dia
+    expires_in_prompt: Nunca
+    generate: Gerar
+    max_uses:
+      one: 1 uso
+      other: "%{count} usos"
+    max_uses_prompt: Sem limite
+    prompt: Gerar e compartilha links com outras pessoas para permitir acesso a essa instância
+    table:
+      expires_at: Expira em
+      uses: Usos
+    title: Convidar pessoas
   landing_strip_html: "<strong>%{name}</strong> é um usuário no %{link_to_root_path}. Você pode segui-lo ou interagir com ele se você tiver uma conta em qualquer lugar no fediverso."
   landing_strip_signup_html: Se não, você pode <a href="%{sign_up_path}">se cadastrar aqui</a>.
+  lists:
+    errors:
+      limit: Você alcançou o número máximo de listas
   media_attachments:
     validations:
       images_and_video: Não é possível anexar um vídeo a uma postagem que já contém imagens
       too_many: Não é possível anexar mais de 4 imagens
+  migrations:
+    acct: username@domain da nova conta
+    currently_redirecting: 'Seu perfil está configurado para redirecionar para:'
+    proceed: Salvar
+    updated_msg: As configurações de migração da sua conta foram atualizadas com sucesso!
+  moderation:
+    title: Moderação
   notification_mailer:
     digest:
       body: 'Aqui está um resumo do que você perdeu no %{instance} desde o seu último acesso em %{since}:'
@@ -498,7 +548,7 @@ pt-BR:
       generic: Navegador desconhecido
       ie: Internet Explorer
       micro_messenger: MicroMessenger
-      nokia: Nokia S40 Ovi Browser
+      nokia: Navegador Nokia S40 Ovi
       opera: Opera
       phantom_js: PhantomJS
       qq: QQ Browser
@@ -534,6 +584,7 @@ pt-BR:
     export: Exportar dados
     followers: Seguidores autorizados
     import: Importar
+    migrate: Migração de conta
     notifications: Notificações
     preferences: Preferências
     settings: Configurações
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index 932b166d7..e4c6694e9 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -4,10 +4,14 @@ ar:
     hints:
       defaults:
         avatar: PNG, GIF أو JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 120x120px
-        display_name: <span class="name-counter">%{count}</span> أحرف متبقية
+        digest: يُرسَل بعد مضيّ مدة طويلة من خمول نشاطك يحوي على تلخيص للتبويقات التي ذُكر حسابك فيها أثناء غيابك
+        display_name:
+          one: <span class="name-counter">1</span> حرف متبقي
         header: PNG, GIF or JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 700x335px
         locked: يتطلب منك الموافقة يدويا على كل طلب للإشتراك بحسابك و منشوراتك تعرض لمتابعيك فقط دون غيرهم
         note: <span class="note-counter">%{count}</span> أحرف متبقية
+        setting_noindex: تمس ملفك العمومي الخاص بك وصفحات الحالة
+        setting_theme: تغير المظهر الذي يبدو عليه ماستدون عندما تقوم بتسجيل دخولك على أي جهاز.
       imports:
         data: ملف CSV تم تصديره من خادوم مثيل  آخر لماستدون
       sessions:
@@ -24,6 +28,7 @@ ar:
         header: رأس الصفحة
         locale: اللغة
         locked: إجعل حسابك خاصًا
+        max_uses: العدد الأقصى للإستخدام
         new_password: كلمة مرور جديدة
         note: السيرة الذاتية
         otp_attempt: الرمز الثنائي
@@ -31,6 +36,8 @@ ar:
         setting_auto_play_gif: تشغيل صور جيف المتحركة تلقائي
         setting_boost_modal: إظهار مربع حوار التأكيد قبل القيام بالترقية
         setting_default_privacy: خصوصية المنشور
+        setting_default_sensitive: دائما تحديد الوسائط كحساسة
+        setting_noindex: منع محركات البحث من فهرسة ملفي الشخصي
         severity: الشدة
         type: نوع الإستيراد
         username: اسم المستخدم
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 756f6b119..aa6940e91 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -13,7 +13,6 @@ en:
         note:
           one: <span class="note-counter">1</span> character left
           other: <span class="note-counter">%{count}</span> characters left
-        setting_flavour: Affects how Mastodon looks when you're logged in from any device
         setting_noindex: Affects your public profile and status pages
         setting_skin: Reskins the selected Mastodon flavour
       imports:
@@ -46,7 +45,7 @@ en:
         setting_default_privacy: Post privacy
         setting_default_sensitive: Always mark media as sensitive
         setting_delete_modal: Show confirmation dialog before deleting a toot
-        setting_flavour: Flavour
+        setting_favourite_modal: Show confirmation dialog before favouriting
         setting_noindex: Opt-out of search engine indexing
         setting_reduce_motion: Reduce motion in animations
         setting_skin: Skin
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
new file mode 100644
index 000000000..7fa96992f
--- /dev/null
+++ b/config/locales/simple_form.gl.yml
@@ -0,0 +1,75 @@
+gl:
+  simple_form:
+    hints:
+      defaults:
+        avatar: PNG, GIF ou JPG. Como moito 2MB. Será reducida ate 120x120px
+        digest: Enviar despois de un período longo de inactividade con un resumo das
+          mencións que recibeu na súa ausencia
+        display_name:
+          one: <span class="name-counter">1</span> caracter restante
+          other: <span class="name-counter">%{count}</span> caracteres restantes
+        header: PNG, GIF ou JPG. Como moito 2MB. Será reducida a 700x335px
+        locked: Require que vostede aprove as seguidoras de xeito manual
+        note:
+          one: <span class="note-counter">1</span> caracter restante
+          other: <span class="note-counter">%{count}</span> caracteres restantes
+        setting_noindex: Afecta ao seu perfil público e páxinas de estado
+        setting_theme: Afecta ao aspecto de Mastodon en calquer dispositivo cando
+          está conectada.
+      imports:
+        data: Ficheiro CSV exportado desde outra instancia Mastodon
+      sessions:
+        otp: Introduza o código de Doble-Factor desde o seu teléfono ou utilice un
+          dos seus códigos de recuperación.
+      user:
+        filtered_languages: Os idiomas marcados filtraranse das liñas temporais públicas
+          para vostede
+    labels:
+      defaults:
+        avatar: Avatar
+        confirm_new_password: Confirme o novo contrasinal
+        confirm_password: Confirme o contrasinal
+        current_password: Contrasinal actual
+        data: Data
+        display_name: Nome mostrado
+        email: enderezo correo electrónico
+        expires_in: Caducidade despois de
+        filtered_languages: Idiomas filtrados
+        header: Cabezallo
+        locale: Idioma
+        locked: Protexer conta
+        max_uses: Número máximo de usos
+        new_password: Novo contrasinal
+        note: Sobre vostede
+        otp_attempt: Código de Doble-Factor
+        password: Contrasinal
+        setting_auto_play_gif: Reprodución automática de GIFs animados
+        setting_boost_modal: Pedir confirmación antes de promocionar
+        setting_default_privacy: Intimidade da publicación
+        setting_default_sensitive: Marcar sempre multimedia como sensible
+        setting_delete_modal: Solicitar confirmación antes de eliminar unha mensaxe
+        setting_noindex: Pedir non aparecer nas buscas dos motores de busca
+        setting_reduce_motion: Reducir o movemento nas animacións
+        setting_system_font_ui: Utilizar a tipografía por defecto do sistema
+        setting_theme: Decorado da instancia
+        setting_unfollow_modal: Solicitar confirmación antes de deixar de seguir alguén
+        severity: Severidade
+        type: Tipo de importación
+        username: Nome de usuaria
+      interactions:
+        must_be_follower: Bloquear as notificacións de non-seguidoras
+        must_be_following: Bloquea as notificacións de personas que non segue
+        must_be_following_dm: Bloquea as mensaxes directas de personas que non segue
+      notification_emails:
+        digest: Enviar correos con resumos
+        favourite: Enviar un correo cando alguén marca como favorita unha das súas
+          publicacións
+        follow: Enviar un correo cando alguén a segue
+        follow_request: Enviar un correo cando alguén solicita seguila
+        mention: Enviar un correo cando alguén a menciona
+        reblog: Enviar un correo cando alguén promociona a súa mensaxe
+    'no': Non
+    required:
+      mark: '*'
+      text: requerido
+    'yes': Si
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index bdeefa7e5..361a5ada6 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -3,20 +3,20 @@ ja:
   simple_form:
     hints:
       defaults:
-        avatar: 2MBまでのPNGやGIF、JPGが利用可能です。120x120pxまで縮小されます。
-        digest: 長期間ログインしなかった際、その期間に受け取った返信の要約を受け取ることができます。
+        avatar: 2MBまでのPNGやGIF、JPGが利用可能です。120x120pxまで縮小されます
+        digest: 長期間ログインしなかった際、その期間に受け取った返信の要約を受け取ることができます
         display_name: あと<span class="name-counter">%{count}</span>文字入力できます。
-        header: 2MBまでのPNGやGIF、JPGが利用可能です。 700x335pxまで縮小されます。
+        header: 2MBまでのPNGやGIF、JPGが利用可能です。 700x335pxまで縮小されます
         locked: フォロワーを手動で承認する必要があります
         note: あと<span class="note-counter">%{count}</span>文字入力できます。
         setting_noindex: 公開プロフィールおよび各投稿ページに影響します
         setting_theme: ログインしている全てのデバイスで適用されるデザインです。
       imports:
-        data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい。
+        data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい
       sessions:
         otp: 携帯電話に表示された2段階認証コードを入力するか、生成したリカバリーコードを使用してください。
       user:
-        filtered_languages: 選択した言語があなたの公開タイムラインから取り除かれます。
+        filtered_languages: 選択した言語があなたの公開タイムラインから取り除かれます
     labels:
       defaults:
         avatar: アイコン
@@ -41,6 +41,7 @@ ja:
         setting_default_privacy: 投稿の公開範囲
         setting_default_sensitive: メディアを常に閲覧注意としてマークする
         setting_delete_modal: トゥートを削除する前に確認ダイアログを表示する
+        setting_favourite_modal: お気に入りをする前に確認ダイアログを表示する
         setting_noindex: 検索エンジンによるインデックスを拒否する
         setting_reduce_motion: アニメーションの動きを減らす
         setting_system_font_ui: システムのデフォルトフォントを使う
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index f2847e7ca..17b9647a4 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -14,7 +14,7 @@ nl:
           one: <span class="note-counter">1</span> teken over
           other: <span class="note-counter">%{count}</span> tekens over
         setting_noindex: Heeft invloed op jouw openbare profiel en toots
-        setting_theme: Heeft invloed op hoe Mastodon eruitziet op elk apparaat waarmee je inlogt.
+        setting_theme: Heeft invloed op hoe de webapp van Mastodon eruitziet (op elk apparaat waarmee je inlogt).
       imports:
         data: CSV-bestand dat op een andere Mastodon-server werd geëxporteerd
       sessions:
@@ -48,22 +48,22 @@ nl:
         setting_noindex: Jouw toots niet door zoekmachines laten indexeren
         setting_reduce_motion: Langzamere animaties
         setting_system_font_ui: Standaardlettertype van jouw systeem gebruiken
-        setting_theme: Site thema
+        setting_theme: Thema website
         setting_unfollow_modal: Vraag voor het ontvolgen van iemand een bevestiging
-        severity: Strengheid
+        severity: Zwaarte
         type: Importtype
         username: gebruikersnaam
       interactions:
-        must_be_follower: Blokkeer meldingen van mensen die jou niet volgen
-        must_be_following: Blokkeer meldingen van mensen die jij niet volgt
-        must_be_following_dm: Blokkeer directe berichten van mensen die jij niet volgt
+        must_be_follower: Meldingen van mensen die jou niet volgen blokkeren
+        must_be_following: Meldingen van mensen die jij niet volgt blokkeren
+        must_be_following_dm: Directe berichten van mensen die jij niet volgt blokkeren
       notification_emails:
-        digest: Verstuur periodiek e-mails met een samenvatting
-        favourite: Verstuur een e-mail wanneer iemand jouw toot als favoriet markeert
-        follow: Verstuur een e-mail wanneer iemand jou volgt
-        follow_request: Verstuur een e-mail wanneer iemand jou wilt volgen
-        mention: Verstuur een e-mail wanneer iemand jou vermeld
-        reblog: Verstuur een e-mail wanneer iemand jouw toot heeft geboost
+        digest: Periodiek e-mails met een samenvatting versturen
+        favourite: Een e-mail versturen wanneer iemand jouw toot als favoriet markeert
+        follow: Een e-mail versturen wanneer iemand jou volgt
+        follow_request: Een e-mail versturen wanneer iemand jou wilt volgen
+        mention: Een e-mail versturen wanneer iemand jou vermeld
+        reblog: Een e-mail versturen wanneer iemand jouw toot heeft geboost
     'no': Nee
     required:
       mark: "*"
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index f178d1857..06c23ace2 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -4,6 +4,7 @@ oc:
     hints:
       defaults:
         avatar: PNG, GIF o JPG. Maximum 2 Mo. Serà retalhat en 120x120px
+        digest: Enviat aprèp un long moment d’inactivitat amb un resumit de las mencions qu’avètz recebudas pendent vòstra abséncia
         display_name:
           one: Demòra encara <span class="name-counter">1</span> caractèr
           other: Demòran encara <span class="name-counter">%{count}</span> caractèrs
@@ -29,10 +30,12 @@ oc:
         data: Data
         display_name: Escais
         email: Corrièl
+        expires_in: Expira aprèp
         filtered_languages: Lengas filtradas
         header: Bandièra
         locale: Lenga
         locked: Far venir lo compte privat
+        max_uses: Limit d’utilizacion
         new_password: Nòu senhal
         note: Bio
         otp_attempt: Còdi Two-factor
@@ -44,7 +47,7 @@ oc:
         setting_delete_modal: Afichar una fenèstra de confirmacion abans de suprimir un estatut
         setting_noindex: Èsser pas indexat pels motors de recèrca
         setting_reduce_motion: Reduire la velocitat de las animacions
-        setting_system_font_ui: Utilizar la policia Font del sisèma
+        setting_system_font_ui: Utilizar la polissa del sisèma
         setting_theme: Tèma del site
         setting_unfollow_modal: Afichar una confirmacion abans de quitar de sègre qualqu’un
         severity: Severitat
@@ -53,6 +56,7 @@ oc:
       interactions:
         must_be_follower: Blocar las notificacions del mond que vos sègon pas
         must_be_following: Blocar las notificacions del mond que seguètz pas
+        must_be_following_dm: Blocar los messatges del monde que seguètz pas
       notification_emails:
         digest: Enviar un corrièl recapitulatiu
         favourite: Enviar un corrièl quand qualqu’un plaça vòstre estatut en favorit
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index b1888f4e3..1f2fa173d 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -16,7 +16,7 @@ zh-CN:
       sessions:
         otp: 输入你手机上生成的双重认证码,或者任意一个恢复代码。
       user:
-        filtered_languages: 勾选语言的嘟文将不会出现在你的公共时间轴上
+        filtered_languages: 被勾选语言的嘟文将不会出现在你的公共时间轴上
     labels:
       defaults:
         avatar: 头像
@@ -50,16 +50,16 @@ zh-CN:
         type: 导入数据类型
         username: 用户名
       interactions:
-        must_be_follower: 屏蔽来自未关注你的用户的通知
-        must_be_following: 屏蔽来自你未关注的用户的通知
-        must_be_following_dm: 屏蔽来自你未关注的用户的私信
+        must_be_follower: 屏蔽来自未关注我的用户的通知
+        must_be_following: 屏蔽来自我未关注的用户的通知
+        must_be_following_dm: 屏蔽来自我未关注的用户的私信
       notification_emails:
         digest: 发送摘要邮件
-        favourite: 当有用户收藏了你的嘟文时,发送电子邮件提醒我
-        follow: 当有用户关注你时,发送电子邮件提醒我
-        follow_request: 当有用户向你发送关注请求时,发送电子邮件提醒我
-        mention: 当有用户在嘟文中提及你时,发送电子邮件提醒我
-        reblog: 当有用户转嘟了你的嘟文时,发送电子邮件提醒我
+        favourite: 当有用户收藏了我的嘟文时,发送电子邮件提醒我
+        follow: 当有用户关注我时,发送电子邮件提醒我
+        follow_request: 当有用户向我发送关注请求时,发送电子邮件提醒我
+        mention: 当有用户在嘟文中提及我时,发送电子邮件提醒我
+        reblog: 当有用户转嘟了我的嘟文时,发送电子邮件提醒我
     'no': 否
     required:
       mark: "*"
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index cd087c3e8..e1909ac71 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -49,7 +49,7 @@ zh-CN:
     reserved_username: 此用户名已被保留
     roles:
       admin: 管理员
-      moderator: 协管
+      moderator: 监察员
     unfollow: 取消关注
   admin:
     account_moderation_notes:
@@ -115,7 +115,8 @@ zh-CN:
       role: 用户组
       roles:
         admin: 管理员
-        moderator: 协管
+        moderator: 监察员
+        staff: 管理人员
         user: 普通用户
       salmon_url: Salmon URL
       search: 搜索
@@ -148,7 +149,7 @@ zh-CN:
         disable_user: "%{name} 将用户 %{target} 设置为禁止登录"
         enable_custom_emoji: "%{name} 启用了自定义表情 %{target}"
         enable_user: "%{name} 将用户 %{target} 设置为允许登录"
-        memorialize_account: "%{name} 将 %{target} 的帐户设置为追悼帐户"
+        memorialize_account: "%{name} 将 %{target} 设置为追悼帐户"
         promote_user: "%{name} 对用户 %{target} 进行了升任操作"
         reset_password_user: "%{name} 重置了用户 %{target} 的密码"
         resolve_report: "%{name} 处理了举报 %{target}"
@@ -160,6 +161,7 @@ zh-CN:
         update_status: "%{name} 刷新了 %{target} 的嘟文"
       title: 运营日志
     custom_emojis:
+      by_domain: 域名
       copied_msg: 成功将表情复制到本地
       copy: 复制
       copy_failed_msg: 无法将表情复制到本地
@@ -265,12 +267,12 @@ zh-CN:
         desc_html: 用半角逗号分隔多个用户名。只能添加来自本站且未开启保护的帐户。如果留空,则默认关注本站所有的管理员。
         title: 新用户默认关注
       contact_information:
-        email: 输入一个公开的电子邮件地址
-        username: 输入用户名
+        email: 用于联系的公开电子邮件地址
+        username: 用于联系的公开用户名
       registrations:
         closed_message:
           desc_html: 本站关闭注册期间的提示信息。可以使用 HTML 标签
-          title: 关闭注册时的提示消息
+          title: 关闭注册时的提示信息
         deletion:
           desc_html: 允许所有人删除自己的帐户
           title: 开放删除帐户权限
@@ -278,13 +280,13 @@ zh-CN:
           disabled: 没有人
           title: 允许发送邀请的用户组
         open:
-          desc_html: 允许任何人建立一个帐户
+          desc_html: 允许所有人建立帐户
           title: 开放注册
       show_staff_badge:
-        desc_html: 在个人资料页上显示管理员标志
-        title: 显示管理员标志
+        desc_html: 在个人资料页上显示管理人员标志
+        title: 显示管理人员标志
       site_description:
-        desc_html: 展示在首页以及 meta 标签中的网站简介。可以使用 HTML 标签,包括 <code>&lt;a&gt;</code> 和 <code>&lt;em&gt;</code>。
+        desc_html: 用于首页展示以及 meta 标签中的网站简介。可以使用 HTML 标签,包括 <code>&lt;a&gt;</code> 和 <code>&lt;em&gt;</code>。
         title: 本站简介
       site_description_extended:
         desc_html: 可以填写行为守则、规定、指南或其他本站特有的内容。可以使用 HTML 标签
@@ -297,8 +299,8 @@ zh-CN:
         desc_html: 用于在 OpenGraph 和 API 中显示预览图。推荐分辨率 1200×630px
         title: 本站缩略图
       timeline_preview:
-        desc_html: 在主页显示公开时间线
-        title: 时间线预览
+        desc_html: 在主页显示公共时间轴
+        title: 时间轴预览
       title: 网站设置
     statuses:
       back_to_account: 返回帐户信息页
@@ -325,13 +327,13 @@ zh-CN:
     title: 管理
   admin_mailer:
     new_report:
-      body: "%{reporter} 举报了 %{target}"
-      subject: 来自 %{instance} 的新举报(#%{id})
+      body: "%{reporter} 举报了用户 %{target}。"
+      subject: 来自 %{instance} 的用户举报(#%{id})
   application_mailer:
-    salutation: "%{name},"
-    settings: 更改电子邮件首选项:%{link}
-    signature: 来自 %{instance} 的 Mastodon 通知
-    view: 查看:
+    salutation: "%{name}:"
+    settings: 使用此链接更改你的电子邮件首选项:%{link}
+    signature: 这是一封来自 %{instance} 的 Mastodon 电子邮件通知。
+    view: 点此链接查看详情:
   applications:
     created: 应用创建成功
     destroyed: 应用删除成功
@@ -341,7 +343,7 @@ zh-CN:
     warning: 一定小心,千万不要把它分享给任何人!
     your_token: 你的访问令牌
   auth:
-    agreement_html: 注册即表示你同意<a href="%{rules_path}">我们的使用条款</a>和<a href="%{terms_path}">隐私权政策</a>。
+    agreement_html: 注册即表示你同意遵守<a href="%{rules_path}">本实例的相关规定</a>和<a href="%{terms_path}">我们的使用条款</a>。
     change_password: 帐户安全
     delete_account: 删除帐户
     delete_account_html: 如果你想删除你的帐户,请<a href="%{path}">点击这里继续</a>。你需要确认你的操作。
@@ -351,7 +353,7 @@ zh-CN:
     login: 登录
     logout: 登出
     migrate_account: 迁移到另一个帐户
-    migrate_account_html: 如果你希望引导其他人关注另一个帐户,请<a href="%{path}">点击这里设置</a>。
+    migrate_account_html: 如果你希望引导他人关注另一个帐户,请<a href="%{path}">点击这里进行设置</a>。
     register: 注册
     resend_confirmation: 重新发送确认邮件
     reset_password: 重置密码
@@ -368,38 +370,38 @@ zh-CN:
     title: 关注 %{acct}
   datetime:
     distance_in_words:
-      about_x_hours: "%{count} 时"
-      about_x_months: "%{count} 个月"
-      about_x_years: "%{count} 年"
-      almost_x_years: "%{count} 年"
+      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_minutes: "%{count}分"
       less_than_x_seconds: 刚刚
-      over_x_years: "%{count} 年"
-      x_days: "%{count} 天"
-      x_minutes: "%{count} 分"
-      x_months: "%{count} 个月"
-      x_seconds: "%{count} 秒"
+      over_x_years: "%{count}年"
+      x_days: "%{count}天"
+      x_minutes: "%{count}分"
+      x_months: "%{count}个月"
+      x_seconds: "%{count}秒"
   deletes:
     bad_password_msg: 想得美,黑客!密码输入错误
     confirm_password: 输入你当前的密码来验证身份
-    description_html: 继续操作将会<strong>永久地、不可撤销地</strong>删除你帐户中的内容,并冻结你的帐户。你的用户名将会被保留,以防有人冒用你的身份。
+    description_html: 继续操作将会<strong>永久地、不可撤销地</strong>删除帐户中的所有内容,然后冻结帐户。你的用户名将会被保留,以防有人冒用你的身份。
     proceed: 删除帐户
     success_msg: 你的帐户已经成功删除
-    warning_html: 我们只能保证本实例上的内容将会被彻底删除。对于已经被广泛传播的内容,它们在本实例以外的某些地方可能仍然可见。此外,失去连接的服务器以及停止接收订阅的服务器上的数据亦无法删除。
+    warning_html: 我们只能保证本实例上的内容将会被彻底删除。对于已经被广泛传播的内容,它们在本实例以外的某些地方可能仍然可见。此外,失去连接的服务器以及停止接收订阅的服务器所存储的数据亦无法删除。
     warning_title: 关于已传播的内容的警告
   errors:
-    '403': 无权查看
-    '404': 找不到页面
-    '410': 内容已被删除
+    '403': 你没有访问这个页面的权限。
+    '404': 无法找到你所要访问的页面。
+    '410': 你所要访问的页面已被删除。
     '422':
       content: 无法确认登录信息。你是不是屏蔽了 Cookie?
       title: 无法确认登录信息
-    '429': 被限制
+    '429': 请求被限制
     '500':
-      content: 抱歉,我们这里出错了。
-      title: 这个页面不正确
-    noscript_html: 请启用 JavaScript 以便使用 Mastodon 网页版应用。你也可以选择适用于你的平台的 <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">Mastodon 应用</a>。
+      content: 抱歉,我们的后台出错了。
+      title: 这个页面有问题
+    noscript_html: 使用 Mastodon 网页版应用需要启用 JavaScript。你也可以选择适用于你的平台的 <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">Mastodon 应用</a>。
   exports:
     blocks: 屏蔽的用户
     csv: CSV
@@ -408,13 +410,13 @@ zh-CN:
     storage: 媒体文件存储
   followers:
     domain: 域名
-    explanation_html: 为保证你的嘟文的隐私安全,你应当时刻留意你的关注者列表。<strong>受保护的嘟文将会发送到所有关注者所在的实例上</strong>。有些实例使用的软件代码或其管理员可能不会尊重你的隐私设置,因此你应当复查一下关注者列表,并移除那些你无法信任的关注者。
+    explanation_html: 为保证你的嘟文的隐私安全,你应当经常检查你的关注者列表。<strong>受保护的嘟文将会发送到所有关注者所在的实例上</strong>。有些实例使用的软件代码或其管理员可能不会尊重你的隐私设置,因此你应当复查一下关注者列表,并移除那些你无法信任的关注者。
     followers_count: 关注者数量
     lock_link: 为你的帐户开启保护
     purge: 从关注者中移除
     success: 正在从 %{count} 个域名中移除关注者……
     true_privacy_html: 请始终铭记:<strong>真正的隐私只能靠端到端加密来实现</strong>!
-    unlocked_warning_html: 任何人都可以通过关注你来立即查看被保护的嘟文。%{lock_link},即可审核并拒绝关注请求。
+    unlocked_warning_html: 任何人都可以在关注你后立即查看非公开的嘟文。只要%{lock_link},你就可以审核并拒绝关注请求。
     unlocked_warning_title: 你的帐户未受到保护
   generic:
     changes_saved_msg: 更改保存成功!
@@ -445,13 +447,16 @@ zh-CN:
     generate: 生成邀请链接
     max_uses: "%{count} 次"
     max_uses_prompt: 无限制
-    prompt: 生成可供分享的链接以便邀请他人在本实例注册
+    prompt: 生成分享链接,邀请他人在本实例注册
     table:
       expires_at: 失效时间
       uses: 已使用次数
     title: 邀请用户
   landing_strip_html: "<strong>%{name}</strong> 是一位来自 %{link_to_root_path} 的用户。如果你想关注他们或者与他们互动,你需要在任意一个 Mastodon 实例或与其兼容的网站上拥有一个帐户。"
   landing_strip_signup_html: 还没有这种帐户?你可以<a href="%{sign_up_path}">在本站注册一个</a>。
+  lists:
+    errors:
+      limit: 你所建立的列表数量已经达到上限
   media_attachments:
     validations:
       images_and_video: 无法在嘟文中同时插入视频和图片
@@ -478,8 +483,8 @@ zh-CN:
       body: "%{name} 关注了你!"
       subject: "%{name} 关注了你"
     follow_request:
-      body: "%{name} 请求关注你"
-      subject: 待审核的关注者:%{name}
+      body: "%{name} 向你发送了关注请求!"
+      subject: 来自 %{name} 的关注请求
     mention:
       body: "%{name} 在嘟文中提到了你:"
       subject: "%{name} 提到了你"
@@ -583,11 +588,12 @@ zh-CN:
     open_in_web: 在站内打开
     over_character_limit: 超过了 %{max} 字的限制
     pin_errors:
-      limit: 置顶的嘟文条数超出限制
+      limit: 你所置顶的嘟文数量已经达到上限
       ownership: 不能置顶他人的嘟文
       private: 不能置顶非公开的嘟文
       reblog: 不能置顶转嘟
     show_more: 显示更多
+    title: "%{name}:“%{quote}”"
     visibilities:
       private: 仅关注者
       private_long: 只有关注你的用户能看到
@@ -674,7 +680,7 @@ zh-CN:
     formats:
       default: "%Y年%-m月%d日 %H:%M"
   two_factor_authentication:
-    code_hint: 输入你的认证器生成的代码以确认
+    code_hint: 输入认证器生成的代码以确认操作
     description_html: 启用<strong>双重认证</strong>后,你需要输入手机认证器生成的代码才能登录
     disable: 停用
     enable: 启用
@@ -688,7 +694,7 @@ zh-CN:
     recovery_codes_regenerated: 恢复代码重新生成成功
     recovery_instructions_html: 如果你的手机无法使用,你可以使用下列任意一个恢复代码来重新获得对帐户的访问权。<strong>请妥善保管好你的恢复代码</strong>(例如,你可以将它们打印出来,然后和其他重要的文件放在一起)。
     setup: 设置
-    wrong_code: 输入的认证码无效!请检查你设备上显示的时间是否正确,如果正确,你可能需要联系管理员以检查服务器的时间是否正确。
+    wrong_code: 输入的认证码无效!请核对一下你的设备显示的时间,如果正确,你可能需要联系一下实例的管理员,让他们校准服务器的时间。
   users:
     invalid_email: 输入的电子邮件地址无效
     invalid_otp_token: 输入的双重认证代码无效
diff --git a/config/navigation.rb b/config/navigation.rb
index 3f4c00dfa..b08b1769d 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -17,6 +17,12 @@ SimpleNavigation::Configuration.run do |navigation|
       settings.item :follower_domains, safe_join([fa_icon('users fw'), t('settings.followers')]), settings_follower_domains_url
     end
 
+    primary.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_url do |flavours|
+      Themes.instance.flavours.each do |flavour|
+        flavours.item flavour.to_sym, safe_join([fa_icon('star fw'), t("flavours.#{flavour}.name", default: flavour)]), settings_flavour_url(flavour)
+      end
+    end
+
     primary.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: proc { Setting.min_invite_role == 'user' }
 
     primary.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_url do |development|
diff --git a/config/routes.rb b/config/routes.rb
index a41e76c2c..5b0ee9324 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -102,6 +102,8 @@ Rails.application.routes.draw do
       end
     end
 
+    resources :flavours, only: [:index, :show, :update], param: :flavour
+
     resource :delete, only: [:show, :destroy]
     resource :migration, only: [:show, :update]
 
@@ -240,7 +242,7 @@ Rails.application.routes.draw do
       resources :media,      only: [:create, :update]
       resources :blocks,     only: [:index]
       resources :mutes,      only: [:index] do
-        collection do 
+        collection do
           get 'details'
         end
       end
@@ -282,6 +284,7 @@ Rails.application.routes.draw do
         resources :statuses, only: :index, controller: 'accounts/statuses'
         resources :followers, only: :index, controller: 'accounts/follower_accounts'
         resources :following, only: :index, controller: 'accounts/following_accounts'
+        resources :lists, only: :index, controller: 'accounts/lists'
 
         member do
           post :follow
diff --git a/config/settings.yml b/config/settings.yml
index 5aad45da2..dbc5f6a26 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -22,6 +22,7 @@ defaults: &defaults
   default_sensitive: false
   unfollow_modal: false
   boost_modal: false
+  favourite_modal: false
   delete_modal: true
   auto_play_gif: false
   reduce_motion: false
diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js
index 9cdd6f934..a38d9d11d 100644
--- a/config/webpack/configuration.js
+++ b/config/webpack/configuration.js
@@ -30,6 +30,9 @@ for (let i = 0; i < flavourFiles.length; i++) {
   if (!data.pack_directory) {
     data.pack_directory = dirname(flavourFile);
   }
+  if (data.locales) {
+    data.locales = join(dirname(flavourFile), data.locales);
+  }
   if (data.pack && typeof data.pack === 'object') {
     flavours[data.name] = data;
   }
@@ -45,9 +48,9 @@ for (let i = 0; i < skinFiles.length; i++) {
   const data = flavours[name].skin;
   if (lstatSync(skinFile).isDirectory()) {
     data[skin] = {};
-    const skinPacks = glob.sync(resolve(skinFile, '*.{css,scss}'));
+    const skinPacks = glob.sync(join(skinFile, '*.{css,scss}'));
     for (let j = 0; j < skinPacks.length; j++) {
-      const pack = skinPacks[i];
+      const pack = skinPacks[j];
       data[skin][basename(pack, extname(pack))] = pack;
     }
   } else if ((skin = skin.match(/^(.*)\.s?css$/i))) {
diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js
index a943589f7..09fba4a18 100644
--- a/config/webpack/generateLocalePacks.js
+++ b/config/webpack/generateLocalePacks.js
@@ -1,70 +1,66 @@
+// A message from upstream:
+// ========================
 // To avoid adding a lot of boilerplate, locale packs are
 // automatically generated here. These are written into the tmp/
 // directory and then used to generate locale_en.js, locale_fr.js, etc.
 
-const fs = require('fs');
-const path = require('path');
+// Glitch note:
+// ============
+// This code has been entirely rewritten to support glitch flavours.
+// However, the underlying process is exactly the same.
+
+const { existsSync, readdirSync, writeFileSync } = require('fs');
+const { join, resolve } = require('path');
 const rimraf = require('rimraf');
 const mkdirp = require('mkdirp');
+const { flavours } = require('./configuration.js');
 
-const localesJsonPath = path.join(__dirname, '../../app/javascript/mastodon/locales');
-const locales = fs.readdirSync(localesJsonPath).filter(filename => {
-  return /\.json$/.test(filename) &&
-    !/defaultMessages/.test(filename) &&
-    !/whitelist/.test(filename);
-}).map(filename => filename.replace(/\.json$/, ''));
-
-const outPath = path.join(__dirname, '../../tmp/packs');
-
-rimraf.sync(outPath);
-mkdirp.sync(outPath);
-
-const outPaths = [];
-
-locales.forEach(locale => {
-  const localePath = path.join(outPath, `locale_${locale}.js`);
-  const baseLocale = locale.split('-')[0]; // e.g. 'zh-TW' -> 'zh'
-  const localeDataPath = [
-    // first try react-intl
-    `../../node_modules/react-intl/locale-data/${baseLocale}.js`,
-    // then check locales/locale-data
-    `../../app/javascript/mastodon/locales/locale-data/${baseLocale}.js`,
-    // fall back to English (this is what react-intl does anyway)
-    '../../node_modules/react-intl/locale-data/en.js',
-  ].filter(filename => fs.existsSync(path.join(outPath, filename)))
-    .map(filename => filename.replace(/..\/..\/node_modules\//, ''))[0];
-
-  let glitchInject = `
-const mergedMessages = messages;
-`;
-
-  const glitchPath = `../../app/javascript/glitch/locales/${locale}.json`;
-  if (fs.existsSync(path.join(outPath, glitchPath))) {
-    glitchInject = `
-import glitchMessages from ${JSON.stringify(glitchPath)};
-
-let mergedMessages = messages;
-Object.keys(glitchMessages).forEach(function (key) {
-   mergedMessages[key] = glitchMessages[key];
-});
-
-`;
+module.exports = Object.keys(flavours).reduce(function (map, entry) {
+  const flavour = flavours[entry];
+  if (!flavour.locales) {
+    return map;
   }
+  const locales = readdirSync(flavour.locales).filter(
+    filename => /\.js(?:on)?$/.test(filename) && !/defaultMessages|whitelist|index/.test(filename)
+  );
+  const outPath = resolve('tmp', 'locales', entry);
+
+  rimraf.sync(outPath);
+  mkdirp.sync(outPath);
 
-  const localeContent = `//
-// locale_${locale}.js
+  locales.forEach(function (locale) {
+    const localeName = locale.replace(/\.js(?:on)?$/, '');
+    const localePath = join(outPath, `${localeName}.js`);
+    const baseLocale = localeName.split('-')[0]; // e.g. 'zh-TW' -> 'zh'
+    const localeDataPath = [
+      // first try react-intl
+      `node_modules/react-intl/locale-data/${baseLocale}.js`,
+      // then check locales/locale-data
+      `app/javascript/locales/locale-data/${baseLocale}.js`,
+      // fall back to English (this is what react-intl does anyway)
+      'node_modules/react-intl/locale-data/en.js',
+    ].filter(
+      filename => existsSync(filename)
+    ).map(
+      filename => filename.replace(/(?:node_modules|app\/javascript)\//, '')
+    )[0];
+    const localeContent = `//
+// locales/${entry}/${localeName}.js
 // automatically generated by generateLocalePacks.js
 //
-import messages from '../../app/javascript/mastodon/locales/${locale}.json';
-import localeData from ${JSON.stringify(localeDataPath)};
-import { setLocale } from 'locales';
-${glitchInject}
-setLocale({messages: mergedMessages, localeData: localeData});
-`;
-  fs.writeFileSync(localePath, localeContent, 'utf8');
-  outPaths.push(localePath);
-});
 
-module.exports = outPaths;
+import messages from '../../../${flavour.locales}/${locale.replace(/\.js$/, '')}';
+import localeData from '${localeDataPath}';
+import { setLocale } from 'locales';
 
+setLocale({
+  localeData,
+  messages,
+});
+`;
+    writeFileSync(localePath, localeContent, 'utf8');
+    map[`locales/${entry}/${localeName}`] = localePath;
+  });
 
+  return map;
+}, {});
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index e4b057ffb..35b9bbd1c 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -1,13 +1,12 @@
 // Note: You must restart bin/webpack-dev-server for changes to take effect
 
 const webpack = require('webpack');
-const { basename, join, resolve } = require('path');
+const { join, resolve } = require('path');
 const { sync } = require('glob');
 const ExtractTextPlugin = require('extract-text-webpack-plugin');
 const ManifestPlugin = require('webpack-manifest-plugin');
-const extname = require('path-complete-extname');
 const { env, settings, core, flavours, output, loadersDir } = require('./configuration.js');
-const localePackPaths = require('./generateLocalePacks');
+const localePacks = require('./generateLocalePacks');
 
 function reducePacks (data, into = {}) {
   if (!data.pack) {
@@ -48,11 +47,7 @@ function reducePacks (data, into = {}) {
 module.exports = {
   entry: Object.assign(
     { locales: resolve('app', 'javascript', 'locales') },
-    localePackPaths.reduce((map, entry) => {
-      const localMap = map;
-      localMap[basename(entry, extname(entry, extname(entry)))] = resolve(entry);
-      return localMap;
-    }, {}),
+    localePacks,
     reducePacks(core),
     Object.keys(flavours).reduce((map, entry) => reducePacks(flavours[entry], map), {})
   ),