about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/application.rb6
-rw-r--r--config/environments/production.rb13
-rw-r--r--config/i18n-tasks.yml1
-rw-r--r--config/initializers/assets.rb2
-rw-r--r--config/initializers/locale.rb6
-rw-r--r--config/initializers/premailer_rails.rb6
-rw-r--r--config/initializers/rack_attack.rb2
-rw-r--r--config/initializers/suppress_csrf_warnings.rb3
-rw-r--r--config/locales/activerecord.gl.yml13
-rw-r--r--config/locales/activerecord.pt.yml13
-rw-r--r--config/locales/ar.yml137
-rw-r--r--config/locales/ca.yml8
-rw-r--r--config/locales/devise.ar.yml10
-rw-r--r--config/locales/devise.en.yml17
-rw-r--r--config/locales/devise.gl.yml61
-rw-r--r--config/locales/devise.zh-CN.yml29
-rw-r--r--config/locales/doorkeeper.gl.yml86
-rw-r--r--config/locales/doorkeeper.nl.yml8
-rw-r--r--config/locales/doorkeeper.pt.yml42
-rw-r--r--config/locales/en.yml33
-rw-r--r--config/locales/es.yml2
-rw-r--r--config/locales/fa.yml117
-rw-r--r--config/locales/fr.yml2
-rw-r--r--config/locales/gl.yml710
-rw-r--r--config/locales/ja.yml13
-rw-r--r--config/locales/ko.yml66
-rw-r--r--config/locales/nl.yml4
-rw-r--r--config/locales/pl.yml18
-rw-r--r--config/locales/pt-BR.yml35
-rw-r--r--config/locales/pt.yml435
-rw-r--r--config/locales/ru.yml147
-rw-r--r--config/locales/simple_form.ar.yml13
-rw-r--r--config/locales/simple_form.en.yml7
-rw-r--r--config/locales/simple_form.fa.yml8
-rw-r--r--config/locales/simple_form.gl.yml18
-rw-r--r--config/locales/simple_form.ja.yml1
-rw-r--r--config/locales/simple_form.pl.yml5
-rw-r--r--config/locales/simple_form.pt.yml6
-rw-r--r--config/locales/simple_form.zh-CN.yml2
-rw-r--r--config/locales/zh-CN.yml24
-rw-r--r--config/navigation.rb7
-rw-r--r--config/routes.rb22
-rw-r--r--config/settings.yml8
-rw-r--r--config/sidekiq.yml3
-rw-r--r--config/themes.yml2
-rw-r--r--config/webpack/configuration.js57
-rw-r--r--config/webpack/generateLocalePacks.js94
-rw-r--r--config/webpack/loaders/babel.js3
-rw-r--r--config/webpack/loaders/sass.js2
-rw-r--r--config/webpack/shared.js84
-rw-r--r--config/webpacker.yml12
51 files changed, 2145 insertions, 278 deletions
diff --git a/config/application.rb b/config/application.rb
index dc488ea8a..c1bf3cef2 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -9,6 +9,7 @@ Bundler.require(*Rails.groups)
 require_relative '../app/lib/exceptions'
 require_relative '../lib/paperclip/gif_transcoder'
 require_relative '../lib/paperclip/video_transcoder'
+require_relative '../lib/paperclip/audio_transcoder'
 require_relative '../lib/mastodon/snowflake'
 require_relative '../lib/mastodon/version'
 
@@ -74,12 +75,17 @@ module Mastodon
 
     config.active_job.queue_adapter = :sidekiq
 
+    #config.middleware.insert_before 0, Rack::Cors, debug: true, logger: (-> { Rails.logger }) do
     config.middleware.insert_before 0, Rack::Cors do
       allow do
         origins  '*'
         resource '/@:username',  headers: :any, methods: [:get], credentials: false
         resource '/api/*',       headers: :any, methods: [:post, :put, :delete, :get, :patch, :options], credentials: false, expose: ['Link', 'X-RateLimit-Reset', 'X-RateLimit-Limit', 'X-RateLimit-Remaining', 'X-Request-Id']
         resource '/oauth/token', headers: :any, methods: [:post], credentials: false
+        resource '/assets/*', headers: :any, methods: [:get, :head, :options]
+        resource '/stylesheets/*', headers: :any, methods: [:get, :head, :options]
+        resource '/javascripts/*', headers: :any, methods: [:get, :head, :options]
+        resource '/packs/*', headers: :any, methods: [:get, :head, :options]
       end
     end
 
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 5705ffcfe..a691ef873 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -91,9 +91,14 @@ Rails.application.configure do
   config.action_mailer.delivery_method = ENV.fetch('SMTP_DELIVERY_METHOD', 'smtp').to_sym
 
   config.action_dispatch.default_headers = {
-    'Server'                 => 'Mastodon',
-    'X-Frame-Options'        => 'DENY',
-    'X-Content-Type-Options' => 'nosniff',
-    'X-XSS-Protection'       => '1; mode=block',
+    'Server'                  => 'Mastodon',
+    'X-Frame-Options'         => 'DENY',
+    'X-Content-Type-Options'  => 'nosniff',
+    'X-XSS-Protection'        => '1; mode=block',
+    'Content-Security-Policy' => "frame-ancestors 'none'; object-src 'none'; script-src 'self' https://dev-static.glitch.social ; base-uri 'none';" , 
+    'Referrer-Policy'         => 'no-referrer, strict-origin-when-cross-origin',
+    'Strict-Transport-Security' => 'max-age=63072000; includeSubDomains; preload',
+    'X-Clacks-Overhead' => 'GNU Natalie Nguyen'
+
   }
 end
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index 014055804..9e1b620f5 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -61,3 +61,4 @@ ignore_unused:
   - 'errors.429'
   - 'admin.accounts.roles.*'
   - 'admin.action_logs.actions.*'
+  - 'themes.default'
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
index f2bf17364..53b39718d 100644
--- a/config/initializers/assets.rb
+++ b/config/initializers/assets.rb
@@ -8,6 +8,6 @@ Rails.application.config.assets.version = '1.0'
 
 # Precompile additional assets.
 # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
-# Rails.application.config.assets.precompile += %w(application_public.js custom.css)
+# Rails.application.config.assets.precompile += %w()
 
 Rails.application.config.assets.initialize_on_precompile = true
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/premailer_rails.rb b/config/initializers/premailer_rails.rb
new file mode 100644
index 000000000..31c02dffa
--- /dev/null
+++ b/config/initializers/premailer_rails.rb
@@ -0,0 +1,6 @@
+require_relative '../../lib/mastodon/premailer_webpack_strategy'
+
+Premailer::Rails.config.merge!(remove_ids: true,
+                               adapter: :nokogiri,
+                               generate_text_part: false,
+                               strategies: [PremailerWebpackStrategy])
diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index b38fb302b..b35452f04 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -53,7 +53,7 @@ class Rack::Attack
     req.ip if req.api_request?
   end
 
-  throttle('protected_paths', limit: 5, period: 5.minutes) do |req|
+  throttle('protected_paths', limit: 25, period: 5.minutes) do |req|
     req.ip if req.post? && req.path =~ PROTECTED_PATHS_REGEX
   end
 
diff --git a/config/initializers/suppress_csrf_warnings.rb b/config/initializers/suppress_csrf_warnings.rb
new file mode 100644
index 000000000..410ab585b
--- /dev/null
+++ b/config/initializers/suppress_csrf_warnings.rb
@@ -0,0 +1,3 @@
+# frozen_string_literal: true
+
+ActionController::Base.log_warning_on_csrf_failure = false
diff --git a/config/locales/activerecord.gl.yml b/config/locales/activerecord.gl.yml
new file mode 100644
index 000000000..e38131454
--- /dev/null
+++ b/config/locales/activerecord.gl.yml
@@ -0,0 +1,13 @@
+---
+gl:
+  activerecord:
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: só letras, números e liñas baixas
+        status:
+          attributes:
+            reblog:
+              taken: do estado xa existe
diff --git a/config/locales/activerecord.pt.yml b/config/locales/activerecord.pt.yml
new file mode 100644
index 000000000..556fcfc4f
--- /dev/null
+++ b/config/locales/activerecord.pt.yml
@@ -0,0 +1,13 @@
+---
+pt:
+  activerecord:
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: apenas letras, números e underscores
+        status:
+          attributes:
+            reblog:
+              taken: do status já existe
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 6dc8bc1bb..82e8e998a 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -5,13 +5,17 @@ ar:
     about_this: عن مثيل الخادوم هذا
     closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا.
     contact: للتواصل معنا
+    contact_missing: غير محدد
     contact_unavailable: غير متوفر
     description_headline: ما هو %{domain}?
     domain_count_after: خوادم أخرى
     domain_count_before: متصل بـ
     features:
+      humane_approach_title: أسلوب يعيد الإعتبار للإنسان
       not_a_product_title: إنك إنسان و لست سلعة
+      real_conversation_title: مبني لتحقيق تواصل حقيقي
     find_another_instance: إبحث عن مثيل خادوم آخر
+    generic_description: "%{domain} هو سيرفر من بين سيرفرات الشبكة"
     hosted_on: ماستدون مُستضاف على %{domain}
     learn_more: تعلم المزيد
     other_instances: خوادم أخرى
@@ -35,15 +39,21 @@ ar:
     reserved_username: إسم المستخدم محجوز
     roles:
       admin: المدير
+      moderator: مُشرِف
     unfollow: إلغاء المتابعة
   admin:
     account_moderation_notes:
+      account: مُشرِف
       created_at: التاريخ
       delete: حذف
     accounts:
       are_you_sure: متأكد ؟
       by_domain: النطاق
       confirm: تأكيد
+      confirmed: مؤكَّد
+      disable: تعطيل
+      disable_two_factor_authentication: تعطيل 2FA
+      disabled: معطَّل
       display_name: عرض الإسم
       domain: النطاق
       edit: تعديل
@@ -53,13 +63,23 @@ ar:
       followers: المتابِعون
       follows: يتابع
       ip: عنوان الإيبي
+      location:
+        all: الكل
+        title: الموقع
       media_attachments: الوسائط المرفقة
+      moderation:
+        all: الكل
+      most_recent_ip: أحدث عنوان إيبي
       order:
+        most_recent: الأحدث
         title: الترتيب
       profile_url: رابط الملف الشخصي
+      protocol: البروتوكول
       role: التصريحات
       roles:
         admin: مدير
+        moderator: مشرف
+        staff: الفريق
         user: مستخدِم
       search: البحث
       statuses: المنشورات
@@ -113,13 +133,18 @@ ar:
         delete: حذف
       media:
         title: الوسائط
+    subscriptions:
+      confirmed: مؤكَّد
+      topic: الموضوع
     title: الإدارة
   application_mailer:
-    salutation: "%{name},"
+    salutation: "%{name}،"
     settings: 'تغيير تفضيلات البريد الإلكتروني : %{link}'
     signature: إشعارات ماستدون من %{instance}
     view: 'View:'
   applications:
+    created: تم إنشاء التطبيق بنجاح
+    destroyed: تم حذف التطبيق بنجاح
     invalid_url: إن الرابط المقدم غير صالح
   auth:
     change_password: الهوية
@@ -134,8 +159,11 @@ ar:
     reset_password: إعادة تعيين كلمة المرور
     set_new_password: تعيين كلمة مرور جديدة
   authorize_follow:
-    error: Unfortunately, there was an error looking up the remote account
+    error: يا للأسف، وقع هناك خطأ إثر عملية البحث عن الحساب عن بعد
     follow: إتبع
+    follow_request: 'لقد قمت بإرسال طلب متابعة إلى :'
+    post_follow:
+      web: واصل إلى الويب
     title: إتباع %{acct}
   datetime:
     distance_in_words:
@@ -153,8 +181,15 @@ ar:
       x_seconds: "%{count}ث"
   deletes:
     bad_password_msg: محاولة جيدة يا هاكرز ! كلمة السر خاطئة
+    confirm_password: قم بإدخال كلمتك السرية الحالية للتحقق من هويتك
     proceed: حذف حساب
     success_msg: تم حذف حسابك بنجاح
+  errors:
+    '403': ليس لك الصلاحيات الكافية لعرض هذه الصفحة.
+    '404': إنّ الصفحة التي تبحث عنها لا وجود لها أصلا.
+    '410': إنّ الصفحة التي تبحث عنها لم تعد موجودة.
+    '500':
+      title: هذه الصفحة خاطئة
   exports:
     blocks: قمت بحظر
     csv: CSV
@@ -163,13 +198,15 @@ ar:
   followers:
     domain: النطاق
     followers_count: عدد المتابِعين
+    purge: تنحية من بين متابعيك
+    unlocked_warning_title: إنّ حسابك غير مقفل
   generic:
     changes_saved_msg: تم حفظ التعديلات بنجاح !
     powered_by: مدعوم بـ %{link}
     save_changes: حفظ التغييرات
     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
+      one: لا يزال هناك خلل ما إلى حد الآن. يُرجى إعادة النظر في الخطأ أسفله
+      other: هناك شيء ليس على ما يرام ! رجاءًا تحقق من الأخطاء الـ %{count} أسفله
   imports:
     preface: You can import certain data like all the people you are following or blocking into your account on this instance, from files created by an export on another instance.
     success: تم تحميل بياناتك بنجاح وسيتم معالجتها في الوقت المناسب
@@ -177,8 +214,16 @@ ar:
       blocking: قائمة المحظورين
       following: قائمة المستخدمين المتبوعين
     upload: تحميل
+  invites:
+    delete: تعطيل
+    expires_in:
+      '1800': 30 دقيقة
+      '21600': 6 ساعات
+      '3600': ساعة
+      '43200': 12 ساعة
+      '86400': يوم واحد
   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>.
+  landing_strip_signup_html: إن كنت لا تملك واحدا، يمكنك <a href="%{sign_up_path}">التسجيل مِن هنا</a>.
   lists:
     errors:
       limit: لقد بلغت الحد الأقصى للقوائم
@@ -188,9 +233,11 @@ ar:
       too_many: لا يمكن إرفاق أكثر من 4 ملفات
   migrations:
     acct: username@domain للحساب الجديد
+    currently_redirecting: 'تم تحويل رابط ملفك الشخصي إلى :'
+    proceed: حفظ
   notification_mailer:
     digest:
-      body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:'
+      body: 'هذه هي الأخبار المختصرة التي قد فاتتك على %{instance}وذلك منذ آخر زيارة لك في  %{since} :'
       mention: "%{name} أشار إليك في :"
       new_followers_summary:
         one: لقد حصلت على متابع جديد !
@@ -200,19 +247,19 @@ ar:
         other: "%{count} إشعارات جديدة منذ زيارتك الأخيرة \U0001F418"
     favourite:
       body: 'أُعجب %{name} بمنشورك :'
-      subject: "%{name} favourited your status"
+      subject: أُعجِب %{name} بمنشورك
     follow:
       body: "%{name} من متتبعيك الآن !"
       subject: "%{name} من متتبعيك الآن"
     follow_request:
-      body: "%{name} has requested to follow you"
-      subject: 'Pending follower: %{name}'
+      body: طلب %{name} متابعتك
+      subject: 'متابع مُعلّق : %{name}'
     mention:
-      body: 'You were mentioned by %{name} in:'
+      body: 'أشار إليك %{name} في :'
       subject: لقد قام %{name} بذِكرك
     reblog:
-      body: 'Your status was boosted by %{name}:'
-      subject: "%{name} boosted your status"
+      body: 'قام %{name} بترقية منشورك :'
+      subject: قام %{name} بترقية منشورك
   number:
     human:
       decimal_units:
@@ -227,50 +274,104 @@ ar:
   pagination:
     next: التالي
     prev: السابق
+    truncate: "&hellip;"
   preferences:
     languages: اللغات
     other: إعدادات أخرى
     publishing: النشر
+    web: الويب
+  push_notifications:
+    favourite:
+      title: أعجب %{name} بمنشورك
+    follow:
+      title: "%{name} من متتبعيك الآن"
+    group:
+      title: "%{count} إخطارات"
+    mention:
+      action_boost: ترقية
+      action_expand: عرض المزيد
+      title: أشار إليك %{name}
+    reblog:
+      title: قام %{name} بترقية منشورك
   remote_follow:
     acct: قم بإدخال عنوان حسابك username@domain الذي من خلاله تود المتابعة
-    missing_resource: Could not find the required redirect URL for your account
+    missing_resource: تعذر العثور على رابط التحويل المطلوب الخاص بحسابك
     proceed: أكمل المتابعة
     prompt: 'إنك  بصدد متابعة :'
+  sessions:
+    activity: آخر نشاط
+    browser: المتصفح
+    browsers:
+      alipay: أليباي
+      blackberry: بلاك بيري
+      chrome: كروم
+      edge: مايكروسوفت إيدج
+      firefox: فايرفكس
+      generic: متصفح مجهول
+      ie: إنترنت إكسبلورر
+      opera: أوبرا
+      qq: متصفح كيوكيو
+      safari: سفاري
+    current_session: الجلسة الحالية
+    description: "%{browser} على %{platform}"
+    ip: عنوان الإيبي
+    platforms:
+      android: أندرويد
+      blackberry: بلاك بيري
+      chrome_os: نظام كروم أواس
+      firefox_os: نظام فايرفكس أواس
+      linux: لينكس
+      mac: ماك
+      other: نظام مجهول
+      windows: ويندوز
+    title: الجلسات
   settings:
     authorized_apps: التطبيقات المرخص لها
     back: عودة إلى ماستدون
+    development: التطوير
     edit_profile: تعديل الملف الشخصي
     export: تصدير البيانات
     followers: المتابِعون المُرَخّصون
     import: إستيراد
+    notifications: الإخطارات
     preferences: التفضيلات
     settings: الإعدادات
-    two_factor_authentication: اثبات هويّة مزدوج
+    two_factor_authentication: إثبات الهويّة المزدوج
+    your_apps: تطبيقاتك
   statuses:
     open_in_web: إفتح في الويب
     over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها
+    pin_errors:
+      ownership: لا يمكن تدبيس تبويق نشره شخص آخر
     show_more: أظهر المزيد
+    title: '%{name} : "%{quote}"'
     visibilities:
       private: إعرض فقط لمتتبعيك
+      private_long: إعرضه لمتتبعيك فقط
       public: للعامة
+      public_long: يمكن للجميع رؤيته
       unlisted: Public, but do not display on the public timeline
   stream_entries:
     click_to_show: إضغط للعرض
     reblogged: رقى
     sensitive_content: محتوى حساس
+  terms:
+    title: شروط الخدمة وسياسة الخصوصية على %{instance}
+  themes:
+    default: ماستدون
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
   two_factor_authentication:
-    code_hint: Enter the code generated by your authenticator app to confirm
-    description_html: If you enable <strong>two-factor authentication</strong>, logging in will require you to be in possession of your phone, which will generate tokens for you to enter.
+    code_hint: قم بإدخال الرمز المُوَلّد عبر تطبيق المصادقة للتأكيد
+    description_html: في حال تفعيل <strong>المصادقة بخطوتين </strong>، فتسجيل الدخول يتتطلب منك أن يكون بحوزتك هاتفك النقال قصد توليد الرمز الذي سيتم إدخاله.
     disable: تعطيل
     enable: تفعيل
     enabled: نظام المصادقة بخطوتين مُفعَّل
     enabled_success: تم تفعيل إثبات الهوية المزدوج بنجاح
     generate_recovery_codes: توليد رموز الإسترجاع
-    instructions_html: "<strong>Scan this QR code into Google Authenticator or a similiar TOTP app on your phone</strong>. From now on, that app will generate tokens that you will have to enter when logging in."
-    manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:'
+    instructions_html: "<strong>قم بمسح رمز الكيو آر عبر Google Authenticator أو أي تطبيق TOTP على جهازك</strong>. من الآن فصاعدا سوف يقوم ذاك التطبيق بتوليد رموز يجب عليك إدخالها عند تسجيل الدخول."
+    manual_instructions: 'في حالة تعذّر مسح رمز الكيو آر أو طُلب منك إدخال يدوي، يُمْكِنك إدخال هذا النص السري على التطبيق :'
     recovery_codes: النسخ الإحتياطي لرموز الإسترجاع
     recovery_codes_regenerated: تم إعادة توليد رموز الإسترجاع الإحتياطية بنجاح
     setup: تنشيط
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 455a85ceb..5fd5b3f6d 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -116,6 +116,7 @@ ca:
       roles:
         admin: Administrador
         moderator: Moderador
+        staff: Personal
         user: Usuari
       salmon_url: URL Salmon
       search: Cerca
@@ -160,6 +161,7 @@ ca:
         update_status: "%{name} estat actualizat per %{target}"
       title: Registre d'auditoria
     custom_emojis:
+      by_domain: Domini
       copied_msg: S'ha creat correctament la còpia local del emoji
       copy: Copia
       copy_failed_msg: No s'ha pogut fer una còpia local d'aquest emoji
@@ -458,6 +460,9 @@ ca:
     title: Convida persones
   landing_strip_html: "<strong>%{name}</strong> és un usuari/a de %{link_to_root_path}. Pots seguir-lo/la o interactuar amb ell/a si tens un compte a qualsevol node del fediverse."
   landing_strip_signup_html: Si no en tens, pots <a href="%{sign_up_path}">registrar-te aquí</a>.
+  lists:
+    errors:
+      limit: Has assolit la quantitat màxima de llistes
   media_attachments:
     validations:
       images_and_video: No es pot adjuntar un vídeo a una publicació que ja contingui imatges
@@ -596,6 +601,7 @@ ca:
       private: No es pot fixar el toot no públic
       reblog: No es pot fixar un impuls
     show_more: Mostrar més
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: Només seguidors
       private_long: Mostra només als seguidors
@@ -678,8 +684,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/devise.ar.yml b/config/locales/devise.ar.yml
index bb91cb372..28a03ff12 100644
--- a/config/locales/devise.ar.yml
+++ b/config/locales/devise.ar.yml
@@ -3,11 +3,16 @@ ar:
   devise:
     confirmations:
       confirmed: تم التحقق من عنوان بريدك الإلكتروني بنجاح.
+      send_instructions: سوف تتلقى بعد بضع دقائق رسالةً إلكترونيةً تضم تعليمات التأكيد. إن لم تتلق الرسالة، الرجاء التحقق من إنها ليست ضمن ملف الرسائل غير المرغوب فيها.
+      send_paranoid_instructions: إن كان عنوان بريدك الإلكتروني موجودا في قاعدة بياناتنا سوف تتلقّى الإرشادات اللازمة لتأكيده خلال بضع دقائق. يُرجى الإطلاع على الرسائل المتلقاة في البريد غير المرغوب فيه أيضا للتحقق من تلقي الرسالة.
     failure:
       already_authenticated: لقد تم تسجيل دخولك من قبل.
       inactive: لم يتم تنشيط حسابك بعد.
+      invalid: "%{authentication_keys} أو كلمة سر خاطئة."
       last_attempt: بإمكانك إعادة المحاولة مرة واحدة قبل أن يتم قفل حسابك.
       locked: إن حسابك مقفل.
+      not_found_in_database: "%{authentication_keys} أو كلمة سر خاطئة."
+      timeout: لقد إنتهت مدة صلاحية جلستك. قم بتسجيل الدخول من جديد للمواصلة.
       unauthenticated: يجب عليك تسجيل الدخول أو إنشاء حساب قبل المواصلة.
       unconfirmed: يجب عليك تأكيد عنوان بريدك الإلكتروني قبل المواصلة.
     mailer:
@@ -19,12 +24,17 @@ ar:
         subject: 'ماستدون : تعليمات إستعادة كلمة المرور'
       unlock_instructions:
         subject: 'ماستدون : تعليمات فك القفل'
+    omniauth_callbacks:
+      failure: تعذرت المصادقة من %{kind} بسبب "%{reason}".
+      success: تمت المصادقة بنجاح عبر حساب %{kind}.
     passwords:
       updated: تم تغيير كلمة المرور بنجاح. أنت مسجل الآن.
       updated_not_active: تم تغيير كلمة المرور بنجاح.
     registrations:
       destroyed: إلى اللقاء ! لقد تم إلغاء حسابك. نتمنى أن نراك مجددا.
       signed_up: أهلا وسهلا ! تم تسجيل دخولك بنجاح.
+      signed_up_but_inactive: لقد تمت عملية إنشاء حسابك بنجاح إلاّ أنه لا يمكننا تسجيل دخولك إلاّ بعد قيامك بتفعيله.
+      signed_up_but_unconfirmed: لقد تم إرسال رسالة تحتوي على رابط للتفعيل إلى عنوان بريدك الإلكتروني. بالضغط على الرابط سوف يتم تفعيل حسابك. لذا يُرجى إلقاء نظرة على ملف الرسائل غير المرغوب فيها إنْ لم تَعثُر على الرسالة السالفة الذِكر.
       updated: تم تحديث حسابك بنجاح.
     sessions:
       already_signed_out: تم تسجيل خروجك بنجاح.
diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml
index c5ae583ff..20938e47b 100644
--- a/config/locales/devise.en.yml
+++ b/config/locales/devise.en.yml
@@ -17,15 +17,32 @@ en:
       unconfirmed: You have to confirm your email address before continuing.
     mailer:
       confirmation_instructions:
+        action: Verify email address
+        explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email.
+        extra_html: Please also check out <a href="%{terms_path}">the rules of the instance</a> and <a href="%{policy_path}">our terms of service</a>.
         subject: 'Mastodon: Confirmation instructions for %{instance}'
+        title: Verify email address
       email_changed:
+        explanation: 'The email address for your account is being changed to:'
+        extra: If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account.
         subject: 'Mastodon: Email changed'
+        title: New email address
       password_change:
+        explanation: The password for your account has been changed.
+        extra: If you did not change your password, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account.
         subject: 'Mastodon: Password changed'
+        title: Password changed
       reconfirmation_instructions:
+        explanation: Confirm the new address to change your email.
+        extra: If this change wasn't initiated by you, please ignore this email. The email address for the Mastodon account won't change until you access the link above.
         subject: 'Mastodon: Confirm email for %{instance}'
+        title: Verify email address
       reset_password_instructions:
+        action: Change password
+        explanation: You requested a new password for your account.
+        extra: If you didn't request this, please ignore this email. Your password won't change until you access the link above and create a new one.
         subject: 'Mastodon: Reset password instructions'
+        title: Password reset
       unlock_instructions:
         subject: 'Mastodon: Unlock instructions'
     omniauth_callbacks:
diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml
new file mode 100644
index 000000000..8a2b5d563
--- /dev/null
+++ b/config/locales/devise.gl.yml
@@ -0,0 +1,61 @@
+---
+gl:
+  devise:
+    confirmations:
+      confirmed: O seu enderezo de email foi confirmado con éxito.
+      send_instructions: Nuns minutos recibirá un correo electrónico con instruccións sobre como confirmar o seu enderezo de correo.  Comprobe por favor o cartafol de spam se non recibe este correo.
+      send_paranoid_instructions: Si o seu enderezo existe na nosa base de datos, recibirá nuns minutos un correo con instruccións sobre como confirmar o enderezo de correo. Por favor comprobe o cartafol de spam si non recibe este correo.
+    failure:
+      already_authenticated: Xa está conectada.
+      inactive: A súa conta aínda non foi activada.
+      invalid: Contrasinal ou %{authentication_keys} non válidos.
+      last_attempt: Quédalle un intento antes de que a conta sexa bloqueada.
+      locked: A súa conta foi bloqueada.
+      not_found_in_database: Contrasinal ou %{authentication_keys} non válidos.
+      timeout: Caducou a sesión. Por favor conéctese de novo para seguir.
+      unauthenticated: Precisa rexistrarse ou conectarse para continuar.
+      unconfirmed: Debe confirmar o seu enderezo de correo antes de continuar.
+    mailer:
+      confirmation_instructions:
+        subject: 'Mastodon: Instruccións de confirmación para %{instance}'
+      password_change:
+        subject: 'Mastodon: contrasinal cambiado'
+      reset_password_instructions:
+        subject: 'Mastodon: Instruccións para restablecer o contrasinal'
+      unlock_instructions:
+        subject: 'Mastodon: Instruccións para desbloquear'
+    omniauth_callbacks:
+      failure: Non podemos autenticala desde %{kind} porque "%{reason}".
+      success: Autenticouse con éxito desde a conta %{kind}.
+    passwords:
+      no_token: Non pode acceder a esta páxina vindo desde un correo de restablecemento de contrasinal. Si vostede chega desde un correo de restablecemento de contrasinal, por favor asegúrese de que utiliza o URL completo proporcionado.
+      send_instructions: Si o seu enderezo de correo existe na nosa base de datos,  nuns minutos recibirá unha ligazón para recuperar o contrasinal. Por favor comprobe o seu cartafol de spam si non recibe este correo.
+      send_paranoid_instructions: Si o seu enderezo de correo existe na nosa base de datos, recibirá nuns minutos unha ligazón para recuperar o contrasinal. Por favor comprobe o seu cartafol de spam si non recibe este correo.
+      updated: Cambiou o contrasinal con éxito. Agora xa está conectada.
+      updated_not_active: Cambiouse o seu contrasinal correctamente.
+    registrations:
+      destroyed: Adeus! A súa conta cancelouse con éxito. Agardamos vela de novo.
+      signed_up: Ben vida! Rexistrouse con éxito.
+      signed_up_but_inactive: Rexistrouse correctamente. Porén, aínda non podemos conectala porque a súa conta aínda non foi activada.
+      signed_up_but_locked: Rexistrouse correctamente. Porén, non podemos conectala porque a conta está bloqueada.
+      signed_up_but_unconfirmed: Foi enviada unha mensaxe con unha ligazón de confirmación ao seu enderezo electrónico. Por favor siga a ligazón para activar a súa conta. Por favor comprobe o cartafol de spam si non recibe este correo.
+      update_needs_confirmation: Actualizou a súa conta correctamente, pero precisamos verificar o seu enderezo. Por favor comprobe o seu email e siga a ligazón de confirmación para confirmar o seu novo enderezo. Por favor comprobe o cartafol de spam si non recibe este correo.
+      updated: A súa conta foi actualizada correctamente.
+    sessions:
+      already_signed_out: Desconectouse con éxito.
+      signed_in: Conectouse correctamente.
+      signed_out: Desconectouse correctamente.
+    unlocks:
+      send_instructions: Recibirá nuns minutos un correo con instrucións sobre como desbloquear a súa conta. Por favor comprobe o cartafol de spam si non recibe este correo.
+      send_paranoid_instructions: Si a conta existe, recibirá un correo nuns minutos sobre como desbloquear a súa conta. Por favor comprobe o cartafol de spam si non recibe este correo.
+      unlocked: A súa conta foi desbloqueada correctamente. Por favor, conéctese para continuar.
+  errors:
+    messages:
+      already_confirmed: xa foi confirmada, por favor intente conectarse
+      confirmation_period_expired: precisa ser confirmada en %{period}, por favor solicite unha nova
+      expired: caducou, por favor solicite unha nova
+      not_found: non se atopou
+      not_locked: non foi bloqueada
+      not_saved:
+        one: '1 erro evitou que %{resource} fose gardada:'
+        other: "%{count} erros evitaron que %{resource} fose gardada:"
diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml
index 5560e12b3..dd6b48795 100644
--- a/config/locales/devise.zh-CN.yml
+++ b/config/locales/devise.zh-CN.yml
@@ -17,15 +17,34 @@ zh-CN:
       unconfirmed: 继续操作前请先确认你的帐户。
     mailer:
       confirmation_instructions:
-        subject: Mastodon 帐户确认信息
+        action: 验证电子邮件地址
+        explanation: 你在 %{host} 上使用这个电子邮件地址创建了一个帐户。只需点击下面的按钮,即可完成激活。如果你并没有创建过帐户,请忽略此邮件。
+        extra_html: 请记得阅读<a href="%{terms_path}">本实例的相关规定</a>和<a href="%{policy_path}">我们的使用条款</a>。
+        subject: Mastodon:确认 %{instance} 帐户信息
+        title: 验证电子邮件地址
       email_changed:
-        subject: Mastodon 电子邮件地址已被修改
+        explanation: 你的帐户的电子邮件地址即将变更为:
+        extra: 如果你并没有请求更改你的电子邮件地址,则他人很有可能已经入侵你的帐户。请立即更改你的密码;如果你已经无法访问你的帐户,请联系实例的管理员请求协助。
+        subject: Mastodon:电子邮件地址已被更改
+        title: 新电子邮件地址
       password_change:
-        subject: Mastodon 密码已被重置
+        explanation: 你的帐户的密码已被更改。
+        extra: 如果你并没有请求更改你的密码,则他人很有可能已经入侵你的帐户。请立即更改你的密码;如果你已经无法访问你的帐户,请联系实例的管理员请求协助。
+        subject: Mastodon:密码已被更改
+        title: 密码已被重置
+      reconfirmation_instructions:
+        explanation: 请确认你的新电子邮件地址以完成更改。
+        extra: 如果你并没有请求本次变更,请忽略此邮件。Mastodon 帐户的电子邮件地址只有在你点击上面的链接后才会更改。
+        subject: Mastodon:确认 %{instance} 电子邮件地址
+        title: 验证电子邮件地址
       reset_password_instructions:
-        subject: Mastodon 重置密码信息
+        action: 更改密码
+        explanation: 你正在请求更改帐户的密码。
+        extra: 如果你并没有请求本次变更,请忽略此邮件。你的密码只有在你点击上面的链接并输入新密码后才会更改。
+        subject: Mastodon:重置密码信息
+        title: 重置密码
       unlock_instructions:
-        subject: Mastodon 帐户解锁信息
+        subject: Mastodon:帐户解锁信息
     omniauth_callbacks:
       failure: 由于%{reason},无法从%{kind}获得授权。
       success: 成功地从%{kind}获得授权。
diff --git a/config/locales/doorkeeper.gl.yml b/config/locales/doorkeeper.gl.yml
index 863438454..dc9a04f18 100644
--- a/config/locales/doorkeeper.gl.yml
+++ b/config/locales/doorkeeper.gl.yml
@@ -1,9 +1,11 @@
+---
 gl:
   activerecord:
     attributes:
       doorkeeper/application:
         name: Nome do aplicativo
         redirect_uri: URI a redireccionar
+        scopes: Permisos
         website: Sitio web do aplicativo
     errors:
       models:
@@ -31,3 +33,87 @@ gl:
       help:
         native_redirect_uri: Utilice %{native_redirect_uri} para probas locais
         redirect_uri: Utilice unha liña por URI
+        scopes: Separar permisos con espazos. Deixar en blanco para utilizar os permisos por omisión.
+      index:
+        application: Aplicativo
+        callback_url: URL de chamada
+        delete: Eliminar
+        name: Nome
+        new: Novo aplicativo
+        scopes: Permisos
+        show: Mostrar
+        title: Os seus aplicativos
+      new:
+        title: Novo aplicativo
+      show:
+        actions: Accións
+        application_id: Chave do cliente
+        callback_urls: URLs de chamada
+        scopes: Permisos
+        secret: Chave secreta do cliente
+        title: 'Aplicativo: %{name}'
+    authorizations:
+      buttons:
+        authorize: Autorizar
+        deny: Denegar
+      error:
+        title: Algo fallou
+      new:
+        able_to: Poderá
+        prompt: O aplicativo %{client_name} solicita acceso a súa conta
+        title: Autorización necesaria
+      show:
+        title: Copie este código de autorización e pégueo no aplicativo.
+    authorized_applications:
+      buttons:
+        revoke: Retirar autorización
+      confirmations:
+        revoke: Está segura?
+      index:
+        application: Aplicativo
+        created_at: Autorizado
+        date_format: "%d-%m-%Y %H:%M:%S"
+        scopes: Permisos
+        title: Os seus aplicativos autorizados
+    errors:
+      messages:
+        access_denied: O propietario do recurso ou o servidor autorizado denegaron a petición.
+        credential_flow_not_configured: O fluxo do Contrasinal de Credenciais do Dono do Recurso  fallou debido a que Doorkeeper.configure.resource_owner_from_credentials non están configuradas.
+        invalid_client: A autenticación do cliente fallou debido a un cliente descoñecido, non se incluíu autenticación do cliente, ou o método de autenticación non está soportado.
+        invalid_grant: A validación da autorización proporcionada non é valida, caducou, foi rexeitada, non coincide a redirección URI utilizada na petición de autorización, ou foi proporcionada para outro cliente.
+        invalid_redirect_uri: A uri de redirección incluída non é válida.
+        invalid_request: A petición fáltalle un parámetro requerido, inclúe un valor de parámetro non soportado, ou de algún xeito non ten o formato axeitado.
+        invalid_resource_owner: As credenciais do dono do recurso proporcionadas non son válidas, ou o dono do recurso non pode ser atopado
+        invalid_scope: O permiso solicitado non é válido, descoñecido, ou mal formado.
+        invalid_token:
+          expired: O testemuño de acceso caducou
+          revoked: O testemuño de acceso foi rexeitado
+          unknown: O testemuño de acceso non é válido
+        resource_owner_authenticator_not_configured: O dono do recurso fallou debido a Doorkeeper.configure.resource_owner_authenticator non estar configurado.
+        server_error: O servidor de autorización atopou un problema non agardado que evitou completar a petición.
+        temporarily_unavailable: O servidor de autorización non pode atender a petición en este momento debido a unha sobrecarga puntual ou mantemento do servidor.
+        unauthorized_client: O cliente non está autorizado a realizar a petición utilizando este método.
+        unsupported_grant_type: O método para proporcionar autorización non está soportado polo servidor de autorización.
+        unsupported_response_type: O servidor de autorización non soporta este tipo de resposta.
+    flash:
+      applications:
+        create:
+          notice: Aplicativo creado.
+        destroy:
+          notice: Aplicativo eliminado.
+        update:
+          notice: Aplicativo actualizado.
+      authorized_applications:
+        destroy:
+          notice: Aplicativo rexeitado.
+    layouts:
+      admin:
+        nav:
+          applications: Aplicativos
+          oauth2_provider: Proveedor OAuth2
+      application:
+        title: Precisa autorización OAuth
+    scopes:
+      follow: seguir, bloquear, desbloquear e deixar de seguir contas
+      read: ler os datos da súa conta
+      write: publicar no seu nome
diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml
index 5c9c9047f..7ad10f45b 100644
--- a/config/locales/doorkeeper.nl.yml
+++ b/config/locales/doorkeeper.nl.yml
@@ -84,11 +84,11 @@ nl:
         invalid_redirect_uri: De opgegeven redirect-URI is ongeldig.
         invalid_request: Het verzoek mist een vereiste parameter, bevat een niet ondersteunde parameterwaarde of is anderszins onjuist.
         invalid_resource_owner: De verstrekte resource-eigenaargegevens zijn ongeldig of de resource-eigenaar kan niet worden gevonden
-        invalid_scope: De opgevraagde scope is ongeldig, onbekend of onjuist.
+        invalid_scope: De opgevraagde toestemming is ongeldig, onbekend of onjuist.
         invalid_token:
-          expired: Het toegangssleutel is verlopen
-          revoked: Het toegangssleutel is geweigerd
-          unknown: Het toegangssleutel is ongeldig
+          expired: Toegangscode verlopen
+          revoked: Toegangscode ingetrokken
+          unknown: Toegangscode ongeldig
         resource_owner_authenticator_not_configured: Het opzoeken van de resource-eigenaar is mislukt omdat Doorkeeper.configure.resource_owner_authenticator niet is ingesteld.
         server_error: De autorisatieserver is is een onverwachte situatie tegengekomen die het verzoek verhinderde.
         temporarily_unavailable: De autorisatieserver is momenteel niet in staat het verzoek te behandelen als gevolg van een tijdelijke overbelasting of onderhoud aan de server.
diff --git a/config/locales/doorkeeper.pt.yml b/config/locales/doorkeeper.pt.yml
index 039b90ffa..e76cd01fd 100644
--- a/config/locales/doorkeeper.pt.yml
+++ b/config/locales/doorkeeper.pt.yml
@@ -5,7 +5,7 @@ pt:
       doorkeeper/application:
         name: Nome da Aplicação
         redirect_uri: URL de redirecionamento
-        scopes: Scopes
+        scopes: Autorizações
         website: Site da Aplicação
     errors:
       models:
@@ -33,13 +33,14 @@ pt:
       help:
         native_redirect_uri: Usa %{native_redirect_uri} para testes locais
         redirect_uri: Utiliza uma linha por URI
-        scopes: Separate scopes with spaces. Leave blank to use the default scopes.
+        scopes: Separa autorizações com espaços. Deixa em branco para usar autorizações predefinidas.
       index:
         application: Aplicações
-        callback_url: Callback URL
+        callback_url: URL de retorno
         delete: Eliminar
         name: Nome
         new: Nova Aplicação
+        scopes: Autorizações
         show: Mostrar
         title: As tuas aplicações
       new:
@@ -48,7 +49,7 @@ pt:
         actions: Ações
         application_id: Id de Aplicação
         callback_urls: Callback urls
-        scopes: Scopes
+        scopes: Autorizações
         secret: Segredo
         title: 'Aplicação: %{name}'
     authorizations:
@@ -72,27 +73,28 @@ pt:
         application: Aplicação
         created_at: Criada em
         date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Autorizações
         title: As tuas aplicações autorizadas
     errors:
       messages:
-        access_denied: The resource owner or authorization server denied the request.
-        credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured.
-        invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method.
-        invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.
-        invalid_redirect_uri: The redirect uri included is not valid.
-        invalid_request: The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed.
-        invalid_resource_owner: The provided resource owner credentials are not valid, or resource owner cannot be found
-        invalid_scope: The requested scope is invalid, unknown, or malformed.
+        access_denied: O proprietário do recurso ou servidor de autorização negou o pedido.
+        credential_flow_not_configured: As credenciais da palavra-passe do proprietário do recurso falhou devido a que Doorkeeper.configure.resource_owner_from_credentials não foram configuradas.
+        invalid_client: Autenticação do cliente falhou por causa de um cliente desconhecido, nenhum cliente de autenticação incluído ou método de autenticação não suportado.
+        invalid_grant: A concessão de autorização fornecida é inválida, expirou, foi revogada, não corresponde à URI de redirecionamento usada no pedido de autorização ou foi emitida para outro cliente.
+        invalid_redirect_uri: A URI de redirecionamento incluída não é válida.
+        invalid_request: A solicitação não possui um parâmetro requerido, inclui um valor  não suportado ou tem outro tipo de formato incorreto.
+        invalid_resource_owner: As credenciais do proprietário do recurso não são válidas ou o proprietário do recurso não pode ser encontrado
+        invalid_scope: O âmbito solicitado é inválido, desconhecido ou tem um formato incorreto.
         invalid_token:
           expired: O token de acesso expirou
           revoked: O token de acesso foi revogado
           unknown: O token de acesso é inválido
-        resource_owner_authenticator_not_configured: Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfiged.
-        server_error: The authorization server encountered an unexpected condition which prevented it from fulfilling the request.
-        temporarily_unavailable: The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server.
-        unauthorized_client: The client is not authorized to perform this request using this method.
-        unsupported_grant_type: The authorization grant type is not supported by the authorization server.
-        unsupported_response_type: The authorization server does not support this response type.
+        resource_owner_authenticator_not_configured: A procura pelo proprietário do recurso falhou porque Doorkeeper.configure.resource_owner_authenticator não foi configurado.
+        server_error: O servidor de autorização encontrou uma condição inesperada que impediu o cumprimento do pedido .
+        temporarily_unavailable: O servidor de autorização não é capaz de lidar com o pedido devido a uma sobrecarga ou mantenimento do servidor.
+        unauthorized_client: O cliente não está autorizado a realizar esta solicitação usando este método.
+        unsupported_grant_type: O tipo de concessão de autorização não é suportado pelo servidor de autorização.
+        unsupported_response_type: O servidor de autorização não suporta este tipo de resposta.
     flash:
       applications:
         create:
@@ -108,10 +110,10 @@ pt:
       admin:
         nav:
           applications: Aplicações
-          oauth2_provider: OAuth2 Provider
+          oauth2_provider: Fornecedor OAuth2
       application:
         title: Autorização OAuth necessária
     scopes:
       follow: siga, bloqueie, desbloqueie, e deixa de seguir contas
       read: tenha acesso aos dados da tua conta
-      write: públique por ti
+      write: publique por ti
diff --git a/config/locales/en.yml b/config/locales/en.yml
index e4425b424..bc1e98c56 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -338,10 +338,13 @@ en:
       body: "%{reporter} has reported %{target}"
       subject: New report for %{instance} (#%{id})
   application_mailer:
+    notification_preferences: Change e-mail preferences
     salutation: "%{name},"
     settings: 'Change e-mail preferences: %{link}'
     signature: Mastodon notifications from %{instance}
     view: 'View:'
+    view_profile: View Profile
+    view_status: View status
   applications:
     created: Application successfully created
     destroyed: Application successfully deleted
@@ -432,6 +435,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
@@ -464,6 +468,14 @@ en:
       expires_at: Expires
       uses: Uses
     title: Invite people
+  keyword_mutes:
+    add_keyword: Add keyword
+    edit: Edit
+    edit_keyword: Edit keyword
+    keyword: Keyword
+    match_whole_word: Match whole word
+    remove: Remove
+    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:
@@ -482,29 +494,38 @@ en:
     title: Moderation
   notification_mailer:
     digest:
-      body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:'
+      action: View all notifications
+      body: Here is a brief summary of the messages you missed since your last visit on %{since}
       mention: "%{name} mentioned you in:"
       new_followers_summary:
-        one: You have acquired one new follower! Yay!
-        other: You have gotten %{count} new followers! Amazing!
+        one: Also, you have acquired one new follower while being away! Yay!
+        other: Also, you have acquired %{count} new followers while being away! Amazing!
       subject:
         one: "1 new notification since your last visit \U0001F418"
         other: "%{count} new notifications since your last visit \U0001F418"
+      title: In your absence…
     favourite:
       body: 'Your status was favourited by %{name}:'
       subject: "%{name} favourited your status"
+      title: New favourite
     follow:
       body: "%{name} is now following you!"
       subject: "%{name} is now following you"
+      title: New follower
     follow_request:
+      action: Manage follow requests
       body: "%{name} has requested to follow you"
       subject: 'Pending follower: %{name}'
+      title: New follow request
     mention:
+      action: Reply
       body: 'You were mentioned by %{name} in:'
       subject: You were mentioned by %{name}
+      title: New mention
     reblog:
       body: 'Your status was boosted by %{name}:'
       subject: "%{name} boosted your status"
+      title: New boost
   number:
     human:
       decimal_units:
@@ -552,12 +573,14 @@ en:
       blackberry: Blackberry
       chrome: Chrome
       edge: Microsoft Edge
+      electron: Electron
       firefox: Firefox
       generic: Unknown browser
       ie: Internet Explorer
       micro_messenger: MicroMessenger
       nokia: Nokia S40 Ovi Browser
       opera: Opera
+      otter: Otter
       phantom_js: PhantomJS
       qq: QQ Browser
       safari: Safari
@@ -590,8 +613,10 @@ en:
     development: Development
     edit_profile: Edit profile
     export: Data export
+    flavours: Flavours
     followers: Authorized followers
     import: Import
+    keyword_mutes: Muted keywords
     migrate: Account migration
     notifications: Notifications
     preferences: Preferences
@@ -690,8 +715,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/fa.yml b/config/locales/fa.yml
index 1e3bd0e8b..94d4e7594 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -39,6 +39,7 @@ fa:
     followers: پیگیران
     following: پی می‌گیرد
     media: عکس و ویدیو
+    moved_html: "%{name} حساب خود را به %{new_profile_link} منتقل کرده است:"
     nothing_here: این‌جا چیزی نیست!
     people_followed_by: کسانی که %{name} پی می‌گیرد
     people_who_follow: کسانی که %{name} را پی می‌گیرند
@@ -48,6 +49,7 @@ fa:
     reserved_username: این نام کاربری در دسترس نیست
     roles:
       admin: مدیر
+      moderator: ناظم
     unfollow: پایان پیگیری
   admin:
     account_moderation_notes:
@@ -59,13 +61,19 @@ fa:
       destroyed_msg: یادداشت مدیر با موفقیت پاک شد!
     accounts:
       are_you_sure: آیا مطمئن هستید؟
+      by_domain: دامین
       confirm: تأیید
       confirmed: تأیید شد
+      demote: تنزل‌دادن
+      disable: غیرفعال
       disable_two_factor_authentication: غیرفعال‌سازی ورود دومرحله‌ای
+      disabled: غیرفعال
       display_name: نمایش به نام
       domain: دامین
       edit: ویرایش
       email: ایمیل
+      enable: فعال
+      enabled: فعال
       feed_url: نشانی فید
       followers: پیگیران
       followers_url: نشانی پیگیران
@@ -77,7 +85,9 @@ fa:
         local: محلی
         remote: غیرمستقیم
         title: مکان
+      login_status: وضعیت ورود
       media_attachments: ضمیمه‌های تصویری
+      memorialize: تبدیل به یادمان
       moderation:
         all: همه
         silenced: بی‌صدا شده
@@ -94,6 +104,7 @@ fa:
       outbox_url: نشانی صندوق خروجی
       perform_full_suspension: انجام تعلیق کامل
       profile_url: نشانی نمایه
+      promote: ترفیع‌دادن
       protocol: پروتکل
       public: عمومی
       push_subscription_expires: عضویت از راه PuSH منقضی شد
@@ -101,6 +112,12 @@ fa:
       reset: بازنشانی
       reset_password: بازنشانی رمز
       resubscribe: اشتراک دوباره
+      role: اجازه‌ها
+      roles:
+        admin: مدیر
+        moderator: ناظم
+        staff: کارمند
+        user: کاربر
       salmon_url: نشانی Salmon
       search: جستجو
       shared_inbox_url: نشانی صندوق ورودی مشترک
@@ -117,7 +134,34 @@ fa:
       unsubscribe: لغو اشتراک
       username: نام کاربری
       web: وب
+    action_logs:
+      actions:
+        confirm_user: "%{name} نشانی ایمیل کاربر %{target} را تأیید کرد"
+        create_custom_emoji: "%{name} شکلک تازهٔ %{target} را بارگذاشت"
+        create_domain_block: "%{name} دامین %{target} را مسدود کرد"
+        create_email_domain_block: "%{name} دامین ایمیل %{target} را مسدود کرد"
+        demote_user: "%{name} مقام کاربر %{target} را تنزل داد"
+        destroy_domain_block: "%{name} دامین %{target} را باز کرد"
+        destroy_email_domain_block: "%{name} دامین ایمیل %{target} را باز کرد"
+        destroy_status: "%{name} نوشته‌ای از %{target} را پاک کرد"
+        disable_2fa_user: "%{name} اجبار ورود دومرحله‌ای را برای کاربر %{target} غیرفعال کرد"
+        disable_custom_emoji: "%{name} شکلک %{target} را غیرفعال کرد"
+        disable_user: "%{name} ورود را برای کاربر %{target} غیرفعال کرد"
+        enable_custom_emoji: "%{name} شکلک %{target} را فعال کرد"
+        enable_user: "%{name} ورود را برای کاربر %{target} فعال کرد"
+        memorialize_account: "%{name} حساب کاربر %{target} را تبدیل به صفحهٔ یادمان کرد"
+        promote_user: "%{name} کاربر %{target} را ترفیع داد"
+        reset_password_user: "%{name} رمز کاربر %{target} را بازنشاند"
+        resolve_report: "%{name} گزارش %{target} را نادیده گرفت"
+        silence_account: "%{name} حساب کاربر %{target} را خاموش (بی‌صدا) کرد"
+        suspend_account: "%{name} حساب کاربر %{target} را تعلیق کرد"
+        unsilence_account: "%{name} حساب کاربر %{target} را روشن (باصدا) کرد"
+        unsuspend_account: "%{name} حساب کاربر %{target} را از تعلیق خارج کرد"
+        update_custom_emoji: "%{name} شکلک %{target} را به‌روز کرد"
+        update_status: "%{name} نوشتهٔ %{target} را به‌روز کرد"
+      title: سیاههٔ بازرسی
     custom_emojis:
+      by_domain: دامین
       copied_msg: نسخهٔ محلی شکلک با موفقیت ساخته شد
       copy: نسخه‌برداری
       copy_failed_msg: نشد که نسخهٔ محلی این شکلک ساخته شود
@@ -130,11 +174,16 @@ fa:
       enable: فعال‌سازی
       enabled_msg: این شکلک با موفقیت فعال شد
       image_hint: پروندهٔ PNG حداکثر 50KB
+      listed: فهرست‌شده
       new:
         title: افزودن شکلک سفارشی
+      overwrite: بازنویسی
       shortcode: کد کوتاه
       shortcode_hint: دست‌کم ۲ نویسه و تنها شامل حروف، اعداد و زیرخط
       title: شکلک‌های سفارشی
+      unlisted: فهرست‌نشده
+      update_failed_msg: این شکلک نتوانست به‌روز شود
+      updated_msg: شکلک با موفقیت به‌روز شد!
       upload: بارگذاری
     domain_blocks:
       add_new: افزودن تازه
@@ -145,7 +194,7 @@ fa:
         create: مسدودسازی
         hint: مسدودسازی دامین جلوی فهرست‌شدن حساب‌ها در پایگاه داده را نمی‌گیرد، بلکه به طور خودکار روش‌های مدیریتی را روی فعالیت‌های فعلی و گذشتهٔ آن حساب‌ها اعمال می‌کند.
         severity:
-          desc_html: "<strong>بی‌صداکردن</strong> یک حساب نوشته‌های آن را برای همه (به جز پیگیرانش) ناپدید می‌کند. <strong>معلق‌کردن</strong> حساب همهٔ نوشته‌ها، تصویرها، و اطلاعات حساب را پاک می‌کند."
+          desc_html: "<strong>بی‌صداکردن</strong> یک حساب نوشته‌های آن را برای همه (به جز پیگیرانش) ناپدید می‌کند. <strong>معلق‌کردن</strong> حساب همهٔ نوشته‌ها، تصویرها، و اطلاعات حساب را پاک می‌کند. اگر فقط می‌خواهید جلوی تصویرها و ویدیوها را بگیرید <strong>هیچ</strong> را برگزینید."
           noop: هیچ
           silence: بی‌صداکردن
           suspend: معلق‌کردن
@@ -184,6 +233,13 @@ fa:
       reset: بازنشانی
       search: جستجو
       title: سرورهای شناخته‌شده
+    invites:
+      filter:
+        all: همه
+        available: در دسترس
+        expired: منقضی‌شده
+        title: فیلتر
+      title: دعوت‌ها
     reports:
       action_taken_by: انجام‌دهنده
       are_you_sure: آیا مطمئن هستید؟
@@ -222,11 +278,17 @@ fa:
         deletion:
           desc_html: هر کسی بتواند حساب خود را پاک کند
           title: فعال‌سازی پاک‌کردن حساب
+        min_invite_role:
+          disabled: هیچ کس
+          title: اجازهٔ دعوت به
         open:
           desc_html: همه بتوانند حساب باز کنند
           title: امکان ثبت نام
+      show_staff_badge:
+        desc_html: نمایش علامت همکار روی صفحهٔ کاربر
+        title: نمایش علامت همکار
       site_description:
-        desc_html: روی صفحهٔ اصلی نمایش می‌یابد و همچنین به عنوان تگ‌های HTML.<br>می‌توانید HTML بنویسید, به‌ویژه <code>&lt;a&gt;</code> و <code>&lt;em&gt;</code>.
+        desc_html: معرفی کوتاهی که روی صفحهٔ اصلی و همچنین به عنوان فرادادهٔ صفحه‌ها نمایش می‌یابد. می‌توانید HTML بنویسید, به‌ویژه <code>&lt;a&gt;</code> و <code>&lt;em&gt;</code>.
         title: دربارهٔ سایت
       site_description_extended:
         desc_html: جای خوبی برای نوشتن سیاست‌های کاربری، قانون‌ها، راهنماها، و هر چیزی که ویژهٔ این سرور است. تگ‌های HTML هم مجاز است
@@ -270,7 +332,7 @@ fa:
       body: کاربر %{reporter} کاربر %{target} را گزارش داد
       subject: گزارش تازه‌ای برای %{instance} (#%{id})
   application_mailer:
-    salutation: "%{name},"
+    salutation: "%{name}،"
     settings: 'تغییر تنظیمات ایمیل: %{link}'
     signature: اعلان‌های ماستدون از %{instance}
     view: 'نمایش:'
@@ -283,15 +345,17 @@ fa:
     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> پیش بروید. از شما درخواست تأیید خواهد شد.
     didnt_get_confirmation: راهنمایی برای تأیید را دریافت نکردید؟
     forgot_password: رمزتان را گم کرده‌اید؟
-    invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one.
+    invalid_reset_password_token: کد بازنشانی رمز نامعتبر یا منقضی شده است. لطفاً کد دیگری درخواست کنید.
     login: ورود
     logout: خروج
+    migrate_account: نقل مکان به یک حساب دیگر
+    migrate_account_html: اگر می‌خواهید این حساب را به حساب دیگری منتقل کنید، <a href="%{path}">این‌جا را کلیک کنید</a>.
     register: عضو شوید
     resend_confirmation: راهنمایی برای تأیید را دوباره بفرست
     reset_password: بازنشانی رمز
@@ -339,7 +403,7 @@ fa:
     '500':
       content: شرمنده، یک چیزی از سمت ما اشتباه شده.
       title: این صفحه درست نیست
-    noscript_html: برای استفاده از نسخهٔ تحت وب ماستدون، لطفاً جاوااسکریپت را فعال کنید. یا به جایش می‌توانید یک اپ ماستدون را به‌کار ببرید.
+    noscript_html: برای استفاده از نسخهٔ تحت وب ماستدون، لطفاً جاوااسکریپت را فعال کنید. یا به جایش می‌توانید <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">یک اپ ماستدون</a> را به‌کار ببرید.
   exports:
     blocks: حساب‌های مسدودشده
     csv: CSV
@@ -373,12 +437,43 @@ fa:
       following: فهرست پی‌گیری‌ها
       muting: فهرست بی‌صداشده‌ها
     upload: بارگذاری
+  in_memoriam_html: به یادبود.
+  invites:
+    delete: غیرفعال‌سازی
+    expired: منقضی‌شده
+    expires_in:
+      '1800': ۳۰ دقیقه
+      '21600': ۶ ساعت
+      '3600': ۱ ساعت
+      '43200': ۱۲ ساعت
+      '86400': ۱ روز
+    expires_in_prompt: هیچ وقت
+    generate: ساختن
+    max_uses:
+      one: ۱ بار
+      other: "%{count} بار"
+    max_uses_prompt: نامحدود
+    prompt: با ساختن و اشتراک‌گذاری یک پیوند، اجازهٔ دسترسی به این سرور را به دیگران بدهید
+    table:
+      expires_at: تاریخ انقضا
+      uses: استفاده‌ها
+    title: دعوت دیگران
   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: نمی‌توان بیشتر از ۴ تصویر بارگذاری کرد
+  migrations:
+    acct: username@domain حساب تازه
+    currently_redirecting: 'نمایهٔ شما منتقل می‌شود به:'
+    proceed: ذخیره
+    updated_msg: تنظیمات نقل مکان حساب شما با موفقیت به‌روز شد!
+  moderation:
+    title: مدیریت
   notification_mailer:
     digest:
       body: 'خلاصه‌ای از آن‌چه از زمان آخرین بازدید شما در %{since} روی %{instance} رخ داد :'
@@ -491,6 +586,7 @@ fa:
     export: برون‌سپاری داده‌ها
     followers: پیگیران مورد تأیید
     import: درون‌ریزی
+    migrate: انتقال حساب
     notifications: اعلان‌ها
     preferences: ترجیحات
     settings: تنظیمات
@@ -500,11 +596,12 @@ fa:
     open_in_web: بازکردن در وب
     over_character_limit: از حد مجاز %{max} حرف فراتر رفتید
     pin_errors:
-      limit: نوشته‌های ثابت بیش از حد
+      limit: از این بیشتر نمی‌شود نوشته‌های ثابت داشت
       ownership: نوشته‌های دیگران را نمی‌توان ثابت کرد
       private: نوشته‌های غیرعمومی را نمی‌توان ثابت کرد
       reblog: بازبوق‌ها را نمی‌توان ثابت کرد
     show_more: نمایش
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: خصوصی
       private_long: نمایش تنها به پیگیران
@@ -587,12 +684,14 @@ fa:
 
       <p>این نوشته اقتباسی است از <a href="https://github.com/discourse/discourse">سیاست رازداری Discourse</a>.</p>
     title: شرایط استفاده و سیاست رازداری %{instance}
+  themes:
+    default: ماستدون
   time:
     formats:
       default: "%d %b %Y, %H:%M"
   two_factor_authentication:
     code_hint: برای تأیید، کدی را که برنامهٔ تأییدکننده ساخته است وارد کنید
-    description_html: اگر <strong>ورود دومرحله‌ای</strong> را فعال کنید، برای ورود به سیستم به تلفن خود نیاز خواهید داشت تا برایتان یک کد موقتی بسازد
+    description_html: اگر <strong>ورود دومرحله‌ای</strong> را فعال کنید، برای ورود به سیستم به تلفن خود نیاز خواهید داشت تا برایتان یک کد موقتی بسازد.
     disable: غیرفعال‌کردن
     enable: فعال‌کردن
     enabled: ورود دومرحله‌ای فعال است
@@ -603,7 +702,7 @@ fa:
     manual_instructions: 'اگر نمی‌توانید کدها را اسکن کنید و باید آن‌ها را دستی وارد کنید، متن کد امنیتی این‌جاست:'
     recovery_codes: پشتیبان‌گیری از کدهای بازیابی
     recovery_codes_regenerated: کدهای بازیابی با موفقیت ساخته شدند
-    recovery_instructions_html: اگر تلفن خود را گم کردید، می‌توانید با یکی از کدهای بازیابی زیر کنترل حساب خود را به دست بگیرید. این کدها را در جای امنی نگه دارید، مثلاً آن‌ها را چاپ کنید و کنار سایر مدارک مهم خود قرار دهید
+    recovery_instructions_html: اگر تلفن خود را گم کردید، می‌توانید با یکی از کدهای بازیابی زیر کنترل حساب خود را به دست بگیرید. <strong>این کدها را در جای امنی نگه دارید.</strong> مثلاً آن‌ها را چاپ کنید و کنار سایر مدارک مهم خود قرار دهید
     setup: راه اندازی
     wrong_code: کدی که وارد کردید نامعتبر بود! آیا ساعت سرور و ساعت دستگاه شما درست تنظیم شده‌اند؟
   users:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 33a307d74..adcb11f18 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -684,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"
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
new file mode 100644
index 000000000..ca72bf183
--- /dev/null
+++ b/config/locales/gl.yml
@@ -0,0 +1,710 @@
+---
+gl:
+  about:
+    about_hashtag_html: Estas son mensaxes públicas etiquetadas con <strong>#%{hashtag}</strong>. Pode interactuar con elas si ten unha conta nalgures do fediverso.
+    about_mastodon_html: Mastodon é unha rede social que se basea en protocolos web abertos e libres, software de código aberto. É descentralizada como o correo electrónico.
+    about_this: Sobre
+    closed_registrations: O rexistro en esta instancia está pechado en este intre. Porén! Pode atopar unha instancia diferente para obter unha conta e ter acceso exactamente a misma rede desde alí.
+    contact: Contacto
+    contact_missing: Non establecido
+    contact_unavailable: N/A
+    description_headline: Qué é %{domain}?
+    domain_count_after: outras instancias
+    domain_count_before: Conectada a
+    extended_description_html: |
+      <h3>Un bo lugar para regras</h3>
+      <p>A descrición extendida aínda non se proporcionou.</p>
+    features:
+      humane_approach_body: Aprendendo dos erros de outras redes, Mastodon intenta tomar decisións éticas de deseño para loitar contra os usos incorrectos da rede.
+      humane_approach_title: Unha aproximación máis humana
+      not_a_product_body: Mastodon non é unha rede comercial. Sen anuncios, sen minería de datos, sen xardíns privados. Non hai autoridade centralizada.
+      not_a_product_title: Vostede é unha persona, non un producto
+      real_conversation_body: Con 500 caracteres a súa disposición e soporte para contido ao por menor e avisos sobre o contido, pode expresarse vostede do xeito que queira.
+      real_conversation_title: Construído para conversacións reais
+      within_reach_body: Existen múltiples aplicativos para iOS, Android e outras plataformas grazas a un entorno API amigable para o desenvolvedor que lle permite estar ao tanto cos seus amigos en calquer lugar.
+      within_reach_title: Sempre en contacto
+    find_another_instance: Atope outra instancia
+    generic_description: "%{domain} é un servidor na rede"
+    hosted_on: Mastodon aloxado en %{domain}
+    learn_more: Coñeza máis
+    other_instances: Listado de instancias
+    source_code: Código fonte
+    status_count_after: estados
+    status_count_before: Quen escribeu
+    user_count_after: usuarias
+    user_count_before: Inicio de
+    what_is_mastodon: Qué é Mastodon?
+  accounts:
+    follow: Seguir
+    followers: Seguidoras
+    following: Seguindo
+    media: Medios
+    moved_html: "%{name} mudouse a %{new_profile_link}:"
+    nothing_here: Nada por aquí!
+    people_followed_by: Personas que segue %{name}
+    people_who_follow: Personas que seguen a %{name}
+    posts: Mensaxes
+    posts_with_replies: Toots e respostas
+    remote_follow: Seguimento remoto
+    reserved_username: O nome de usuaria está reservado
+    roles:
+      admin: Admin
+      moderator: Mod
+    unfollow: Deixar de seguir
+  admin:
+    account_moderation_notes:
+      account: Moderador
+      create: Crear
+      created_at: Data
+      created_msg: Nota a moderación creada con éxito!
+      delete: Eliminar
+      destroyed_msg: Nota a moderación destruída con éxito!
+    accounts:
+      are_you_sure: Está segura?
+      by_domain: Dominio
+      confirm: Confirmar
+      confirmed: Confirmado
+      demote: Degradar
+      disable: Deshabilitar
+      disable_two_factor_authentication: Deshabilitar 2FA
+      disabled: Deshabilitado
+      display_name: Mostrar nome
+      domain: Dominio
+      edit: Editar
+      email: E-mail
+      enable: Habilitar
+      enabled: Habilitado
+      feed_url: URL fonte
+      followers: Seguidoras
+      followers_url: URL das seguidoras
+      follows: Segue
+      inbox_url: URL da Caixa de entrada
+      ip: IP
+      location:
+        all: Todo
+        local: Local
+        remote: Remoto
+        title: Lugar
+      login_status: Estado da conexión
+      media_attachments: Anexos de medios
+      memorialize: Convertir a lembranza
+      moderation:
+        all: Todo
+        silenced: Acalado
+        suspended: Suspendido
+        title: Moderación
+      moderation_notes: Notas de moderación
+      most_recent_activity: Actividade máis recente
+      most_recent_ip: IP máis recente
+      not_subscribed: Non suscrita
+      order:
+        alphabetic: Alfabética
+        most_recent: Máis recente
+        title: Orde
+      outbox_url: URL caixa de saída
+      perform_full_suspension: Suspender completamente
+      profile_url: URL do perfil
+      promote: Promocionar
+      protocol: Protocolo
+      public: Público
+      push_subscription_expires: A suscrición PuSH caduca
+      redownload: Actualizar avatar
+      reset: Restablecer
+      reset_password: Restablecer contrasinal
+      resubscribe: Voltar a suscribir
+      role: Permisos
+      roles:
+        admin: Administrador
+        moderator: Moderador
+        staff: Membresía
+        user: Usuaria
+      salmon_url: URL Salmon
+      search: Busca
+      shared_inbox_url: URL da caixa de entrada compartida
+      show:
+        created_reports: Informes creados por esta conta
+        report: informar
+        targeted_reports: Informes feitos sobre esta conta
+      silence: Acalar
+      statuses: Estados
+      subscribe: Subscribir
+      title: Contas
+      undo_silenced: Desfacer acalar
+      undo_suspension: Desfacer suspensión
+      unsubscribe: Non subscribir
+      username: Nome de usuaria
+      web: Web
+    action_logs:
+      actions:
+        confirm_user: "%{name} comfirmou o enderezo de correo da usuaria %{target}"
+        create_custom_emoji: "%{name} subeu un novo emoji %{target}"
+        create_domain_block: "%{name} bloqueou o dominio %{target}"
+        create_email_domain_block: "%{name} engadeu a lista negra o dominio de correo %{target}"
+        demote_user: "%{name} degradou a usuaria %{target}"
+        destroy_domain_block: "%{name} desbloqueou o dominio %{target}"
+        destroy_email_domain_block: "%{name} meteu na lista blanca de correo o dominio %{target}"
+        destroy_status: "%{name} eliminou o estado de %{target}"
+        disable_2fa_user: "%{name} deshabilitou o requerimento 2FA para usuaria %{target}"
+        disable_custom_emoji: "%{name} deshabilitou emoji %{target}"
+        disable_user: "%{name} deshabilitou a conexión para a usuaria  %{target}"
+        enable_custom_emoji: "%{name} habilitou emoji %{target}"
+        enable_user: "%{name} habilitou a conexión para a usuaria %{target}"
+        memorialize_account: "%{name} converteu a conta de  %{target} nunha páxina para a lembranza"
+        promote_user: "%{name} promoveu a usuaria %{target}"
+        reset_password_user: "%{name} restableceu o contrasinal da usuaria %{target}"
+        resolve_report: "%{name} rexeitou o informe %{target}"
+        silence_account: "%{name} acalou a conta de %{target}"
+        suspend_account: "%{name} suspendeu a conta de %{target}"
+        unsilence_account: "%{name} deulle voz a conta de %{target}"
+        unsuspend_account: "%{name} activou a conta de %{target}"
+        update_custom_emoji: "%{name} actualizou emoji %{target}"
+        update_status: "%{name} actualizou un estado de %{target}"
+      title: Rexistro de auditoría
+    custom_emojis:
+      by_domain: Dominio
+      copied_msg: Creouse con éxito unha copia local dos emoji
+      copy: Copiar
+      copy_failed_msg: Non se puido facer copia local de ese emoji
+      created_msg: Creou o emoji con satisfactoriamente!
+      delete: Eliminar
+      destroyed_msg: Emojo destruído satisfactoriamente!
+      disable: Deshabilitar
+      disabled_msg: Deshabilitouse correctamente ese emoji
+      emoji: Emoji
+      enable: Habilitar
+      enabled_msg: Habilitouse correctamente ese emoji
+      image_hint: PNG ate 50KB
+      listed: Listado
+      new:
+        title: Engadir novo emoji personalizado
+      overwrite: Sobrescribir
+      shortcode: Código corto
+      shortcode_hint: Cando menos 2 caracteres, só caracteres alfanuméricos e subliñados
+      title: Emojis personalizados
+      unlisted: Non listado
+      update_failed_msg: Non se puido actualizar ese emoji
+      updated_msg: Actualizouse correctamente o emoji!
+      upload: Subir
+    domain_blocks:
+      add_new: Engadir novo
+      created_msg: Estase a procesar o bloqueo do dominio
+      destroyed_msg: Desfixose a acción de bloqueo de dominio
+      domain: Dominio
+      new:
+        create: Crear bloque
+        hint: O bloqueo do dominio non previrá a creación de entradas de contas na base de datos, pero aplicará de xeito retroactivo e automático regras específicas de moderación sobre esas contas.
+        severity:
+          desc_html: "<strong>Silenciar</strong> fará invisibles as mensaxes das contas para calquera que non os siga. <strong>Suspender</strong> eliminará todo o contido das contas, ficheiros de medios, e datos de perfil. Utilice <strong>Ningún</strong> si só quere rexeitar ficheiros de medios."
+          noop: Ningún
+          silence: Silenciar
+          suspend: Suspender
+        title: Novo bloqueo de dominio
+      reject_media: Rexeitar ficheiros de medios
+      reject_media_hint: Eliminar ficheiros de medios almacenados localmente e rexeita descargalos no futuro. Irrelevante para as suspensións
+      severities:
+        noop: Ningún
+        silence: Silenciar
+        suspend: Suspender
+      severity: Severidade
+      show:
+        affected_accounts:
+          one: Afectoulle a unha conta na base de datos
+          other: Afectoulle a %{count} contas na base de datos
+        retroactive:
+          silence: Non silenciar todas as contas existentes de este dominio
+          suspend: Non suspender todas as contas existentes de este dominio
+        title: Desfacer o bloqueo de dominio para %{domain}
+        undo: Desfacer
+      title: Bloqueos de domino
+      undo: Desfacer
+    email_domain_blocks:
+      add_new: Engadir novo
+      created_msg: Engadeuse correctamente o dominio de email a lista negra
+      delete: Eliminar
+      destroyed_msg: Eliminouse correctamente o dominio de e-mail da lista negra
+      domain: Dominio
+      new:
+        create: Engadir dominio
+        title: Nova entrada la lista negra de e-mail
+      title: Lista negra de E-mail
+    instances:
+      account_count: Contas coñecidas
+      domain_name: Dominio
+      reset: Restablecer
+      search: Buscar
+      title: Instancias coñecidas
+    invites:
+      filter:
+        all: Todo
+        available: Dispoñible
+        expired: Cadudado
+        title: Filtro
+      title: Convida
+    reports:
+      action_taken_by: Acción tomada por
+      are_you_sure: Está segura?
+      comment:
+        label: Comentario
+        none: Nada
+      delete: Eliminar
+      id: ID
+      mark_as_resolved: Marcar como resolto
+      nsfw:
+        'false': Non agochar anexos de medios
+        'true': Agochar anexos de medios
+      report: 'Informe #%{id}'
+      report_contents: Contidos
+      reported_account: Conta reportada
+      reported_by: Reportada por
+      resolved: Resolto
+      silence_account: Acalar conta
+      status: Estado
+      suspend_account: Suspender conta
+      target: Obxetivo
+      title: Informes
+      unresolved: Non resolto
+      view: Vista
+    settings:
+      bootstrap_timeline_accounts:
+        desc_html: Separar múltiples nomes de usuaria con vírgulas. Só funcionarán as contas locais non bloqueadas. Si baldeiro, por omisión son todos os local admin.
+        title: Seguimentos por omisión para novas usuarias
+      contact_information:
+        email: e-mail de traballo
+        username: Nome de usuaria de contacto
+      registrations:
+        closed_message:
+          desc_html: Mostrado na páxina de portada cando o rexistro está pechado. Pode utilizar etiquetas HTML
+          title: Mensaxe de rexistro pechado
+        deletion:
+          desc_html: Permitirlle a calquera que elimine a súa conta
+          title: Abrir o borrado da conta
+        min_invite_role:
+          disabled: Ninguén
+          title: Permitir convites por
+        open:
+          desc_html: Permitir que calquera poida crear unha conta
+          title: Abrir rexistro
+      show_staff_badge:
+        desc_html: Mostrar unha insignia de membresía nunha páxina de usuaria
+        title: Mostrar insigna de membresía
+      site_description:
+        desc_html: Parágrafo de presentación na páxina principal e nas meta etiquetas. Pode utilizar etiquetas HTML, en particular <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
+        title: Descrición da instancia
+      site_description_extended:
+        desc_html: Un bo lugar para o seu código de conducta, regras, guías e outras cousas que distingan a súa instancia. Pode utilizar etiquetas HTML
+        title: Información extendida da personalización
+      site_terms:
+        desc_html: Pode escribir a súa propia política de intimidade, termos de servizo ou aclaracións legais. Pode utilizar etiquetas HTML
+        title: Termos de servizo personalizados
+      site_title: Nome da instancia
+      thumbnail:
+        desc_html: Utilizado para vistas previsas vía OpenGraph e API. Recoméndase 1200x630px
+        title: Icona da instancia
+      timeline_preview:
+        desc_html: Mostrar liña de tempo pública na páxina de inicio
+        title: vista previa da liña temporal
+      title: Axustes do sitio
+    statuses:
+      back_to_account: Voltar a páxina da conta
+      batch:
+        delete: Eliminar
+        nsfw_off: NSFW apagado
+        nsfw_on: NSFW acendido
+      execute: Executar
+      failed_to_execute: Fallou a execución
+      media:
+        hide: Agochar medios
+        show: Mostar medios
+        title: Medios
+      no_media: Sen medios
+      title: Estados da conta
+      with_media: con medios
+    subscriptions:
+      callback_url: URL de chamada
+      confirmed: Confirmado
+      expires_in: Caduca en
+      last_delivery: Última entrega
+      title: WebSub
+      topic: Asunto
+    title: Administración
+  admin_mailer:
+    new_report:
+      body: "%{reporter} informou sobre %{target}"
+      subject: Novo informe sobre %{instance} (#%{id})
+  application_mailer:
+    salutation: "%{name},"
+    settings: 'Mudar as preferencias de e-mail: %{link}'
+    signature: Notificacións Mastodon de %{instance}
+    view: 'Vista:'
+  applications:
+    created: Creouse con éxito este aplicativo
+    destroyed: Eliminouse con éxito o aplicativo
+    invalid_url: A URL proporcionada non é válida
+    regenerate_token: Votar a xenerar o testemuño de acceso
+    token_regenerated: Rexenerouse con éxito o testemuño de acceso
+    warning: Teña moito tino con estos datos. Nunca os comparta con ninguén!
+    your_token: O seu testemuño de acceso
+  auth:
+    agreement_html: Rexistrándose acorda seguir <a href="%{rules_path}">as normas da instancia</a> e <a href="%{terms_path}">os termos do servizo</a>.
+    change_password: Seguridade
+    delete_account: Eliminar conta
+    delete_account_html: Se desexa eliminar a súa conta, pode <a href="%{path}">facelo aquí</a>. Pediráselle confirmación.
+    didnt_get_confirmation: Non recibeu as instruccións de confirmación?
+    forgot_password: Esqueceu o contrasinal?
+    invalid_reset_password_token: O testemuño para restablecer o contrasinal non é válido ou caducou. Por favor solicite un novo.
+    login: Conectar
+    logout: Desconectar
+    migrate_account: Mover a unha conta diferente
+    migrate_account_html: Si desexa redirixir esta conta hacia outra diferente, pode <a href="%{path}">configuralo aquí</a>.
+    register: Rexistro
+    resend_confirmation: Voltar a enviar intruccións de confirmación
+    reset_password: Restablecer contrasinal
+    set_new_password: Establecer novo contrasinal
+  authorize_follow:
+    error: Desgraciadamente, algo fallou ao buscar a conta remota
+    follow: Seguir
+    follow_request: 'Enviou unha petición de seguimento a:'
+    following: 'Parabéns! Está a seguir a:'
+    post_follow:
+      close: Ou, pode pechar esta ventá.
+      return: Voltar ao perfil da usuaria
+      web: Ir a web
+    title: Seguir %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}h"
+      about_x_months: "%{count}mes"
+      about_x_years: "%{count}a"
+      almost_x_years: "%{count}a"
+      half_a_minute: Agora
+      less_than_x_minutes: "%{count}m"
+      less_than_x_seconds: Agora
+      over_x_years: "%{count}a"
+      x_days: "%{count}d"
+      x_minutes: "%{count}m"
+      x_months: "%{count}mes"
+      x_seconds: "%{count}s"
+  deletes:
+    bad_password_msg: Bo intento, hackers! Contrasinal incorrecto
+    confirm_password: Introduza o seu contrasinal para verificar a súa identidade
+    description_html: Esto eliminará de xeito <strong>permanente e irreversible</strong> o contido da súa conta e será desactivada. O seu nome de usuaria permanecerá reservado para evitar futuras confusións de identidades.
+    proceed: Eliminar conta
+    success_msg: A súa conta eliminouse correctamente
+    warning_html: Só se garantiza a eliminación de contido de esta instancia. O contido que foi compartido con outras instancias é probable que deixe rastros. O servidores fora de liña e servidores que se desuscribiron das súas actualizacións non actualizarán as súas bases de datos.
+    warning_title: Dispoñibilidade do contido espallado
+  errors:
+    '403': Non ten permiso para ver esta páxina.
+    '404': A páxina que está a buscar non existe.
+    '410': A páxina que busca xa non existe.
+    '422':
+      content: Fallou a verificación de seguridade. Está bloqueando as cookies?
+      title: Fallou a verficación de seguridade
+    '429': Acelerado
+    '500':
+      content: Sentímolo, pero algo do noso lado falloou.
+      title: Esta páxina non é correcta
+    noscript_html: Para utilizar a aplicación web de Mastodon debe habilitar JavaScript. De xeito alternativo, intente unha das <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">apps nativas</a> para Mastodon da súa plataforma.
+  exports:
+    blocks: A bloquear
+    csv: CSV
+    follows: A seguir
+    mutes: Acalou
+    storage: Almacenamento de medios
+  followers:
+    domain: Dominio
+    explanation_html: Se quere asegurar a intimidade dos seus estados, debe ser consciente de quen a está a seguir. <strong>Os seus estados privados son enviados a todas as instancias onde ten seguidoras</strong>. Podería querer revisalas, e elminar seguidoras si non confía que a súa intimidade sexa respetada polos administradores ou o software de esa instancia.
+    followers_count: Número de seguidoras
+    lock_link: Bloquear a súa conta
+    purge: Eliminar das seguidoras
+    success:
+      one: En proceso de bloquear seguidoras de un dominio...
+      other: No proceso de bloquear seguidoras de %{count} dominios...
+    true_privacy_html: Por favor teña en conta que <strong>a verdadeira intimidade só pode ser conseguida con cifrado de extremo-a-extremo</strong>.
+    unlocked_warning_html: Calquera pode seguila para inmediatamente ver os seus estados privados. %{lock_link} para poder revisar e rexeitar seguidoras.
+    unlocked_warning_title: A súa conta non está pechada
+  generic:
+    changes_saved_msg: Cambios gardados correctamente!!
+    powered_by: a funcionar grazas a %{link}
+    save_changes: Gardar cambios
+    validation_errors:
+      one: Algo non está ben de todo! Por favor revise abaixo o erro
+      other: Algo aínda non está ben! Por favor revise os %{count} erros abaixo
+  imports:
+    preface: Pode importar os datos que exportou de outra instancia, tales como a lista de usuarias que está a seguir ou bloquear.
+    success: Os seus datos foron correctamente subidos e serán procesados ao momento
+    types:
+      blocking: Lista de bloqueo
+      following: Lista de seguimento
+      muting: Lista de usuarias acaladas
+    upload: Subir
+  in_memoriam_html: Lembranzas.
+  invites:
+    delete: Desactivar
+    expired: Caducou
+    expires_in:
+      '1800': 30 minutos
+      '21600': 6 horas
+      '3600': 1 hora
+      '43200': 12 horas
+      '86400': 1 día
+    expires_in_prompt: Nunca
+    generate: Xerar
+    max_uses:
+      one: 1 uso
+      other: "%{count} usos"
+    max_uses_prompt: Sen límite
+    prompt: Xerar e compartir ligazóns con outras para permitir acceso a esta instancia
+    table:
+      expires_at: Caduca
+      uses: Usos
+    title: Convidar xente
+  landing_strip_html: "<strong>%{name}</strong> é unha usuaria en %{link_to_root_path}.  Pode seguilas ou interactuar con elas si ten unha conta en algún lugar do fediverso."
+  landing_strip_signup_html: Si non, pode <a href="%{sign_up_path}">rexistrarse aquí</a>.
+  lists:
+    errors:
+      limit: Acadou o número máximo de listas
+  media_attachments:
+    validations:
+      images_and_video: Non pode anexar un vídeo a un estado que xa contén imaxes
+      too_many: Non pode anexar máis de 4 ficheiros
+  migrations:
+    acct: nomeusuaria@dominio da nova conta
+    currently_redirecting: 'O seu perfil está listo para redirixir a:'
+    proceed: Gardar
+    updated_msg: O axuste de migración da conta actualizouse correctamente!
+  moderation:
+    title: Moderación
+  notification_mailer:
+    digest:
+      body: 'Aquí ten un breve sumario do que perdeu en %{instance} desde a última visita en %{since}:'
+      mention: "%{name} mencionouna en:"
+      new_followers_summary:
+        one: Ten unha nova seguidora! Ben!
+        other: Obtivo %{count} novas seguidoras! Tremendo!
+      subject:
+        one: "1 nova notificación desde a súa última visita \U0001F418"
+        other: "%{count} novas notificacións desde a súa última visita \U0001F418"
+    favourite:
+      body: 'O seu estado foi marcado favorito por %{name}:'
+      subject: "%{name} marcou favorito o seu estado"
+    follow:
+      body: "%{name} agora está a seguila!"
+      subject: "%{name} agora está a seguila"
+    follow_request:
+      body: "%{name} solicitou poder seguila"
+      subject: 'Seguidora pendente: %{name}'
+    mention:
+      body: 'Foi mencionada por %{name} en:'
+      subject: Vostede foi mencionada por %{name}
+    reblog:
+      body: 'O seu estado foi promocionado por %{name}:'
+      subject: "%{name} promocionou o seu estado"
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
+  pagination:
+    next: Seguinte
+    prev: Previo
+    truncate: "&hellip;"
+  preferences:
+    languages: Idiomas
+    other: Outro
+    publishing: Publicando
+    web: Web
+  push_notifications:
+    favourite:
+      title: "%{name} marcou favorito o seu estado"
+    follow:
+      title: "%{name} agora está a seguila"
+    group:
+      title: "%{count} notificacións"
+    mention:
+      action_boost: Promover
+      action_expand: Mostar máis
+      action_favourite: Favorito
+      title: "%{name} mencionouna"
+    reblog:
+      title: "%{name} promocionou un dos seus estados"
+  remote_follow:
+    acct: Introduza o seu nomedeusuaria@dominio desde onde quere facer seguimento
+    missing_resource: Non se puido atopar o URL de redirecionamento requerido para a súa conta
+    proceed: Proceda para seguir
+    prompt: 'Vostede vai seguir:'
+  sessions:
+    activity: Última actividade
+    browser: Navegador
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      firefox: Firefox
+      generic: Navegador descoñecido
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Navegador Nokia S40 Ovi
+      opera: Opera
+      phantom_js: PhantomJS
+      qq: Navegador QQ
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Sesión actual
+    description: "%{browser} en %{platform}"
+    explanation: Estos son os navegadores web nos que actualmente ten sesión aberta.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      other: plataforma descoñecida
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Revocar
+    revoke_success: A sesión revocouse con éxito
+    title: Sesións
+  settings:
+    authorized_apps: Apps autorizados
+    back: Voltar a Mastodon
+    delete: Eliminación da conta
+    development: Desenvolvemento
+    edit_profile: Editar perfil
+    export: Exportar datos
+    followers: Seguidoras autorizadas
+    import: Importar
+    migrate: Migrar conta
+    notifications: Notificacións
+    preferences: Preferencias
+    settings: Axustes
+    two_factor_authentication: Validar Doble Factor
+    your_apps: Os seus aplicativos
+  statuses:
+    open_in_web: Abrir na web
+    over_character_limit: Excedeu o límite de caracteres %{max}
+    pin_errors:
+      limit: Xa fixou o número máximo permitido de mensaxes
+      ownership: Non pode fixar a mensaxe de outra usuaria
+      private: As mensaxes non-públicas non poden ser fixadas
+      reblog: Non se poden fixar as mensaxes promovidas
+    show_more: Mostrar máis
+    title: '%{name}: "%{quote}"'
+    visibilities:
+      private: Só seguidoras
+      private_long: Mostrar só as seguidoras
+      public: Público
+      public_long: Visible para calquera
+      unlisted: Non listado
+      unlisted_long: Visible para calquera, pero non listado en liñas de tempo públicas
+  stream_entries:
+    click_to_show: Pulse para mostrar
+    pinned: Mensaxe fixada
+    reblogged: promocionada
+    sensitive_content: Contido sensible
+  terms:
+    body_html: |
+      <h2>Política de intimidade</h2>
+
+      <h3 id="collect">Qué información recollemos?</h3>
+
+      <p>Recollemos información sobre vostede cando se rexistra no noso sitio web e recollemos datos cando participa no foro lendo, escribindo e evaluando o contido compartido aquí. </p>
+
+      <p>Cando se rexistra no noso sitio, podería solicitarselle o seu nome e enderezo de correo electrónico. Vostede podería, porén, visitar o noso sitio sin rexistrarse. O seu enderezo de correo será verificado con un correo con unha ligazón única. Si esa ligazón é visitada, saberemos que vostede controla ese enderezo de correo.</p>
+
+      <p>Cando se rexistra e publica, almacenamos o enderezo IP desde onde publicou. Poderiamos tamén gardar rexistros do servidor que inclúan a IP de cada petición ao realizada ao servidor. </p>
+
+      <h3 id="use">Con qué fin utilizamos a súa información?</h3>
+
+      <p>Toda a información recollida de vostede podería ser utilizada dos seguintes xeitos:</p>
+
+      <ul>
+        <li>Para individualizar a súa experiencia  &mdash; a súa información axúdanos a respostar mellor as súas necesidades individuais.</li>
+        <li>Para mellorar o noso sitio &mdash;esforzámonos en mellorar o que ofrece o noso sitio baseándonos na información e críticas que vostede nos proporciona.</li>
+        <li>Para mellorar o servizo ao cliente &mdash;a súa información axúdanos a respostar máis eficientemente as súas peticións de servizo ao cliente e axuda.</li>
+        <li>Para enviar correos electrónicos periodicamente &mdash; O enderezo de correo que nos proporciona podería ser utilizado para enviarlle información, notificacións que solicitou sobre cambios ou asuntos  ou en resposta ao ser nome de usuaria, responder a enquisas, e/ou outras peticións ou cuestións.</li>
+      </ul>
+
+      <h3 id="protect">Cómo protexemos a súa información?</h3>
+
+      <p>Implementamos varias medidas de seguridade para manter a seguiridade da súa información personal cando introduce, envía ou accede a súa información personal.</p>
+
+      <h3 id="data-retention">Qué é a política de retención dos seus datos?</h3>
+
+      <p>Faremos un sincero esforzo para:</p>
+
+      <ul>
+        <li>Manter rexistros do sistema con enderezos IP de todas as peticións feitas a este servidor no seu nome non máis de 90 días.</li>
+        <li>Manter os enderezos IP asociados a usuarias rexistradas e as súas mensaxes non máis de 5 anos. </li>
+      </ul>
+
+      <h3 id="cookies">Utilizamos cookies?</h3>
+
+      <p>Si. As cookies son pequenos ficheiros que un sitio ou o seu proveedor de servizo transfire ao disco duro da súa computadora a través do navegador web (se vostede o permite). Estas cookies permiten ao sitio recoñer o seu navegador e, si ten unha conta rexistrada, asocialo coa súa conta.</p>
+
+      <p>Utilizamos cookies para comprender e gardar as súas preferencias para futuras visitas e compilar datos agregados sobre o tráfico do sitio e interacción co sitio de tal xeito que no futuro poidamos ofrecer unha mellor experiencia de uso do sitio e ferramentas. Poderiamos contratar servizos de terceiros para axudarnos a entender mellor as nosas visitantes. Estos proveedores de servizo non teñen permiso para utilizar a información recollida no noso nome excepto para axudarnos a xestionar e mellorar o noso negocio. </p>
+
+      <h3 id="disclose">Mostramos información a terceiros alleos?</h3>
+
+      <p>Non vendemos, nin negociamos con, ou transmitimos de outros xeitos a axentes terceiros alleos a información que a información que a identifica personalmente. Esto non inclúe terceiros de confianza que non axudan a operar o sitio, xestionar o negocio, ou servila, así estas partes se comprometan coa confidencialidade dos datos. Poderiamos  revelar a súa información cando creamos que facelo así é axeitado para cumplir coa lei, cumplir coas normas do sitio ou protexer os nosos dereitos, propiedades ou seguridade e os de outras. Porén, non se proporcionará información identificable a terceiros para publicidade, márquetin ou outros usos.</p>
+
+      <h3 id="third-party">Ligazóns a terceiros</h3>
+
+      <p>De xeito ocasional, a nosa discreción, poderiamos incluír ofertas de productos e servizos de terceiros no noso sitio. Estos sitios de terceiros teñen políticas de intimidade propias. Polo tanto non temos responsabilidade ou obligacións polo contido e actividades de esos sitios. Con todo, procuramos protexer a integridade do noso sitio e agradecemos calquer opinión e crítica sobre estos sitios.</p>
+
+      <h3 id="coppa">Cumplimento coa Children's Online Privacy Protection Act</h3>
+
+      <p>O noso sitio, productos e servizos están dirixidos as personas con 13 anos como mínimo. Si este servidor está en USA e vostede ten menos de 13 anos, a requerimento da COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) non utilice este sitio web.</p>
+
+      <h3 id="online">Política de intimidade só en liña</h3>
+
+      <p>Esta política de intimidade aplícase só a información recollida no noso sitio e non a información recollida fora de liña. </p>
+
+      <h3 id="consent">O seu consentimento</h3>
+
+      <p>Utilizando o noso sitio, vostede acepta esta política de intimidade.</p>
+
+      <h3 id="changes">Cambios na política de intimidade</h3>
+
+      <p>Si decidimos cambiar a nosa política de intimidade publicaremos esos cambios en esta páxina.</p>
+
+      <p>Este documento ten licenza CC-BY-SA. Foi actualizado o 31 de maio de 2013.</p>
+
+      <p>Adaptado do orixinal <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
+    title: "%{instance} Termos do Servizo e Política de Intimidade"
+  themes:
+    default: Mastodon
+  time:
+    formats:
+      default: "%d %b, %Y, %H:%M"
+  two_factor_authentication:
+    code_hint: Introducir o código xerado polo seu aplicativo de autenticación para confirmar
+    description_html: Si habilita a <strong>autenticación de doble factor</strong>, a conexión pediralle estar en posesión do seu teléfono, que xerará testemuños para poder entrar.
+    disable: Deshabilitar
+    enable: Habilitar
+    enabled: A autenticación de doble-factor está habilitada
+    enabled_success: Habilitouse con éxito a autenticación de doble-factor
+    generate_recovery_codes: Xerar códigos de recuperación
+    instructions_html: "<strong>Escanee este código QR en Google Authenticator ou aplicativo TOTP similar no seu teléfono</strong>. Desde agora, este aplicativo xerará testemuños que vostede deberá introducir ao conectarse."
+    lost_recovery_codes: Os códigos de recuperación permítenlle recuperar o acceso a súa conta si perde o teléfono. Si perde os códigos de recuperación, pode restauralos aquí. Os seus códigos de recuperación anteriores serán invalidados.
+    manual_instructions: 'Si non pode escanear o código QR e precisa introducilo manualmente, aquí está o testemuño secreto en texto plano:'
+    recovery_codes: Códigos de recuperación do respaldo
+    recovery_codes_regenerated: Códigos de recuperación xerados correctamente
+    recovery_instructions_html: Si perdese o acceso ao seu teléfono, pode utilizar un dos códigos inferiores de recuperación para recuperar o acceso a súa conta. <strong>Garde os códigos en lugar seguro</strong>. Por exemplo, pode imprimilos e gardalos xunto con outros documentos importantes.
+    setup: Configurar
+    wrong_code: O código introducido non é válido! Son correctas as horas no dispositivo e o servidor?
+  users:
+    invalid_email: O enderezo de correo non é válido
+    invalid_otp_token: Código de doble-factor non válido
+    signed_in_as: 'Rexistrada como:'
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index f3f23b8f6..44b89e859 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -351,7 +351,7 @@ ja:
     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> から手続きが行えます。削除する前に、確認画面があります。
@@ -432,6 +432,7 @@ ja:
     changes_saved_msg: 正常に変更されました!
     powered_by: powered by %{link}
     save_changes: 変更を保存
+    use_this: これを使う
     validation_errors:
       one: エラーが発生しました! 以下のエラーを確認してください
       other: エラーが発生しました! 以下の%{count}個のエラーを確認してください
@@ -464,6 +465,14 @@ ja:
       expires_at: 有効期限
       uses: 使用
     title: 新規ユーザーの招待
+  keyword_mutes:
+    add_keyword: キーワードを追加
+    edit: 編集
+    edit_keyword: キーワードを編集
+    keyword: キーワード
+    match_whole_word: 単語全体が一致
+    remove: 削除
+    remove_all: すべて削除
   landing_strip_html: "<strong>%{name}</strong> さんはインスタンス %{link_to_root_path} のユーザーです。アカウントさえ持っていればフォローしたり会話したりできます。"
   landing_strip_signup_html: もしお持ちでないなら <a href="%{sign_up_path}">こちら</a> からサインアップできます。
   lists:
@@ -590,6 +599,7 @@ ja:
     development: 開発
     edit_profile: プロフィールを編集
     export: データのエクスポート
+    flavours: フレーバー
     followers: 信頼済みのインスタンス
     import: データのインポート
     migrate: アカウントの引っ越し
@@ -607,6 +617,7 @@ ja:
       private: 非公開のトゥートを固定することはできません
       reblog: ブーストされたトゥートを固定することはできません
     show_more: もっと見る
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: 非公開
       private_long: フォロワーにのみ表示されます
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 9e3505a72..997dc4856 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -48,8 +48,8 @@ ko:
     remote_follow: 리모트 팔로우
     reserved_username: 이 아이디는 예약되어 있습니다.
     roles:
-      admin: Admin
-      moderator: 모드
+      admin: 관리자
+      moderator: 모더레이터
     unfollow: 팔로우 해제
   admin:
     account_moderation_notes:
@@ -105,7 +105,7 @@ ko:
       perform_full_suspension: 완전히 정지시키기
       profile_url: 프로필 URL
       promote: 모더레이터로 승급
-      protocol: Protocol
+      protocol: 프로토콜
       public: 전체 공개
       push_subscription_expires: PuSH 구독 기간 만료
       redownload: 아바타 업데이트
@@ -133,7 +133,7 @@ ko:
       undo_suspension: 정지 해제
       unsubscribe: 구독 해제
       username: 아이디
-      web: Web
+      web: 웹
     action_logs:
       actions:
         confirm_user: "%{name}이 %{target}의 이메일 주소를 컨펌했습니다"
@@ -338,9 +338,12 @@ ko:
       body: "%{reporter} 가 %{target} 를 신고했습니다"
       subject: "%{instance} 에 새 신고 등록됨 (#%{id})"
   application_mailer:
+    notification_preferences: 메일 설정 변경
     settings: '메일 설정을 변경: %{link}'
     signature: Mastodon %{instance} 인스턴스로에서 알림
     view: 'View:'
+    view_profile: 프로필 보기
+    view_status: 게시물 보기
   applications:
     created: 애플리케이션이 작성되었습니다.
     destroyed: 애플리케이션이 삭제되었습니다.
@@ -481,6 +484,7 @@ ko:
     title: 모더레이션
   notification_mailer:
     digest:
+      action: 모든 알림 보기
       body: "%{instance} 에서 마지막 로그인 뒤로 일어난 일:"
       mention: "%{name} 님이 답장했습니다:"
       new_followers_summary:
@@ -489,21 +493,29 @@ ko:
       subject:
         one: "1건의 새로운 알림 \U0001F418"
         other: "%{count}건의 새로운 알림 \U0001F418"
+      title: 당신이 없는 동안에…
     favourite:
       body: "%{name} 님이 내 툿을 즐겨찾기에 등록했습니다."
       subject: "%{name} 님이 내 툿을 즐겨찾기에 등록했습니다"
+      title: 새 즐겨찾기
     follow:
       body: "%{name} 님이 나를 팔로우 했습니다"
       subject: "%{name} 님이 나를 팔로우 했습니다"
+      title: 새 팔로워
     follow_request:
+      action: 팔로우 요청 관리
       body: "%{name} 님이 내게 팔로우 요청을 보냈습니다."
       subject: "%{name} 님이 보낸 팔로우 요청"
+      title: 새 팔로우 요청
     mention:
+      action: 답장
       body: "%{name} 님이 답장을 보냈습니다:"
       subject: "%{name} 님이 답장을 보냈습니다"
+      title: 새 멘션
     reblog:
       body: "%{name} 님이 내 툿을 부스트 했습니다:"
       subject: "%{name} 님이 내 툿을 부스트 했습니다"
+      title: 새 부스트
   number:
     human:
       decimal_units:
@@ -547,38 +559,38 @@ ko:
     activity: 마지막 활동
     browser: 브라우저
     browsers:
-      alipay: Alipay
-      blackberry: Blackberry
-      chrome: Chrome
-      edge: Microsoft Edge
-      firefox: Firefox
+      alipay: 알리페이
+      blackberry: 블랙베리
+      chrome: 크롬
+      edge: 엣지
+      firefox: 파이어폭스
       generic: 알 수 없는 브라우저
-      ie: Internet Explorer
+      ie: IE
       micro_messenger: MicroMessenger
-      nokia: Nokia S40 Ovi Browser
-      opera: Opera
+      nokia: 노키아 S40 Ovi 브라우저
+      opera: 오페라
       phantom_js: PhantomJS
-      qq: QQ Browser
-      safari: Safari
+      qq: QQ 브라우저
+      safari: 사파리
       uc_browser: UCBrowser
-      weibo: Weibo
+      weibo: 웨이보
     current_session: 현재 세션
-    description: "%{browser} on %{platform}"
+    description: "%{platform}의 %{browser}"
     explanation: 내 Mastodon 계정에 현재 로그인 중인 웹 브라우저 목록입니다.
     ip: IP
     platforms:
-      adobe_air: Adobe Air
-      android: Android
-      blackberry: Blackberry
-      chrome_os: ChromeOS
-      firefox_os: Firefox OS
+      adobe_air: 어도비 에어
+      android: 안드로이드
+      blackberry: 블랙베리
+      chrome_os: 크롬OS
+      firefox_os: 파이어폭스OS
       ios: iOS
-      linux: Linux
-      mac: Mac
+      linux: 리눅스
+      mac: 맥
       other: 알 수 없는 플랫폼
-      windows: Windows
-      windows_mobile: Windows Mobile
-      windows_phone: Windows Phone
+      windows: 윈도우즈
+      windows_mobile: 윈도우즈 모바일
+      windows_phone: 윈도우즈 폰
     revoke: 삭제
     revoke_success: 세션이 삭제되었습니다.
     title: 세션
@@ -621,8 +633,6 @@ ko:
     sensitive_content: 민감한 컨텐츠
   terms:
     title: "%{instance} 이용약관과 개인정보 취급 방침"
-  themes:
-    default: Mastodon
   time:
     formats:
       default: "%Y년 %m월 %d일 %H:%M"
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 83c556708..a0add9bfa 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -2,7 +2,7 @@
 nl:
   about:
     about_hashtag_html: Dit zijn openbare toots die getagged zijn met <strong>#%{hashtag}</strong>. Je kunt er op reageren of iets anders mee doen als je op Mastodon (of ergens anders in de fediverse) een account hebt.
-    about_mastodon_html: Mastodon is een <em>vrij, gratis en open-source</em> sociaal netwerk. Een <em>gedecentraliseerd</em> alternatief voor commerciële platforms. Het voorkomt de risico's van een enkel bedrijf dat jouw communicatie monopoliseert. Kies een server die je vertrouwt &mdash; welke je ook kiest, je kunt met elke andere server communiceren. Iedereen kan een eigen Mastodon-server draaien en naadloos deelnemen in het <em>sociale netwerk</em>.
+    about_mastodon_html: Mastodon is een sociaal netwerk dat gebruikt maakt van open webprotocollen en vrije software. Het is net zoals e-mail gedecentraliseerd.
     about_this: Over deze server
     closed_registrations: Registreren op deze server is momenteel uitgeschakeld.
     contact: Contact
@@ -684,8 +684,6 @@ nl:
 
       <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: "%d %B %Y om %H:%M"
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 94bd0a592..8aa6d2731 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -116,6 +116,7 @@ pl:
       roles:
         admin: Administrator
         moderator: Moderator
+        staff: Ekipa
         user: Użytkownik
       salmon_url: Adres Salmon
       search: Szukaj
@@ -160,7 +161,7 @@ pl:
         update_status: "%{name} zaktualizował wpis użytkownika %{target}"
       title: Dziennik działań administracyjnych
     custom_emojis:
-      by_domain: Według domeny
+      by_domain: Domeny
       copied_msg: Pomyślnie utworzono lokalną kopię emoji
       copy: Kopiuj
       copy_failed_msg: Nie udało się utworzyć lokalnej kopii emoji
@@ -351,7 +352,7 @@ pl:
     warning: Przechowuj te dane ostrożnie. Nie udostępniaj ich nikomu!
     your_token: Twój token dostępu
   auth:
-    agreement_html: Rejestrując się, oświadczasz, że zapoznałeś się z <a href="%{rules_path}">naszymi zasadami użytkowania</a> i <a href="%{terms_path}">polityką prywatności</a>.
+    agreement_html: Rejestrując się, oświadczasz, że zapoznałeś się z <a href="%{rules_path}">informacjami o instancji</a> i <a href="%{terms_path}">zasadami korzystania z usługi</a>.
     change_password: Bezpieczeństwo
     delete_account: Usunięcie konta
     delete_account_html: Jeżeli chcesz usunąć konto, <a href="%{path}">przejdź tutaj</a>. Otrzymasz prośbę o potwierdzenie.
@@ -432,6 +433,7 @@ pl:
     changes_saved_msg: Ustawienia zapisane!
     powered_by: uruchomione na %{link}
     save_changes: Zapisz zmiany
+    use_this: Użyj tego
     validation_errors:
       one: Coś jest wciąż nie tak! Przyjrzyj się błędowi poniżej
       other: Coś jest wciąż nie tak! Przejrzyj błędy (%{count}) poniżej
@@ -466,6 +468,14 @@ pl:
       expires_at: Wygaśnie po
       uses: Użycia
     title: Zaproś użytkowników
+  keyword_mutes:
+    add_keyword: Dodaj słowo kluczowe
+    edit: Edytuj
+    edit_keyword: Edytuj słowo kluczowe
+    keyword: Słowo kluczowe
+    match_whole_word: Uwzględniaj całe słowo
+    remove: Usuń
+    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:
@@ -596,8 +606,10 @@ pl:
     development: Tworzenie aplikacji
     edit_profile: Edytuj profil
     export: Eksportowanie danych
+    flavours: Odmiany
     followers: Autoryzowani śledzący
     import: Importowanie danych
+    keyword_mutes: Wyciszone słowa
     migrate: Migracja konta
     notifications: Powiadomienia
     preferences: Preferencje
@@ -696,8 +708,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 e83a6cf42..d4bf72da3 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -1,10 +1,10 @@
 ---
 pt-BR:
   about:
-    about_hashtag_html: Estes são toots públicos com a hashtag <strong>#%{hashtag}</strong>. Voce pode interagir com eles se tiver uma conta em qualquer lugar no fediverso.
+    about_hashtag_html: Estes são toots públicos com a hashtag <strong>#%{hashtag}</strong>. Você pode interagir com eles se tiver uma conta em qualquer lugar no fediverso.
     about_mastodon_html: Mastodon é uma rede social baseada em protocolos abertos e software gratuito e de código aberto. É descentralizada como e-mail.
     about_this: Sobre
-    closed_registrations: Cadastros estão atualmente fechados nesta instância. No entanto! Você pode procurar uma instância diferente na qual possa criar uma conta e acessar a mesma rede por lá.
+    closed_registrations: Os cadastros estão atualmente fechados nesta instância. No entanto, você pode procurar uma instância diferente na qual possa criar uma conta e acessar a mesma rede por lá.
     contact: Contato
     contact_missing: Não definido
     contact_unavailable: N/A
@@ -21,15 +21,15 @@ pt-BR:
       not_a_product_title: Você é uma pessoa e não um produto
       real_conversation_body: Com 500 caracteres à sua disposição e suporte para conteúdo granular e avisos de conteúdo, você pode se expressar da maneira que desejar.
       real_conversation_title: Feito para conversas reais
-      within_reach_body: Vários apps para iOS, Android e outras plataformas graças a um ecossistema de API amigável para desenvolvedores proporcionam que você possa se manter atualizado sobre seus amigos de qualquer lugar.
-      within_reach_title: Sempre a seu alcance
+      within_reach_body: Vários apps para iOS, Android e outras plataformas graças a um ecossistema de API amigável para desenvolvedores permitem que você possa se manter atualizado sobre seus amigos de qualquer lugar.
+      within_reach_title: Sempre ao seu alcance
     find_another_instance: Encontre outra instância
     generic_description: "%{domain} é um servidor na rede"
     hosted_on: Mastodon hospedado em %{domain}
     learn_more: Saiba mais
     other_instances: Lista de instâncias
-    source_code: Código fonte
-    status_count_after: postagens
+    source_code: Código-fonte
+    status_count_after: publicações
     status_count_before: Autores de
     user_count_after: usuários
     user_count_before: Casa de
@@ -85,7 +85,7 @@ pt-BR:
         local: Local
         remote: Remoto
         title: Localização
-      login_status: Status de login
+      login_status: Situação de login
       media_attachments: Mídia(s) anexada(s)
       memorialize: Tornar um memorial
       moderation:
@@ -96,13 +96,13 @@ pt-BR:
       moderation_notes: Notas de moderação
       most_recent_activity: Atividade mais recente
       most_recent_ip: IP mais recente
-      not_subscribed: Não inscrito
+      not_subscribed: Não está inscrito
       order:
         alphabetic: Alfabética
         most_recent: Mais recente
         title: Ordem
-      outbox_url: URL da Outbox
-      perform_full_suspension: Efetue suspensão total
+      outbox_url: URL da caixa de saída
+      perform_full_suspension: Aplicar suspensão total
       profile_url: URL do perfil
       promote: Promover
       protocol: Protocolo
@@ -116,19 +116,20 @@ pt-BR:
       roles:
         admin: Administrador
         moderator: Moderador
+        staff: Equipe
         user: Usuário
       salmon_url: URL Salmon
       search: Pesquisar
-      shared_inbox_url: URL da Inbox Compartilhada
+      shared_inbox_url: URL da caixa de entrada compartilhada
       show:
         created_reports: Denúncias criadas por esta conta
         report: relatórios
         targeted_reports: Denúncias feitas sobre esta conta
-      silence: Silêncio
+      silence: Silenciar
       statuses: Postagens
       subscribe: Inscrever-se
       title: Contas
-      undo_silenced: Desativar silêncio
+      undo_silenced: Retirar silenciamento
       undo_suspension: Retirar suspensão
       unsubscribe: Desinscrever-se
       username: Nome de usuário
@@ -160,6 +161,7 @@ pt-BR:
         update_status: "%{name} atualizou o estado de %{target}"
       title: Auditar relatório
     custom_emojis:
+      by_domain: Domínio
       copied_msg: Cópia local do emoji criada com sucesso
       copy: Copiar
       copy_failed_msg: Não foi possível criar uma cópia local deste emoji
@@ -343,7 +345,7 @@ pt-BR:
     warning: Tenha cuidado com estes dados. Nunca compartilhe com alguém!
     your_token: Seu token de acesso
   auth:
-    agreement_html: Cadastrando-se você concorda com <a href="%{rules_path}">nossos termos de serviço</a> e <a href="%{terms_path}">política de privacidade</a>.
+    agreement_html: Cadastrando-se você concorda em seguir <a href="%{rules_path}">as regras da instância</a> e <a href="%{terms_path}">os nossos termos de serviço</a>.
     change_password: Segurança
     delete_account: Excluir conta
     delete_account_html: Se você deseja excluir a sua conta, você pode <a href="%{path}">prosseguir para cá</a>. Uma confirmação será requisitada.
@@ -594,11 +596,12 @@ pt-BR:
     open_in_web: Abrir na web
     over_character_limit: limite de caracteres de %{max} excedido
     pin_errors:
-      limit: Muitos toots fixados
+      limit: Você já fixou o máximo de toots possíveis
       ownership: Toots de outras pessoas não podem ser fixados
       private: Toot não-público não pode ser fixado
       reblog: Um compartilhamento não pode ser fixado
     show_more: Mostrar mais
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: Apenas seguidores
       private_long: Mostrar apenas para seguidores
@@ -681,8 +684,6 @@ pt-BR:
 
       <p>Originalmente adaptado da <a href="https://github.com/discourse/discourse">política de privacidade do Discourse</a>.</p>
     title: "%{instance} Termos de Serviço e Política de Privacidade"
-  themes:
-    default: Mastodon
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index c476bac59..c0056af4f 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -4,16 +4,16 @@ pt:
     about_hashtag_html: Estes são toots públicos marcados com <strong>#%{hashtag}</strong>. Podes interagir com eles se tiveres uma conta Mastodon.
     about_mastodon_html: Mastodon é uma rede social baseada em protocolos abertos da web e software livre e gratuito. É descentralizado como e-mail.
     about_this: Sobre esta instância
-    closed_registrations: Novos registos estão fechados nesta instância.
+    closed_registrations: Novos registos estão fechados nesta instância. No entanto! Podes procurar uma instância diferente na qual criar uma conta e obter acesso à mesma rede desde lá.
     contact: Contacto
-    contact_missing: Não definido
-    contact_unavailable: N/A
+    contact_missing: Não configurado
+    contact_unavailable: n.d.
     description_headline: O que é o %{domain}?
     domain_count_after: outras instâncias
     domain_count_before: Ligado a
     extended_description_html: |
       <h3>Um bom lugar para regras</h3>
-      <p>A descrição da instância ainda não foi feita.</p>
+      <p>A descrição estendida ainda não foi configurada.</p>
     features:
       humane_approach_body: Aprendendo com erros de outras redes sociais, Mastodon tem como objetivo fazer decisões éticas de design para combater o utilização errada de redes sociais.
       humane_approach_title: Uma abordagem mais humana
@@ -87,6 +87,7 @@ pt:
         title: Local
       login_status: Estado de início de sessão
       media_attachments: Media anexa
+      memorialize: Converter em memorial
       moderation:
         all: Todos
         silenced: Silenciados
@@ -100,12 +101,13 @@ pt:
         alphabetic: Alfabética
         most_recent: Mais recente
         title: Ordem
+      outbox_url: URL da caixa de saída
       perform_full_suspension: Fazer suspensão completa
       profile_url: URL do perfil
       promote: Promover
       protocol: Protocolo
       public: Público
-      push_subscription_expires: PuSH subscription expires
+      push_subscription_expires: A Inscrição PuSH expira
       redownload: Atualizar avatar
       reset: Restaurar
       reset_password: Reset palavra-passe
@@ -114,8 +116,9 @@ pt:
       roles:
         admin: Administrador
         moderator: Moderador
+        staff: Equipa
         user: Utilizador
-      salmon_url: Salmon URL
+      salmon_url: URL Salmon
       search: Pesquisar
       shared_inbox_url: URL da caixa de entrada compartilhada
       show:
@@ -124,9 +127,11 @@ pt:
         targeted_reports: Relatórios feitos sobre esta conta
       silence: Silêncio
       statuses: Status
+      subscribe: Inscrever-se
       title: Contas
       undo_silenced: Desfazer silenciar
       undo_suspension: Desfazer supensão
+      unsubscribe: Cancelar inscrição
       username: Usuário
       web: Web
     action_logs:
@@ -137,6 +142,48 @@ pt:
         create_email_domain_block: "%{name} adicionou na lista negra o domínio de correio electrónico %{target}"
         demote_user: "%{name} rebaixou o utilizador %{target}"
         destroy_domain_block: "%{name} desbloqueou o domínio %{target}"
+        destroy_email_domain_block: "%{name} adicionou na lista branca o domínio de correio electrónico %{target}"
+        disable_2fa_user: "%{name} desactivou o requerimento de autenticação em dois passos para o utilizador %{target}"
+        disable_custom_emoji: "%{name} desabilitou o emoji %{target}"
+        disable_user: "%{name} desativou o acesso para o utilizador %{target}"
+        enable_custom_emoji: "%{name} habilitou o emoji %{target}"
+        enable_user: "%{name} ativou o acesso para o utilizador %{target}"
+        memorialize_account: "%{name} transformou a conta de %{target} em um memorial"
+        promote_user: "%{name} promoveu o utilizador %{target}"
+        reset_password_user: "%{name} restabeleceu a palavra-passe do utilizador %{target"
+        resolve_report: "%{name} recusou o relatório %{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: Registo de auditoria
+    custom_emojis:
+      by_domain: Domínio
+      copied_msg: Cópia local do emoji criada com sucesso
+      copy: Copiar
+      copy_failed_msg: Não foi possível criar uma cópia local deste emoji
+      created_msg: Emoji criado com sucesso!
+      delete: Apagar
+      destroyed_msg: Emoji destruído com sucesso!
+      disable: Desativar
+      disabled_msg: Desativado com sucesso este emoji
+      emoji: Emoji
+      enable: Ativar
+      enabled_msg: Ativado com sucesso este emoji
+      image_hint: PNG de até 50KB
+      listed: Listado
+      new:
+        title: Adicionar novo emoji customizado
+      overwrite: Sobrescrever
+      shortcode: Código de atalho
+      shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e underscores
+      title: Emojis customizados
+      unlisted: Não listado
+      update_failed_msg: Não foi possível atualizar esse emoji
+      updated_msg: Emoji atualizado com sucesso!
+      upload: Enviar
     domain_blocks:
       add_new: Adicionar novo
       created_msg: Bloqueio do domínio está a ser processado
@@ -146,13 +193,15 @@ pt:
         create: Criar bloqueio
         hint: O bloqueio de dominio não vai previnir a criação de entradas na base de dados, mas irá retroativamente e automaticamente aplicar métodos de moderação específica nessas contas.
         severity:
-          desc_html: "<strong>Silenciar</strong> irá fazer com que os posts dessas contas sejam invisíveis para todos que não a seguem. <strong>Supender</strong> irá eliminar todo o conteúdo guardado dessa conta, mídia e informação de perfil."
+          desc_html: "<strong>Silenciar</strong> irá fazer com que os posts dessas contas sejam invisíveis para todos que não a seguem. <strong>Supender</strong> irá eliminar todo o conteúdo guardado dessa conta, media e informação de perfil.Usa <strong>Nenhum</strong> se  apenas desejas rejeitar arquivos de media."
+          noop: Nenhum
           silence: Silenciar
           suspend: Suspender
         title: Novo bloqueio de domínio
-      reject_media: Rejeitar ficheiros de mídia
-      reject_media_hint: Remove localmente arquivos armazenados e rejeita fazer guardar novos no futuro. Irrelevante na suspensão.
+      reject_media: Rejeitar ficheiros de media
+      reject_media_hint: Remove localmente arquivos armazenados e rejeita fazer guardar novos no futuro. Irrelevante na suspensão
       severities:
+        noop: Nenhum
         silence: Silenciar
         suspend: Suspender
       severity: Severidade
@@ -167,11 +216,32 @@ pt:
         undo: Anular
       title: Bloqueio de domínio
       undo: Anular
+    email_domain_blocks:
+      add_new: Adicionar novo
+      created_msg: Bloqueio de domínio de email criado com sucesso
+      delete: Eliminar
+      destroyed_msg: Bloqueio de domínio de email excluído com sucesso
+      domain: Domínio
+      new:
+        create: Adicionar domínio
+        title: Novo bloqueio de domínio de email
+      title: Bloqueio de Domínio de Email
     instances:
       account_count: Contas conhecidas
       domain_name: Domínio
+      reset: Restaurar
+      search: Pesquisar
       title: Instâncias conhecidas
+    invites:
+      filter:
+        all: Todos
+        available: Disponíveis
+        expired: Expirados
+        title: Filtro
+      title: Convites
     reports:
+      action_taken_by: Ação tomada por
+      are_you_sure: Tens a certeza?
       comment:
         label: Comentário
         none: Nenhum
@@ -179,17 +249,20 @@ pt:
       id: ID
       mark_as_resolved: Marcar como resolvido
       report: 'Denúncia #%{id}'
+      report_contents: Conteúdos
       reported_account: Conta denunciada
       reported_by: Denúnciada por
       resolved: Resolvido
       silence_account: Conta silenciada
       status: Estado
       suspend_account: Conta suspensa
-      target: Target
+      target: Alvo
       title: Denúncias
       unresolved: Por resolver
       view: Ver
     settings:
+      bootstrap_timeline_accounts:
+        title: Seguidores predefinidos para novas contas
       contact_information:
         email: Inserir um endereço de email para tornar público
         username: Insira um nome de utilizador
@@ -197,16 +270,49 @@ pt:
         closed_message:
           desc_html: Mostrar na página inicial quando registos estão encerrados<br/>Podes usar tags HTML
           title: Mensagem de registos encerrados
+        deletion:
+          desc_html: Permite a qualquer um apagar a conta
+        min_invite_role:
+          disabled: Ninguém
+          title: Permitir convites de
         open:
+          desc_html: Permitir que qualquer um crie uma conta
           title: Aceitar novos registos
+      show_staff_badge:
+        desc_html: Mostrar um crachá da equipa na página de utilizador
+        title: Mostrar crachá da equipa
       site_description:
-        desc_html: Mostrar como parágrafo na página inicial e usado como meta tag.<br/>Podes usar tags HTML, em particular <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
+        desc_html: Mostrar como parágrafo na página inicial e usado como meta tag.Podes usar tags HTML, em particular <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
         title: Descrição do site
       site_description_extended:
         desc_html: Mostrar na página de mais informações<br/>Podes usar tags HTML
         title: Página de mais informações
+      site_terms:
+        desc_html: Podes escrever a tua própria política de privacidade, termos de serviço, entre outras coisas. Podes usar tags HTML
+        title: Termos de serviço customizados
       site_title: Título do site
+      thumbnail:
+        desc_html: Usada para visualizações via OpenGraph e API. Recomenda-se 1200x630px
+        title: Miniatura da instância
+      timeline_preview:
+        desc_html: Exibir a linha temporal pública na página inicial
+        title: Visualização da linha temporal
       title: Preferências do site
+    statuses:
+      back_to_account: Voltar para página da conta
+      batch:
+        delete: Eliminar
+        nsfw_off: NSFW OFF
+        nsfw_on: NSFW ON
+      execute: Executar
+      failed_to_execute: Falhou ao executar
+      media:
+        hide: Esconder média
+        show: Mostrar média
+        title: Média
+      no_media: Não há média
+      title: Estado das contas
+      with_media: Com média
     subscriptions:
       callback_url: URL de Callback
       confirmed: Confirmado
@@ -215,37 +321,172 @@ pt:
       title: WebSub
       topic: Tópico
     title: Administração
+  admin_mailer:
+    new_report:
+      body: "%{reporter} relatou %{target}"
+      subject: Novo relatório sobre %{instance} (#%{id})
   application_mailer:
+    salutation: "%{name},"
     settings: 'Alterar preferências de email: %{link}'
     signature: notificações Mastodon do %{instance}
     view: 'Ver:'
   applications:
+    created: Aplicação criada com sucesso
+    destroyed: Aplicação eliminada com sucesso
     invalid_url: O URL é inválido
+    regenerate_token: Regenerar token de acesso
+    token_regenerated: Token de acesso regenerado com sucesso
+    warning: Cuidado com estes dados. Não partilhar com ninguém!
+    your_token: O teu token de acesso
   auth:
+    agreement_html: Registando-te concordas em seguir <a href="%{rules_path}">as regras da instância</a> e <a href="%{terms_path}">os nossos termos de serviço</a>.
     change_password: Alterar palavra-passe
+    delete_account: Eliminar conta
+    delete_account_html: Se desejas eliminar a conta, podes <a href="%{path}">continua aqui</a>. Uma confirmação será pedida.
     didnt_get_confirmation: Não recebeu o email de confirmação?
     forgot_password: Esqueceste a palavra-passe?
+    invalid_reset_password_token: Token de modificação da palavra-passe é inválido ou expirou. Por favor, solicita um novo.
     login: Entrar
+    logout: Sair
+    migrate_account: Mudar para uma conta diferente
+    migrate_account_html: Se desejas redirecionar esta conta para uma outra podes<a href="%{path}">configurar isso aqui</a>.
     register: Registar
     resend_confirmation: Reenviar instruções de confirmação
     reset_password: Criar nova palavra-passe
     set_new_password: Editar palavra-passe
+  authorize_follow:
+    error: Infelizmente, ocorreu um erro ao buscar a conta remota
+    follow: Seguir
+    follow_request: 'Enviaste uma solicitação de seguidor para:'
+    following: 'Sucesso! Agora estás a seguir a:'
+    post_follow:
+      close: Ou podes simplesmente fechar esta janela.
+      return: Voltar ao perfil do utilizador
+    title: Seguir %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}h"
+      about_x_months: "%{count} meses"
+      about_x_years: "%{count} anos"
+      almost_x_years: "%{count} anos"
+      half_a_minute: Justo agora
+      less_than_x_minutes: "%{count} meses"
+      less_than_x_seconds: Justo agora
+      over_x_years: "%{count} anos"
+      x_days: "%{count} dias"
+      x_minutes: "%{count} minutos"
+      x_months: "%{count} meses"
+      x_seconds: "%{count} segundos"
+  deletes:
+    bad_password_msg: Boa tentativa, hackers! Palavra-passe incorreta
+    confirm_password: Introduz a palavra-passe atual para verificar a tua identidade
+    description_html: Isto vai <strong>permanente e irreversivelmente</strong> remover conteúdo da tua conta e desativá-la. O teu nome de utilizador permanecerá reservado para prevenir futuros roubos de identidade.
+    proceed: Eliminar conta
+    success_msg: A tua conta foi eliminada com sucesso
+    warning_html: |-
+      Apenas a eliminação de conteúdo desta instância é garantido.
+      Conteúdo que tenha sido partilhado com outras instâncias muito provavelmente deixará pegadas. Servidores offline e servidores que se desinscreveram das tuas atualizações não  atualizarão as suas bases de dados.
+    warning_title: Disponibilidade de conteúdo disseminado
+  errors:
+    '403': Não tens a permissão necessária para ver esta página.
+    '404': A página que estás a procurar não existe.
+    '410': A página que estás a procurar não existe mais.
+    '422':
+      content: "A verificação de segurança falhou. \nDesativaste o uso de cookies?"
+      title: A verificação de segurança falhou
+    '500':
+      content: Desculpe, mas algo correu mal.
+      title: Esta página não está correta
+    noscript_html: Para usar o aplicativo web do Mastodon, por favor ativa o JavaScript. Alternativamente, experimenta um dos <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">apps nativos</a> para o Mastodon na sua plataforma.
+  exports:
+    blocks: Bloqueaste
+    csv: CSV
+    follows: Segues
+    mutes: Tens em silêncio
+    storage: Armazenamento de média
+  followers:
+    domain: Domínio
+    explanation_html: Se  queres garantir a privacidade das tuas publicações, deves ficar atento a quem te está a seguir.<strong>As tuas publicações privadas são enviadas para todas as instâncias nas que tens seguidores</strong>. Convém revisá-las e remover seguidores se achares que a tua privacidade não será respeitada pela equipa ou software destas instâncias.
+    followers_count: Número de seguidores
+    lock_link: Bloquear a tua conta
+    purge: Eliminar dos seguidores
+    success:
+      one: No processo de bloqueio suave de seguidores de outro domínio...
+      other: No processo de bloqueio suave de seguidores de outros %{count} domínios...
+    true_privacy_html: Por favor leva em conta que <strong>a verdadeira privacidade só pode ser alcançada através de encriptação ponto-a-ponto</strong>.
+    unlocked_warning_html: Qualquer pessoa pode seguir-te e ver as tuas publicações privadas. %{lock_link} para ser capaz de revisar e rejeitar seguidores.
+    unlocked_warning_title: A tua conta não está bloqueada
   generic:
-    changes_saved_msg: Alteraçes guardadas!
-    powered_by: powered by %{link}
+    changes_saved_msg: Alterações guardadas!
+    powered_by: fornecido por %{link}
     save_changes: Guardar alterações
     validation_errors:
       one: Algo não está correcto. Por favor vê o erro abaixo
       other: Algo não está correto. Por favor vê os %{count} erros abaixo
-  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."
+  imports:
+    preface: Podes importar dados que tenhas exportado de outra instância, como a lista de pessoas que segues ou bloqueadas.
+    success: Os teus dados foram enviados com sucesso e serão processados em breve
+    types:
+      blocking: Lista de bloqueio
+      following: Lista de pessoas que estás a seguir
+      muting: Lista de utilizadores silenciados
+    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 partilhar ligações com outras pessoas para permitir acesso a essa instância
+    table:
+      expires_at: Expira
+      uses: Usos
+    title: Convidar pessoas
+  landing_strip_html: "<strong>%{name}</strong> é um utilizador em %{link_to_root_path}. Podes segui-lo ou interagir com ele se tiveres uma conta em qualquer lugar no fediverso."
   landing_strip_signup_html: If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
+  lists:
+    errors:
+      limit: Número máximo de listas alcançado
+  media_attachments:
+    validations:
+      images_and_video: Não é possível anexar um vídeo a uma publicação que já contém imagens
+      too_many: Não é possível anexar mais de 4 arquivos
+  migrations:
+    acct: username@domain da nova conta
+    currently_redirecting: 'O teu perfil está configurado para redirecionar para:'
+    proceed: Salvar
+    updated_msg: As configurações de migração da tua conta foram atualizadas com sucesso!
+  moderation:
+    title: Moderação
   notification_mailer:
+    digest:
+      body: 'Aqui tens um breve resumo do que tens perdido em %{instance} desde o  último acesso em %{since}:'
+      mention: "%{name} mencionou-te em:"
+      new_followers_summary:
+        one: Boa! Tens um novo seguidor!
+        other: Tens %{count} novos seguidores! Fantástico!
+      subject:
+        one: "1 nova notificação desde o último acesso \U0001F418"
+        other: "%{count} novas notificações desde o  último acesso \U0001F418"
     favourite:
       body: 'O teu post foi adicionado aos favoritos por %{name}:'
       subject: "%{name} adicionou o teu post aos favoritos"
     follow:
       body: "%{name} é teu seguidor!"
       subject: "%{name} começou a seguir-te"
+    follow_request:
+      body: "%{name} solicitou autorização para te seguir"
+      subject: 'Seguidor pendente: %{name}'
     mention:
       body: 'Foste mencionado por %{name}:'
       subject: "%{name} mencionou-te"
@@ -267,43 +508,195 @@ pt:
     next: Seguinte
     prev: Anterior
     truncate: "&hellip;"
+  preferences:
+    languages: Idiomas
+    other: Outro
+    publishing: Publicação
+    web: Web
+  push_notifications:
+    favourite:
+      title: "%{name} adicionou o teu post aos favoritos"
+    follow:
+      title: "%{name} começou a seguir-te"
+    group:
+      title: "%{count} notificações"
+    mention:
+      action_boost: Partilhar
+      action_expand: Mostrar mais
+      action_favourite: Adicionar aos favoritos
+      title: "%{name} mencionou-te"
+    reblog:
+      title: "%{name} partilhou o teu post"
   remote_follow:
     acct: Entre seu usuário@domínio do qual quer seguir
     missing_resource: Não foi possível achar a URL de redirecionamento para sua conta
     proceed: Prossiga para seguir
     prompt: 'Você vai seguir:'
+  sessions:
+    activity: Última atividade
+    browser: Navegador
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      firefox: Firefox
+      generic: Navegador desconhecido
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Navegador Nokia S40 Ovi
+      opera: Opera
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Sessão atual
+    description: "%{browser} em %{platform}"
+    explanation: Estes são os navegadores que estão conectados com a tua conta do Mastodon.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      other: Plataforma desconhecida
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Revogar
+    revoke_success: Sessão revogada com sucesso
+    title: Sessões
   settings:
     authorized_apps: Aplicativos autorizados
     back: Voltar ao Mastodon
+    delete: Eliminação da conta
+    development: Desenvolvimento
     edit_profile: Editar perfil
-    export: Importar dados
+    export: Exportar dados
+    followers: Seguidores autorizados
     import: Importar
+    migrate: Migração de conta
+    notifications: Notificações
     preferences: Preferências
-    settings: Settings
-    two_factor_authentication: Autenticação Two-factor
+    settings: Configurações
+    two_factor_authentication: Autenticação em dois passos
+    your_apps: As tuas aplicações
   statuses:
     open_in_web: Abrir no browser
     over_character_limit: limite de caracter excedeu %{max}
+    pin_errors:
+      ownership: Posts de outras pessoas não podem ser fixados
+      private: Post não-público não pode ser fixado
     show_more: Mostrar mais
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: Mostrar apenas para seguidores
+      private_long: Mostrar apenas para seguidores
       public: Público
+      public_long: Todos podem ver
       unlisted: Público, mas não mostre no timeline público
+      unlisted_long: Todos podem ver, porém não será postado nas timelines públicas
   stream_entries:
     click_to_show: Clique pra mostrar
+    pinned: Toot fixado
     reblogged: boosted
     sensitive_content: Conteúdo sensível
+  terms:
+    body_html: |
+      <h2>Política de privacidade</h2>
+
+      <h3 id="collect">Quais são as informações que recolhemos?</h3>
+
+      <p>Recolhemos informações quando te registas no nosso site e capturamos dados quando participas do fórum lendo, escrevendo e analisando o conteúdo aqui partilhado.</p>
+
+      <p>Quando te registas no nosso site, será requisitado que você ceda seu nome e endereço de e-mail. Você pode, porém, visitar nosso site sem se cadastrar. Seu endereço de e-mail será verificado por uma mensagem contendo um link único. Se este link for visitado, saberemos que você controla este endereço de e-mail.</p>
+
+      <p>Quando registrado e postando, nós gravamos o endereço de IP de onde a postagem se originou. Nós também podemos reter logs de serviores que incluem o endereço de IP em cada requisição para o nosso servidor.</p>
+
+      <h3 id="use">Para que usamos essas informações?</h3>
+
+      <p>Quaisquer das informações que coletamos podem ser usadas das seguintes formas:</p>
+
+      <ul>
+        <li>Para personalizar a sua experiência &mdash; suas informações nos ajudam a nos adequar melhor às suas necessidades individuais.</li>
+        <li>Para melhorar nosso site &mdash; nós continuamente nos esforçamos para aprimorar nosso site baseados na informação e no feedback que recebemos de você.</li>
+        <li>Para aprimorar o serviço ao consumidor &mdash; suas informações nos ajudam a responder efetivamente às suas requisições e solicitações por suporte.</li>
+        <li>Para mandar e-mails periódicos &mdash; O endereço de e-mail que você forneceu pode ser usado para lhe enviar informações, notificações que você requisitar sobre mudanças a determinados tópicos ou menções ao seu nome de usuário, responder requisições e/ou solicitações e perguntas.</li>
+      </ul>
+
+      <h3 id="protect">Como protegemos as suas informações?</h3>
+
+      <p>Nós implementamos uma variedade de medidas de segurança para manter a segurança de suas informações pessoais quando você insere, submete ou acessa as suas informações pessoais.</p>
+
+      <h3 id="data-retention">Qual a sua política de retenção de dados?</h3>
+
+      <p>Faremos esforços de boa fé para:</p>
+
+      <ul>
+        <li>Reter logs de servidor contendo o endereço IP de todas as requisições a este servidor por não mais que 90 dias.</li>
+        <li>Reter os endereços IP associados a usuários cadastrados e suas postagens por não mais que 5 anos.</li>
+      </ul>
+
+      <h3 id="cookies">Nós usamos cookies?</h3>
+
+      <p>Sim. Cookies são pequenos arquivos que um site ou o provedor de serviço transfere para o armazenamento interno de seu computador através de seu navegador (se você permitir). Estes cookies habilitam o site para reconhecer o seu navegador e, se você ter um cadastro, associá-lo a esta conta.</p>
+
+      <p>Nós usamos cookies para entender e salvar as suas preferências para futuras visitas e compilar dados agregados sobre o tráfego do site para que possamos oferecer melhores experiências e ferramentas no futuro. Nós podemos contratar serviços de terceiros para nos auxiliar a entender melhor nossos visitantes. Estes provedores de serviço não são autoriza usar as informações coletadas em nosso nome exceto para nos ajudar a conduzir e aprimorar nosso funcionamento.</p>
+
+      <h3 id="disclose">Nós revelamos informações para terceiros?</h3>
+
+      <p>Nós não vendemos, tocamos ou transferimos para terceiros informações pessoais que te identificam. Isso não inclui partes em que confiamos para nos ajudar a operar nosso site, conduzir nosso funcionamento ou servir você desde que estes terceiros concordem em manter essas informações em segredo. Nós também podemos prover as suas informações para obedecer ordens judiciais, reforçar nossas políticas ou proteger nossos direitos ou de outrem, propriedades ou segurança. Entretanto, informações pessoais não identificáveis podem ser enviadas para outras partes para marketing, propaganda e outros usos.</p>
+
+      <h3 id="third-party">Links de terceiros</h3>
+
+      <p>Ocasionalmente, à nossa discrição, podemos icluir ou oferecer produtos ou serviços de terceiros em nosso site. Estes terceiros têm políticas de privacidade separadas e independentes. Nós, portanto, não nos responsabilizamos pelo conteúdo e atividades destes sites de terceiros. Occasionally, at our discretion, we may include or offer third party products or services on our site. Não obstante, nós procuramos proteger a integridade de nosso site e todo feedback sobre estes sites de terceiros é bem-vindo.</p>
+
+      <h3 id="coppa">Obediência ao Ato de Proteção da Privacidade Online de Crianças</h3>
+
+      <p>Nosso site, produtos e serviços são todos direcionados a pessoas que têm pelo menos 13 anos de idade. Se este servidor estiver nos EUA, e você tiver menos de 13 anos, pelos requerimentos da COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) não use este site.</p>
+
+      <h3 id="online">Política de Apenas Privacidade Online</h3>
+
+      <p>Esta política de privacidade online se aplica somente a informações coletadas por nosso site e não a informações coletadas offline.</p>
+
+      <h3 id="consent">Seu Consentimento</h3>
+
+      <p>Usando o nosso site, você concorda com a nossa política de privacidade.</p>
+
+      <h3 id="changes">Mudanças em nossa Política de Privacidade</h3>
+
+      <p>Se decidirmos mudar a nossa política de privacidade, publicaremos as mudanças nesta página.</p>
+
+      <p>Este documento é CC-BY-SA. A sua última atualização aconteceu em 31 de maio de 2013.</p>
+
+      <p>Originalmente adaptado da <a href="https://github.com/discourse/discourse">política de privacidade do Discourse</a>.</p>
+    title: "%{instance} Termos de Serviço e Política de Privacidade"
+  themes:
+    default: Mastodon
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
   two_factor_authentication:
     code_hint: Entre o código gerado pelo seu aplicativo para confirmar
-    description_html: Se você habilitar <strong>autenticação two-factor </strong>, quando logar será necessário o seu telefone que vai gerar os tokens usado.
-    disable: Disabilitar
-    enable: Habilitar
-    enabled_success: Autenticador Two-factor habilitador com sucesso
+    description_html: Se ativar a <strong>autenticação em dois passos</strong>, quando logar será necessário o seu telefone que vai gerar os tokens para validação.
+    disable: Desativar
+    enable: Ativar
+    enabled: A autenticação em dois passos está ativada
+    enabled_success: Autenticação em dois passos ativada com sucesso
     generate_recovery_codes: Gerar códigos para recuperar conta
     instructions_html: "<strong>Scaneie este código QR no seu Google Authenticator ou aplicativo similar no seu telefone</strong>. A partir de agora seu aplicativo irá gerar tokens que deverão ser digitados para você logar."
     lost_recovery_codes: Códigos de recuperação permite que você recupere o acesso a sua conta se você perder seu telefone. Se você perder os códigos de recuperação, você pode regera-los aqui. Seus códigos antigos serão invalidados.
     manual_instructions: 'Se você não puder scanear o código QR e precisa digita-los manualmente, aqui está o segredo em texto.:'
+    recovery_codes: Cópia de segurança dos códigos de recuperação
     recovery_codes_regenerated: Códigos de recuperação foram gerados com sucesso
+    setup: Configurar
+    wrong_code: O código inserido é invalido! O horário do servidor e o horário do seu aparelho estão corretos?
+  users:
+    invalid_email: O endereço de e-mail é inválido
+    invalid_otp_token: Código de autenticação inválido
+    signed_in_as: 'Registado como:'
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 5eb7f256a..697a1aa27 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -39,6 +39,7 @@ ru:
     followers: Подписчики
     following: Подписан(а)
     media: Медиаконтент
+    moved_html: "%{name} переехал(а) на %{new_profile_link}:"
     nothing_here: Здесь ничего нет!
     people_followed_by: Люди, на которых подписан(а) %{name}
     people_who_follow: Подписчики %{name}
@@ -59,9 +60,13 @@ ru:
       destroyed_msg: Заметка модератора успешно удалена!
     accounts:
       are_you_sure: Вы уверены?
+      by_domain: Домен
       confirm: Подтвердить
       confirmed: Подтверждено
+      demote: Разжаловать
+      disable: Отключить
       disable_two_factor_authentication: Отключить 2FA
+      disabled: Отключено
       display_name: Отображаемое имя
       domain: Домен
       edit: Изменить
@@ -77,7 +82,9 @@ ru:
         local: Локальные
         remote: Удаленные
         title: Размещение
+      login_status: Статус аккаунта
       media_attachments: Мультимедийные вложения
+      memorialize: Превратить в Памятник
       moderation:
         all: Все
         silenced: Заглушенные
@@ -94,6 +101,7 @@ ru:
       outbox_url: URL исходящих
       perform_full_suspension: Полная блокировка
       profile_url: URL профиля
+      promote: Повысить
       protocol: Протокол
       public: Публичный
       push_subscription_expires: Подписка PuSH истекает
@@ -101,6 +109,12 @@ ru:
       reset: Сбросить
       reset_password: Сбросить пароль
       resubscribe: Переподписаться
+      role: Разрешения
+      roles:
+        admin: Администратор
+        moderator: Модератор
+        staff: Персонал
+        user: Пользователь
       salmon_url: Salmon URL
       search: Поиск
       shared_inbox_url: URL общих входящих
@@ -117,6 +131,32 @@ ru:
       unsubscribe: Отписаться
       username: Имя пользователя
       web: WWW
+    action_logs:
+      actions:
+        confirm_user: "%{name} подтвердил(а) e-mail адрес пользователя %{target}"
+        create_custom_emoji: "%{name} загрузил(а) новый эмодзи %{target}"
+        create_domain_block: "%{name} заблокировал(а) домен %{target}"
+        create_email_domain_block: "%{name} добавил(а) e-mail домен %{target} в чёрный список"
+        demote_user: "%{name} разжаловал(а) пользователя %{target}"
+        destroy_domain_block: "%{name} разблокировал(а) домен %{target}"
+        destroy_email_domain_block: "%{name} добавил(а) e-mail домен %{target} в белый список"
+        destroy_status: "%{name} удалил(а) статус пользователя %{target}"
+        disable_2fa_user: "%{name} отключил(а) двухэтапную авторизацию у пользователя %{target}"
+        disable_custom_emoji: "%{name} отключил(а) эмодзи %{target}"
+        disable_user: "%{name} запретил(а) вход пользователя %{target}"
+        enable_custom_emoji: "%{name} включил(а) эмодзи %{target}"
+        enable_user: "%{name} включил(а) вход пользователя %{target}"
+        memorialize_account: "%{name} перевел(а) аккаунт пользователя %{target} в режим памятника"
+        promote_user: "%{name} повысил(а) пользователя %{target}"
+        reset_password_user: "%{name} сбросил(а) пароль пользователя %{target}"
+        resolve_report: "%{name} dismissed report %{target}"
+        silence_account: "%{name} заглушил(а) аккаунт %{target}"
+        suspend_account: "%{name} заморозил(а) аккаунт %{target}"
+        unsilence_account: "%{name} снял(а) глушение аккаунта %{target}"
+        unsuspend_account: "%{name} разморозил(а) аккаунт %{target}"
+        update_custom_emoji: "%{name} обновил(а) эмодзи %{target}"
+        update_status: "%{name} изменил(а) статус пользователя %{target}"
+      title: Журнал событий
     custom_emojis:
       copied_msg: Локальная копия эмодзи успешно создана
       copy: Скопироват
@@ -130,11 +170,16 @@ ru:
       enable: Включить
       enabled_msg: Эмодзи успешно включено
       image_hint: PNG до 50KB
+      listed: В списке
       new:
-        title: Добавить новое эмодзи
+        title: Добавить новый эмодзи
+      overwrite: Заменить
       shortcode: Шорткод
       shortcode_hint: Как минимум 2 символа, только алфавитно-цифровые символы и подчеркивания
       title: Собственные эмодзи
+      unlisted: Не в списке
+      update_failed_msg: Невозможно обновить этот эмодзи
+      updated_msg: Эмодзи обновлён!
       upload: Загрузить
     domain_blocks:
       add_new: Добавить новую
@@ -186,6 +231,13 @@ ru:
       reset: Сбросить
       search: Поиск
       title: Известные узлы
+    invites:
+      filter:
+        all: Все
+        available: Актуальные
+        expired: Истёкшие
+        title: Фильтр
+      title: Приглашения
     reports:
       action_taken_by: 'Действие предпринято:'
       are_you_sure: Вы уверены?
@@ -199,6 +251,7 @@ ru:
         'false': Показать мультимедийные вложения
         'true': Скрыть мультимедийные вложения
       report: 'Жалоба #%{id}'
+      report_contents: Содержимое
       reported_account: Аккаунт нарушителя
       reported_by: Отправитель жалобы
       resolved: Разрешено
@@ -210,12 +263,18 @@ ru:
       unresolved: Неразрешенные
       view: Просмотреть
     settings:
+      activity_api_enabled:
+        desc_html: Подсчёт количества локальных статусов, активных пользователей и новых регистраций на еженедельной основе
+        title: Публикация агрегированной статистики активности пользователей
       bootstrap_timeline_accounts:
         desc_html: Разделяйте имена пользователей запятыми. Сработает только для локальных незакрытых аккаунтов. По умолчанию включены все локальные администраторы.
         title: Подписки по умолчанию для новых пользователей
       contact_information:
         email: Введите публичный e-mail
         username: Введите имя пользователя
+      peers_api_enabled:
+        desc_html: Домены, которые были замечены этим узлом среди всей федерации
+        title: Публикация списка обнаруженных узлов
       registrations:
         closed_message:
           desc_html: Отображается на титульной странице, когда закрыта регистрация<br>Можно использовать HTML-теги
@@ -223,9 +282,15 @@ ru:
         deletion:
           desc_html: Позволяет всем удалять собственные аккаунты
           title: Разрешить удаление аккаунтов
+        min_invite_role:
+          disabled: Никого
+          title: Разрешает приглашения от
         open:
           desc_html: Позволяет любому создавать аккаунт
           title: Открыть регистрацию
+      show_staff_badge:
+        desc_html: Показывать метку персонала на странице пользователя
+        title: Показывать метку персонала
       site_description:
         desc_html: Отображается в качестве параграфа на титульной странице и используется в качестве мета-тега.<br>Можно использовать HTML-теги, в особенности <code>&lt;a&gt;</code> и <code>&lt;em&gt;</code>.
         title: Описание сайта
@@ -293,6 +358,8 @@ ru:
     invalid_reset_password_token: Токен сброса пароля неверен или устарел. Пожалуйста, запросите новый.
     login: Войти
     logout: Выйти
+    migrate_account: Перенести аккаунт
+    migrate_account_html: Если Вы хотите перенести этот аккаунт на другой, вы можете <a href="%{path}">сделать это здесь</a>.
     register: Зарегистрироваться
     resend_confirmation: Повторить отправку инструкции для подтверждения
     reset_password: Сбросить пароль
@@ -374,12 +441,43 @@ ru:
       following: Подписки
       muting: Список глушения
     upload: Загрузить
+  in_memoriam_html: Памятник.
+  invites:
+    delete: Удалить
+    expired: Истекло
+    expires_in:
+      '1800': 30 минут
+      '21600': 6 часов
+      '3600': 1 час
+      '43200': 12 часов
+      '86400': 1 день
+    expires_in_prompt: Никогда
+    generate: Сгенерировать
+    max_uses:
+      one: 1 исп.
+      other: "%{count} исп."
+    max_uses_prompt: Без лимита
+    prompt: Генерируйте и делитесь ссылками с другими, чтобы предоставить им доступ к этому узлу.
+    table:
+      expires_at: Истекает
+      uses: Исп.
+    title: Пригласить людей
   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 файлов
+  migrations:
+    acct: имя@домен нового аккаунта
+    currently_redirecting: 'Ваш профиль будет перенаправлен на:'
+    proceed: Сохранить
+    updated_msg: Настройки миграции Вашего аккаунта обновлены!
+  moderation:
+    title: Модерация
   notification_mailer:
     digest:
       body: 'Кратко о пропущенном Вами на %{instance} с Вашего последнего захода %{since}:'
@@ -484,6 +582,8 @@ ru:
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
+    revoke: Завершить
+    revoke_success: Сессия завершена успешно
     title: Сессии
   settings:
     authorized_apps: Авторизованные приложения
@@ -494,6 +594,7 @@ ru:
     export: Экспорт данных
     followers: Авторизованные подписчики
     import: Импорт
+    migrate: Перенос аккаунта
     notifications: Уведомления
     preferences: Настройки
     settings: Опции
@@ -503,7 +604,7 @@ ru:
     open_in_web: Открыть в WWW
     over_character_limit: превышен лимит символов (%{max})
     pin_errors:
-      limit: Слишком много закрепленных статусов
+      limit: Вы закрепили максимально возможное число статусов
       ownership: Нельзя закрепить чужой статус
       private: Нельзя закрепить непубличный статус
       reblog: Нельзя закрепить продвинутый статус
@@ -517,10 +618,52 @@ ru:
       unlisted_long: Показывать всем, но не отображать в публичных лентах
   stream_entries:
     click_to_show: Показать
+    pinned: Закреплённое сообщение
     reblogged: продвинул(а)
     sensitive_content: Чувствительный контент
   terms:
+    body_html: |
+      <h2>Privacy Policy</h2>
+      <h3 id="collect">What information do we collect?</h3>
+      <p>We collect information from you when you register on our site and gather data when you participate in the forum by reading, writing, and evaluating the content shared here.</p>
+      <p>When registering on our site, you may be asked to enter your name and e-mail address. You may, however, visit our site without registering. Your e-mail address will be verified by an email containing a unique link. If that link is visited, we know that you control the e-mail address.</p>
+      <p>When registered and posting, we record the IP address that the post originated from. We also may retain server logs which include the IP address of every request to our server.</p>
+      <h3 id="use">What do we use your information for?</h3>
+      <p>Any of the information we collect from you may be used in one of the following ways:</p>
+      <ul>
+        <li>To personalize your experience &mdash; your information helps us to better respond to your individual needs.</li>
+        <li>To improve our site &mdash; we continually strive to improve our site offerings based on the information and feedback we receive from you.</li>
+        <li>To improve customer service &mdash; your information helps us to more effectively respond to your customer service requests and support needs.</li>
+        <li>To send periodic emails &mdash; The email address you provide may be used to send you information, notifications that you request about changes to topics or in response to your user name, respond to inquiries, and/or other requests or questions.</li>
+      </ul>
+      <h3 id="protect">How do we protect your information?</h3>
+      <p>We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information.</p>
+      <h3 id="data-retention">What is your data retention policy?</h3>
+      <p>We will make a good faith effort to:</p>
+      <ul>
+        <li>Retain server logs containing the IP address of all requests to this server no more than 90 days.</li>
+        <li>Retain the IP addresses associated with registered users and their posts no more than 5 years.</li>
+      </ul>
+      <h3 id="cookies">Do we use cookies?</h3>
+      <p>Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.</p>
+      <p>We use cookies to understand and save your preferences for future visits and compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. We may contract with third-party service providers to assist us in better understanding our site visitors. These service providers are not permitted to use the information collected on our behalf except to help us conduct and improve our business.</p>
+      <h3 id="disclose">Do we disclose any information to outside parties?</h3>
+      <p>We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses.</p>
+      <h3 id="third-party">Third party links</h3>
+      <p>Occasionally, at our discretion, we may include or offer third party products or services on our site. These third party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites.</p>
+      <h3 id="coppa">Children's Online Privacy Protection Act Compliance</h3>
+      <p>Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) do not use this site.</p>
+      <h3 id="online">Online Privacy Policy Only</h3>
+      <p>This online privacy policy applies only to information collected through our site and not to information collected offline.</p>
+      <h3 id="consent">Your Consent</h3>
+      <p>By using our site, you consent to our web site privacy policy.</p>
+      <h3 id="changes">Changes to our Privacy Policy</h3>
+      <p>If we decide to change our privacy policy, we will post those changes on this page.</p>
+      <p>This document is CC-BY-SA. It was last updated May 31, 2013.</p>
+      <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
     title: Условия обслуживания и политика конфиденциальности %{instance}
+  themes:
+    default: Mastodon
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index e4c6694e9..e3876e47b 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -7,6 +7,7 @@ ar:
         digest: يُرسَل بعد مضيّ مدة طويلة من خمول نشاطك يحوي على تلخيص للتبويقات التي ذُكر حسابك فيها أثناء غيابك
         display_name:
           one: <span class="name-counter">1</span> حرف متبقي
+          other: <span class="name-counter">%{count}</span> حرف متبقي
         header: PNG, GIF or JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 700x335px
         locked: يتطلب منك الموافقة يدويا على كل طلب للإشتراك بحسابك و منشوراتك تعرض لمتابعيك فقط دون غيرهم
         note: <span class="note-counter">%{count}</span> أحرف متبقية
@@ -16,6 +17,8 @@ ar:
         data: ملف CSV تم تصديره من خادوم مثيل  آخر لماستدون
       sessions:
         otp: أدخل الرمز الثنائي من هاتفك أو استخدم أحد رموز الاسترداد.
+      user:
+        filtered_languages: سوف لن تَظهَر التبويقات المُحرَّرَة باللغات المُحدّدة أدناه على خيوطك العمومية
     labels:
       defaults:
         avatar: الصورة الرمزية
@@ -25,6 +28,8 @@ ar:
         data: البيانات
         display_name: الاسم الذي يتم عرضه
         email: عنوان البريد الإلكتروني
+        expires_in: مدة نهاية الصلاحية
+        filtered_languages: اللغات المصفاة
         header: رأس الصفحة
         locale: اللغة
         locked: إجعل حسابك خاصًا
@@ -33,17 +38,23 @@ ar:
         note: السيرة الذاتية
         otp_attempt: الرمز الثنائي
         password: كلمة المرور
-        setting_auto_play_gif: تشغيل صور جيف المتحركة تلقائي
+        setting_auto_play_gif: تشغيل تلقائي لِوَسائط جيف المتحركة
         setting_boost_modal: إظهار مربع حوار التأكيد قبل القيام بالترقية
         setting_default_privacy: خصوصية المنشور
         setting_default_sensitive: دائما تحديد الوسائط كحساسة
+        setting_delete_modal: إظهار مربع حوار للتأكيد قبل حذف أي تبويق
         setting_noindex: منع محركات البحث من فهرسة ملفي الشخصي
+        setting_reduce_motion: تخفيض عدد الصور في الوسائط المتحركة
+        setting_system_font_ui: إستخدام الخط الإفتراضي للنظام
+        setting_theme: سمة الموقع
+        setting_unfollow_modal: إظهار مربع حوار للتأكيد قبل إلغاء متابعة أي حساب
         severity: الشدة
         type: نوع الإستيراد
         username: اسم المستخدم
       interactions:
         must_be_follower: حظر اشعارات الأشخاص الذين لا يتبعونك
         must_be_following: حظر اشعارات الأشخاص الذين لا تتبعهم
+        must_be_following_dm: حظر التبويقات المباشرة القادمة من الحسابات التي لا تتبعها
       notification_emails:
         digest: إرسال رسائل بريد إلكتروني ملخصة
         favourite: إبعث بريداً إلكترونياً عندما يعجب احدهم بمنشورك
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index ff1a40ccd..ceb015282 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -4,7 +4,7 @@ en:
     hints:
       defaults:
         avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 120x120px
-        digest: Sent after a long period of inactivity with a summary of mentions you've received in your absence
+        digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence
         display_name:
           one: <span class="name-counter">1</span> character left
           other: <span class="name-counter">%{count}</span> characters left
@@ -14,7 +14,7 @@ en:
           one: <span class="note-counter">1</span> character left
           other: <span class="note-counter">%{count}</span> characters left
         setting_noindex: Affects your public profile and status pages
-        setting_theme: Affects how Mastodon looks when you're logged in from any device.
+        setting_skin: Reskins the selected Mastodon flavour
       imports:
         data: CSV file exported from another Mastodon instance
       sessions:
@@ -45,10 +45,11 @@ 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_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
         setting_system_font_ui: Use system's default font
-        setting_theme: Site theme
         setting_unfollow_modal: Show confirmation dialog before unfollowing someone
         severity: Severity
         type: Import type
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index a19d69ff1..ddb13ae43 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -3,7 +3,7 @@ fa:
   simple_form:
     hints:
       defaults:
-        avatar: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۱۲۰×۱۲۰ پیکسل تبدیل خواهد شد.
+        avatar: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۱۲۰×۱۲۰ پیکسل تبدیل خواهد شد
         digest: پس از مدت طولانی عدم فعالیت فرستاده می‌شود، شامل خلاصه‌ای از مواردی که در نبودتان از شما نام برده شده
         display_name:
           one: <span class="name-counter">1</span> حرف باقی مانده
@@ -20,7 +20,7 @@ fa:
       sessions:
         otp: کد تأیید دومرحله‌ای را از تلفن خود وارد کنید یا یکی از کدهای بازیابی را به کار ببرید.
       user:
-        filtered_languages: زبان‌های انتخاب‌شده از فهرست عمومی نوشته‌هایی که می‌بینید حذف می‌شوند.
+        filtered_languages: زبان‌های انتخاب‌شده از فهرست عمومی نوشته‌هایی که می‌بینید حذف می‌شوند
     labels:
       defaults:
         avatar: تصویر نمایه
@@ -30,10 +30,12 @@ fa:
         data: داده‌ها
         display_name: نمایش به نام
         email: نشانی ایمیل
+        expires_in: تاریخ انقضا
         filtered_languages: زبان‌های فیلترشده
         header: تصویر زمینه
         locale: زبان
         locked: خصوصی‌کردن حساب
+        max_uses: بیشترین شمار استفاده
         new_password: رمز تازه
         note: دربارهٔ شما
         otp_attempt: کد ورود دومرحله‌ای
@@ -44,6 +46,7 @@ fa:
         setting_default_sensitive: همیشه تصاویر را به عنوان حساس علامت بزن
         setting_delete_modal: پیش از پاک کردن یک نوشته پیغام تأیید نشان بده
         setting_noindex: درخواست از موتورهای جستجو برای لغو فهرست‌سازی
+        setting_reduce_motion: کاستن از حرکت در پویانمایی‌ها
         setting_system_font_ui: به‌کاربردن قلم پیش‌فرض سیستم
         setting_theme: تم سایت
         setting_unfollow_modal: نمایش پیغام تأیید پیش از لغو پیگیری دیگران
@@ -53,6 +56,7 @@ fa:
       interactions:
         must_be_follower: مسدودکردن اعلان‌های همه به جز پیگیران
         must_be_following: مسدودکردن اعلان‌های کسانی که شما پی نمی‌گیرید
+        must_be_following_dm: مسدودکردن پیغام‌های خصوصی کسانی که شما پی نمی‌گیرید
       notification_emails:
         digest: خلاصه‌کردن چند اعلان در یک ایمیل
         favourite: وقتی کسی نوشتهٔ شما پسندید ایمیل بفرست
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 7fa96992f..d7e5601f2 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -1,10 +1,10 @@
+---
 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
+        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
@@ -14,16 +14,13 @@ gl:
           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.
+        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.
+        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
+        filtered_languages: Os idiomas marcados filtraranse das liñas temporais públicas para vostede
     labels:
       defaults:
         avatar: Avatar
@@ -62,14 +59,13 @@ gl:
         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
+        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: '*'
+      mark: "*"
       text: requerido
     'yes': Si
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 2e5f96957..361a5ada6 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -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.pl.yml b/config/locales/simple_form.pl.yml
index 507e46469..a97239669 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -18,7 +18,7 @@ pl:
           one: Pozostał <span class="name-counter">1</span> znak.
           other: Pozostało <span class="name-counter">%{count}</span> znaków
         setting_noindex: Wpływa na widoczność strony profilu i Twoich wpisów
-        setting_theme: Zmienia wygląd Mastodona po zalogowaniu z dowolnego urządzenia.
+        setting_skin: Zmienia wygląd używanej odmiany Mastodona
       imports:
         data: Plik CSV wyeksportowany z innej instancji Mastodona
       sessions:
@@ -49,10 +49,11 @@ pl:
         setting_default_privacy: Widoczność wpisów
         setting_default_sensitive: Zawsze oznaczaj zawartość multimedialną jako wrażliwą
         setting_delete_modal: Pytaj o potwierdzenie przed usunięciem wpisu
+        setting_favourite_modal: Pytaj o potwierdzenie przed dodaniem do ulubionych
         setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych
         setting_reduce_motion: Ogranicz ruch w animacjach
+        setting_skin: Motyw
         setting_system_font_ui: Używaj domyślnej czcionki systemu
-        setting_theme: Motyw strony
         setting_unfollow_modal: Pytaj o potwierdzenie przed cofnięciem śledzenia
         severity: Priorytet
         type: Typ importu
diff --git a/config/locales/simple_form.pt.yml b/config/locales/simple_form.pt.yml
index a5afd02d3..9970247ab 100644
--- a/config/locales/simple_form.pt.yml
+++ b/config/locales/simple_form.pt.yml
@@ -11,7 +11,7 @@ pt:
       imports:
         data: Ficheiro CSV exportado de outra instância do Mastodon
       sessions:
-        otp: Insere o código o código de autenticação de dois fatores do teu telefone ou utiliza um código de recuperação de acesso.
+        otp: Insere o código de autenticação em dois passos do teu telefone ou utiliza um código de recuperação de acesso.
     labels:
       defaults:
         avatar: Imagem de Perfil
@@ -26,10 +26,11 @@ pt:
         locked: Tornar conta privada
         new_password: Nova palavra-passe
         note: Biografia
-        otp_attempt: Código de autenticação de dois fatores
+        otp_attempt: Código de autenticação em dois passos
         password: Palavra-passe
         setting_boost_modal: Pedir confirmação antes de partilhar um post
         setting_default_privacy: Privacidade padrão de posts
+        setting_default_sensitive: Marcar sempre media como sensível
         setting_reduce_motion: Reduzir movimento em animações
         severity: Severity
         type: Import type
@@ -41,6 +42,7 @@ pt:
         digest: Enviar um email da actividade nesta instância
         favourite: Enviar email quando alguém adiciona um post teu aos favoritos
         follow: Enviar email quando alguém te segue
+        follow_request: Enviar um email quando alguém solicitar ser o teu seguidor
         mention: Enviar email quando alguém te menciona
         reblog: Enviar email quando alguém partilhar um post teu
     'no': Não
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index 1f2fa173d..4eb993e52 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -4,7 +4,7 @@ zh-CN:
     hints:
       defaults:
         avatar: 文件大小限制 2MB,只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 120×120px
-        digest: 在你长时间未登录的情况下,我们会向你发送一份含有提及你的嘟文的摘要邮件
+        digest: 仅在你长时间未登录,且收到了私信时发送
         display_name: 还能输入 <span class="name-counter">%{count}</span> 个字符
         header: 文件大小限制 2MB,只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 700×335px
         locked: 你需要手动审核所有关注请求
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index e1909ac71..14382331b 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -263,12 +263,18 @@ zh-CN:
       unresolved: 未处理
       view: 查看
     settings:
+      activity_api_enabled:
+        desc_html: 本站用户发布的嘟文数,以及本站的活跃用户数和一周内新用户数
+        title: 公开用户活跃度的统计数据
       bootstrap_timeline_accounts:
         desc_html: 用半角逗号分隔多个用户名。只能添加来自本站且未开启保护的帐户。如果留空,则默认关注本站所有的管理员。
         title: 新用户默认关注
       contact_information:
         email: 用于联系的公开电子邮件地址
         username: 用于联系的公开用户名
+      peers_api_enabled:
+        desc_html: 截至目前本实例在网络中已发现的域名
+        title: 公开已知实例的列表
       registrations:
         closed_message:
           desc_html: 本站关闭注册期间的提示信息。可以使用 HTML 标签
@@ -330,10 +336,13 @@ zh-CN:
       body: "%{reporter} 举报了用户 %{target}。"
       subject: 来自 %{instance} 的用户举报(#%{id})
   application_mailer:
+    notification_preferences: 更改电子邮件首选项
     salutation: "%{name}:"
     settings: 使用此链接更改你的电子邮件首选项:%{link}
     signature: 这是一封来自 %{instance} 的 Mastodon 电子邮件通知。
     view: 点此链接查看详情:
+    view_profile: 查看个人资料页
+    view_status: 查看嘟文
   applications:
     created: 应用创建成功
     destroyed: 应用删除成功
@@ -470,27 +479,36 @@ zh-CN:
     title: 运营
   notification_mailer:
     digest:
-      body: 自从你最后一次(时间是%{since})登录 %{instance} 以来,你错过了这些嘟嘟滴滴:
+      action: 查看所有通知
+      body: 以下是自%{since}你最后一次登录以来错过的消息的摘要
       mention: "%{name} 在嘟文中提到了你:"
       new_followers_summary:
-        one: 有个人关注了你!耶!
-        other: 有 %{count} 个人关注了你!好棒!
+        one: 而且,你不在的时候,有一个人关注了你!耶!
+        other: 而且,你不在的时候,有 %{count} 个人关注了你!好棒!
       subject: "自从你最后一次登录以来,你错过了 %{count} 条新通知 \U0001F418"
+      title: 在你不在的这段时间……
     favourite:
       body: 你的嘟文被 %{name} 收藏了:
       subject: "%{name} 收藏了你的嘟文"
+      title: 新的收藏
     follow:
       body: "%{name} 关注了你!"
       subject: "%{name} 关注了你"
+      title: 新的关注者
     follow_request:
+      action: 处理关注请求
       body: "%{name} 向你发送了关注请求!"
       subject: 来自 %{name} 的关注请求
+      title: 新的关注请求
     mention:
+      action: 回复
       body: "%{name} 在嘟文中提到了你:"
       subject: "%{name} 提到了你"
+      title: 新的提及
     reblog:
       body: 你的嘟文被 %{name} 转嘟了:
       subject: "%{name} 转嘟了你的嘟文"
+      title: 新的转嘟
   number:
     human:
       decimal_units:
diff --git a/config/navigation.rb b/config/navigation.rb
index 9c7a7d2ec..b08b1769d 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -7,6 +7,7 @@ SimpleNavigation::Configuration.run do |navigation|
     primary.item :settings, safe_join([fa_icon('cog fw'), t('settings.settings')]), settings_profile_url do |settings|
       settings.item :profile, safe_join([fa_icon('user fw'), t('settings.edit_profile')]), settings_profile_url, highlights_on: %r{/settings/profile|/settings/migration}
       settings.item :preferences, safe_join([fa_icon('sliders fw'), t('settings.preferences')]), settings_preferences_url
+      settings.item :keyword_mutes, safe_join([fa_icon('volume-off fw'), t('settings.keyword_mutes')]), settings_keyword_mutes_url
       settings.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_notifications_url
       settings.item :password, safe_join([fa_icon('lock fw'), t('auth.change_password')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete}
       settings.item :two_factor_authentication, safe_join([fa_icon('mobile fw'), t('settings.two_factor_authentication')]), settings_two_factor_authentication_url, highlights_on: %r{/settings/two_factor_authentication}
@@ -16,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 21ad0a93f..f45684519 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -54,8 +54,7 @@ Rails.application.routes.draw do
 
     resources :followers, only: [:index], controller: :follower_accounts
     resources :following, only: [:index], controller: :following_accounts
-    resources :follows, only: [:show], module: :activitypub
-    resource :follow, only: [:create], controller: :account_follow, as: :follows
+    resource :follow, only: [:create], controller: :account_follow
     resource :unfollow, only: [:create], controller: :account_unfollow
     resource :outbox, only: [:show], module: :activitypub
     resource :inbox, only: [:create], module: :activitypub
@@ -71,6 +70,13 @@ Rails.application.routes.draw do
 
   namespace :settings do
     resource :profile, only: [:show, :update]
+
+    resources :keyword_mutes do
+      collection do
+        delete :destroy_all
+      end
+    end
+
     resource :preferences, only: [:show, :update]
     resource :notifications, only: [:show, :update]
     resource :import, only: [:show, :create]
@@ -96,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]
 
@@ -218,6 +226,7 @@ Rails.application.routes.draw do
       end
 
       namespace :timelines do
+        resource :direct, only: :show, controller: :direct
         resource :home, only: :show, controller: :home
         resource :public, only: :show, controller: :public
         resources :tag, only: :show
@@ -232,7 +241,11 @@ Rails.application.routes.draw do
       resources :follows,    only: [:create]
       resources :media,      only: [:create, :update]
       resources :blocks,     only: [:index]
-      resources :mutes,      only: [:index]
+      resources :mutes,      only: [:index] do
+        collection do
+          get 'details'
+        end
+      end
       resources :favourites, only: [:index]
       resources :reports,    only: [:index, :create]
 
@@ -256,10 +269,11 @@ Rails.application.routes.draw do
         end
       end
 
-      resources :notifications, only: [:index, :show] do
+      resources :notifications, only: [:index, :show, :destroy] do
         collection do
           post :clear
           post :dismiss
+          delete :destroy_multiple
         end
       end
 
diff --git a/config/settings.yml b/config/settings.yml
index 4a2519464..507b7c066 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -7,7 +7,7 @@
 # For more information, see docs/Running-Mastodon/Administration-guide.md
 #
 defaults: &defaults
-  site_title: Mastodon
+  site_title: 'dev.glitch.social'
   site_description: ''
   site_extended_description: ''
   site_terms: ''
@@ -16,18 +16,20 @@ defaults: &defaults
   open_registrations: true
   closed_registrations_message: ''
   open_deletion: true
+  timeline_preview: false
   min_invite_role: 'admin'
-  timeline_preview: true
   show_staff_badge: true
   default_sensitive: false
   unfollow_modal: false
   boost_modal: false
+  favourite_modal: false
   delete_modal: true
   auto_play_gif: false
   reduce_motion: false
   system_font_ui: false
   noindex: false
-  theme: 'default'
+  flavour: 'glitch'
+  skin: 'default'
   notification_emails:
     follow: false
     reblog: false
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 4c35dcd43..bfe29b8f8 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -27,3 +27,6 @@
   ip_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
     class: Scheduler::IpCleanupScheduler
+  email_scheduler:
+    cron: '0 10 * * 2'
+    class: Scheduler::EmailScheduler
diff --git a/config/themes.yml b/config/themes.yml
deleted file mode 100644
index bbf8d0f6c..000000000
--- a/config/themes.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-default: styles/application.scss
-win95: styles/win95.scss
diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js
index 822329490..a38d9d11d 100644
--- a/config/webpack/configuration.js
+++ b/config/webpack/configuration.js
@@ -1,16 +1,62 @@
 // Common configuration for webpacker loaded from config/webpacker.yml
 
-const { join, resolve } = require('path');
+const { basename, dirname, extname, join, resolve } = require('path');
 const { env } = require('process');
 const { safeLoad } = require('js-yaml');
-const { readFileSync } = require('fs');
+const { lstatSync, readFileSync } = require('fs');
+const glob = require('glob');
 
 const configPath = resolve('config', 'webpacker.yml');
 const loadersDir = join(__dirname, 'loaders');
 const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV];
+const flavourFiles = glob.sync('app/javascript/flavours/*/theme.yml');
+const skinFiles = glob.sync('app/javascript/skins/*/*');
+const flavours = {};
 
-const themePath = resolve('config', 'themes.yml');
-const themes = safeLoad(readFileSync(themePath), 'utf8');
+const core = function () {
+  const coreFile = resolve('app', 'javascript', 'core', 'theme.yml');
+  const data = safeLoad(readFileSync(coreFile), 'utf8');
+  if (!data.pack_directory) {
+    data.pack_directory = dirname(coreFile);
+  }
+  return data.pack ? data : {};
+}();
+
+for (let i = 0; i < flavourFiles.length; i++) {
+  const flavourFile = flavourFiles[i];
+  const data = safeLoad(readFileSync(flavourFile), 'utf8');
+  data.name = basename(dirname(flavourFile));
+  data.skin = {};
+  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;
+  }
+}
+
+for (let i = 0; i < skinFiles.length; i++) {
+  const skinFile = skinFiles[i];
+  let skin = basename(skinFile);
+  const name = basename(dirname(skinFile));
+  if (!flavours[name]) {
+    continue;
+  }
+  const data = flavours[name].skin;
+  if (lstatSync(skinFile).isDirectory()) {
+    data[skin] = {};
+    const skinPacks = glob.sync(join(skinFile, '*.{css,scss}'));
+    for (let j = 0; j < skinPacks.length; j++) {
+      const pack = skinPacks[j];
+      data[skin][basename(pack, extname(pack))] = pack;
+    }
+  } else if ((skin = skin.match(/^(.*)\.s?css$/i))) {
+    data[skin[1]] = { common: skinFile };
+  }
+}
 
 function removeOuterSlashes(string) {
   return string.replace(/^\/*/, '').replace(/\/*$/, '');
@@ -32,7 +78,8 @@ const output = {
 
 module.exports = {
   settings,
-  themes,
+  core,
+  flavours,
   env,
   loadersDir,
   output,
diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js
index b71cf2ade..09fba4a18 100644
--- a/config/webpack/generateLocalePacks.js
+++ b/config/webpack/generateLocalePacks.js
@@ -1,52 +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');
+
+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);
 
-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];
-
-  const localeContent = `//
-// locale_${locale}.js
+  rimraf.sync(outPath);
+  mkdirp.sync(outPath);
+
+  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 '../../app/javascript/mastodon/locales';
-setLocale({messages, 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/loaders/babel.js b/config/webpack/loaders/babel.js
index e17d2fa70..770c89aa7 100644
--- a/config/webpack/loaders/babel.js
+++ b/config/webpack/loaders/babel.js
@@ -7,7 +7,8 @@ module.exports = {
   exclude: /node_modules/,
   loader: 'babel-loader',
   options: {
-    forceEnv: env,
+    forceEnv: process.env.NODE_ENV || 'development',
+    sourceRoot: 'app/javascript',
     cacheDirectory: env === 'development' ? false : resolve(__dirname, '..', '..', '..', 'tmp', 'cache', 'babel-loader'),
   },
 };
diff --git a/config/webpack/loaders/sass.js b/config/webpack/loaders/sass.js
index 88d94c684..96ad7abe8 100644
--- a/config/webpack/loaders/sass.js
+++ b/config/webpack/loaders/sass.js
@@ -9,7 +9,7 @@ module.exports = {
       { loader: 'css-loader', options: { minimize: env.NODE_ENV === 'production' } },
       { loader: 'postcss-loader', options: { sourceMap: true } },
       'resolve-url-loader',
-      'sass-loader',
+      { loader: 'sass-loader', options: { includePaths: ['app/javascript'] } },
     ],
   }),
 };
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index 50fa48175..35b9bbd1c 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -1,35 +1,55 @@
 // Note: You must restart bin/webpack-dev-server for changes to take effect
 
 const webpack = require('webpack');
-const { basename, dirname, join, relative, resolve, sep } = 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, themes, output, loadersDir } = require('./configuration.js');
-const localePackPaths = require('./generateLocalePacks');
+const { env, settings, core, flavours, output, loadersDir } = require('./configuration.js');
+const localePacks = require('./generateLocalePacks');
 
-const extensionGlob = `**/*{${settings.extensions.join(',')}}*`;
-const entryPath = join(settings.source_path, settings.source_entry_path);
-const packPaths = sync(join(entryPath, extensionGlob));
+function reducePacks (data, into = {}) {
+  if (!data.pack) {
+    return into;
+  }
+  Object.keys(data.pack).reduce((map, entry) => {
+    const pack = data.pack[entry];
+    if (!pack) {
+      return map;
+    }
+    const packFile = typeof pack === 'string' ? pack : pack.filename;
+    if (packFile) {
+      map[data.name ? `flavours/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile);
+    }
+    return map;
+  }, into);
+  if (data.name) {
+    Object.keys(data.skin).reduce((map, entry) => {
+      const skin = data.skin[entry];
+      const skinName = entry;
+      if (!skin) {
+        return map;
+      }
+      Object.keys(skin).reduce((map, entry) => {
+        const packFile = skin[entry];
+        if (!packFile) {
+          return map;
+        }
+        map[`skins/${data.name}/${skinName}/${entry}`] = resolve(packFile);
+        return map;
+      }, into);
+      return map;
+    }, into);
+  }
+  return into;
+}
 
 module.exports = {
   entry: Object.assign(
-    packPaths.reduce((map, entry) => {
-      const localMap = map;
-      const namespace = relative(join(entryPath), dirname(entry));
-      localMap[join(namespace, basename(entry, extname(entry)))] = resolve(entry);
-      return localMap;
-    }, {}),
-    localePackPaths.reduce((map, entry) => {
-      const localMap = map;
-      localMap[basename(entry, extname(entry, extname(entry)))] = resolve(entry);
-      return localMap;
-    }, {}),
-    Object.keys(themes).reduce((themePaths, name) => {
-      themePaths[name] = resolve(join(settings.source_path, themes[name]));
-      return themePaths;
-    }, {})
+    { locales: resolve('app', 'javascript', 'locales') },
+    localePacks,
+    reducePacks(core),
+    Object.keys(flavours).reduce((map, entry) => reducePacks(flavours[entry], map), {})
   ),
 
   output: {
@@ -52,25 +72,17 @@ module.exports = {
         resource.request = resource.request.replace(/^history/, 'history/es');
       }
     ),
-    new ExtractTextPlugin(env.NODE_ENV === 'production' ? '[name]-[contenthash].css' : '[name].css'),
+    new ExtractTextPlugin({
+      filename: env.NODE_ENV === 'production' ? '[name]-[contenthash].css' : '[name].css',
+      allChunks: true,
+    }),
     new ManifestPlugin({
       publicPath: output.publicPath,
       writeToFileEmit: true,
     }),
     new webpack.optimize.CommonsChunkPlugin({
-      name: 'common',
-      minChunks: (module, count) => {
-        const reactIntlPathRegexp = new RegExp(`node_modules\\${sep}react-intl`);
-
-        if (module.resource && reactIntlPathRegexp.test(module.resource)) {
-          // skip react-intl because it's useless to put in the common chunk,
-          // e.g. because "shared" modules between zh-TW and zh-CN will never
-          // be loaded together
-          return false;
-        }
-
-        return count >= 2;
-      },
+      name: 'locales',
+      minChunks: Infinity, // It doesn't make sense to use common chunks with multiple frontend support.
     }),
   ],
 
diff --git a/config/webpacker.yml b/config/webpacker.yml
index 8d8470651..50d95813a 100644
--- a/config/webpacker.yml
+++ b/config/webpacker.yml
@@ -2,7 +2,6 @@
 
 default: &default
   source_path: app/javascript
-  source_entry_path: packs
   public_output_path: packs
   cache_path: tmp/cache/webpacker
 
@@ -13,17 +12,6 @@ default: &default
   # Reload manifest.json on all requests so we reload latest compiled packs
   cache_manifest: false
 
-  extensions:
-    - .js
-    - .sass
-    - .scss
-    - .css
-    - .png
-    - .svg
-    - .gif
-    - .jpeg
-    - .jpg
-
 development:
   <<: *default
   compile: true