about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/environments/production.rb1
-rw-r--r--config/i18n-tasks.yml16
-rw-r--r--config/initializers/0_duplicate_migrations.rb52
-rw-r--r--config/initializers/content_security_policy.rb64
-rw-r--r--config/initializers/cors.rb4
-rw-r--r--config/initializers/locale.rb9
-rw-r--r--config/initializers/simple_form.rb10
-rw-r--r--config/locales-glitch/af.yml1
-rw-r--r--config/locales-glitch/an.yml1
-rw-r--r--config/locales-glitch/ar.yml1
-rw-r--r--config/locales-glitch/ast.yml1
-rw-r--r--config/locales-glitch/be.yml1
-rw-r--r--config/locales-glitch/bg.yml1
-rw-r--r--config/locales-glitch/bn.yml1
-rw-r--r--config/locales-glitch/br.yml1
-rw-r--r--config/locales-glitch/bs.yml1
-rw-r--r--config/locales-glitch/ca.yml1
-rw-r--r--config/locales-glitch/ckb.yml1
-rw-r--r--config/locales-glitch/co.yml1
-rw-r--r--config/locales-glitch/cs.yml38
-rw-r--r--config/locales-glitch/cy.yml1
-rw-r--r--config/locales-glitch/da.yml1
-rw-r--r--config/locales-glitch/de.yml42
-rw-r--r--config/locales-glitch/el.yml1
-rw-r--r--config/locales-glitch/en-GB.yml1
-rw-r--r--config/locales-glitch/en.yml42
-rw-r--r--config/locales-glitch/eo.yml1
-rw-r--r--config/locales-glitch/es-AR.yml20
-rw-r--r--config/locales-glitch/es-MX.yml20
-rw-r--r--config/locales-glitch/es.yml34
-rw-r--r--config/locales-glitch/et.yml1
-rw-r--r--config/locales-glitch/eu.yml1
-rw-r--r--config/locales-glitch/fa.yml1
-rw-r--r--config/locales-glitch/fi.yml1
-rw-r--r--config/locales-glitch/fo.yml1
-rw-r--r--config/locales-glitch/fr-QC.yml42
-rw-r--r--config/locales-glitch/fr.yml42
-rw-r--r--config/locales-glitch/fy.yml1
-rw-r--r--config/locales-glitch/ga.yml1
-rw-r--r--config/locales-glitch/gd.yml1
-rw-r--r--config/locales-glitch/gl.yml1
-rw-r--r--config/locales-glitch/he.yml1
-rw-r--r--config/locales-glitch/hi.yml1
-rw-r--r--config/locales-glitch/hr.yml1
-rw-r--r--config/locales-glitch/hu.yml1
-rw-r--r--config/locales-glitch/hy.yml1
-rw-r--r--config/locales-glitch/id.yml1
-rw-r--r--config/locales-glitch/ig.yml1
-rw-r--r--config/locales-glitch/io.yml1
-rw-r--r--config/locales-glitch/is.yml1
-rw-r--r--config/locales-glitch/it.yml1
-rw-r--r--config/locales-glitch/ja.yml20
-rw-r--r--config/locales-glitch/ka.yml1
-rw-r--r--config/locales-glitch/kab.yml1
-rw-r--r--config/locales-glitch/kk.yml1
-rw-r--r--config/locales-glitch/kn.yml1
-rw-r--r--config/locales-glitch/ko.yml42
-rw-r--r--config/locales-glitch/ku.yml1
-rw-r--r--config/locales-glitch/kw.yml1
-rw-r--r--config/locales-glitch/la.yml1
-rw-r--r--config/locales-glitch/lt.yml1
-rw-r--r--config/locales-glitch/lv.yml1
-rw-r--r--config/locales-glitch/mk.yml1
-rw-r--r--config/locales-glitch/ml.yml1
-rw-r--r--config/locales-glitch/mr.yml1
-rw-r--r--config/locales-glitch/ms.yml1
-rw-r--r--config/locales-glitch/my.yml1
-rw-r--r--config/locales-glitch/nl.yml1
-rw-r--r--config/locales-glitch/nn.yml1
-rw-r--r--config/locales-glitch/no.yml2
-rw-r--r--config/locales-glitch/oc.yml1
-rw-r--r--config/locales-glitch/pa.yml1
-rw-r--r--config/locales-glitch/pl.yml6
-rw-r--r--config/locales-glitch/pt-BR.yml42
-rw-r--r--config/locales-glitch/pt-PT.yml42
-rw-r--r--config/locales-glitch/ro.yml1
-rw-r--r--config/locales-glitch/ru.yml1
-rw-r--r--config/locales-glitch/sa.yml1
-rw-r--r--config/locales-glitch/sc.yml1
-rw-r--r--config/locales-glitch/sco.yml1
-rw-r--r--config/locales-glitch/si.yml1
-rw-r--r--config/locales-glitch/simple_form.af.yml1
-rw-r--r--config/locales-glitch/simple_form.an.yml1
-rw-r--r--config/locales-glitch/simple_form.ar.yml1
-rw-r--r--config/locales-glitch/simple_form.ast.yml1
-rw-r--r--config/locales-glitch/simple_form.be.yml1
-rw-r--r--config/locales-glitch/simple_form.bg.yml1
-rw-r--r--config/locales-glitch/simple_form.bn.yml1
-rw-r--r--config/locales-glitch/simple_form.br.yml1
-rw-r--r--config/locales-glitch/simple_form.bs.yml1
-rw-r--r--config/locales-glitch/simple_form.ca.yml1
-rw-r--r--config/locales-glitch/simple_form.ckb.yml1
-rw-r--r--config/locales-glitch/simple_form.co.yml1
-rw-r--r--config/locales-glitch/simple_form.cs.yml24
-rw-r--r--config/locales-glitch/simple_form.cy.yml1
-rw-r--r--config/locales-glitch/simple_form.da.yml1
-rw-r--r--config/locales-glitch/simple_form.de.yml27
-rw-r--r--config/locales-glitch/simple_form.el.yml1
-rw-r--r--config/locales-glitch/simple_form.en-GB.yml1
-rw-r--r--config/locales-glitch/simple_form.en.yml27
-rw-r--r--config/locales-glitch/simple_form.eo.yml1
-rw-r--r--config/locales-glitch/simple_form.es-AR.yml18
-rw-r--r--config/locales-glitch/simple_form.es-MX.yml18
-rw-r--r--config/locales-glitch/simple_form.es.yml18
-rw-r--r--config/locales-glitch/simple_form.et.yml1
-rw-r--r--config/locales-glitch/simple_form.eu.yml1
-rw-r--r--config/locales-glitch/simple_form.fa.yml1
-rw-r--r--config/locales-glitch/simple_form.fi.yml1
-rw-r--r--config/locales-glitch/simple_form.fo.yml1
-rw-r--r--config/locales-glitch/simple_form.fr-QC.yml27
-rw-r--r--config/locales-glitch/simple_form.fr.yml27
-rw-r--r--config/locales-glitch/simple_form.fy.yml1
-rw-r--r--config/locales-glitch/simple_form.ga.yml1
-rw-r--r--config/locales-glitch/simple_form.gd.yml1
-rw-r--r--config/locales-glitch/simple_form.gl.yml1
-rw-r--r--config/locales-glitch/simple_form.he.yml1
-rw-r--r--config/locales-glitch/simple_form.hi.yml1
-rw-r--r--config/locales-glitch/simple_form.hr.yml1
-rw-r--r--config/locales-glitch/simple_form.hu.yml1
-rw-r--r--config/locales-glitch/simple_form.hy.yml1
-rw-r--r--config/locales-glitch/simple_form.id.yml1
-rw-r--r--config/locales-glitch/simple_form.ig.yml1
-rw-r--r--config/locales-glitch/simple_form.io.yml1
-rw-r--r--config/locales-glitch/simple_form.is.yml1
-rw-r--r--config/locales-glitch/simple_form.it.yml1
-rw-r--r--config/locales-glitch/simple_form.ja.yml19
-rw-r--r--config/locales-glitch/simple_form.ka.yml1
-rw-r--r--config/locales-glitch/simple_form.kab.yml1
-rw-r--r--config/locales-glitch/simple_form.kk.yml1
-rw-r--r--config/locales-glitch/simple_form.kn.yml1
-rw-r--r--config/locales-glitch/simple_form.ko.yml27
-rw-r--r--config/locales-glitch/simple_form.ku.yml1
-rw-r--r--config/locales-glitch/simple_form.kw.yml1
-rw-r--r--config/locales-glitch/simple_form.la.yml1
-rw-r--r--config/locales-glitch/simple_form.lt.yml1
-rw-r--r--config/locales-glitch/simple_form.lv.yml1
-rw-r--r--config/locales-glitch/simple_form.mk.yml1
-rw-r--r--config/locales-glitch/simple_form.ml.yml1
-rw-r--r--config/locales-glitch/simple_form.mr.yml1
-rw-r--r--config/locales-glitch/simple_form.ms.yml1
-rw-r--r--config/locales-glitch/simple_form.my.yml1
-rw-r--r--config/locales-glitch/simple_form.nl.yml1
-rw-r--r--config/locales-glitch/simple_form.nn.yml1
-rw-r--r--config/locales-glitch/simple_form.no.yml2
-rw-r--r--config/locales-glitch/simple_form.oc.yml1
-rw-r--r--config/locales-glitch/simple_form.pa.yml1
-rw-r--r--config/locales-glitch/simple_form.pl.yml10
-rw-r--r--config/locales-glitch/simple_form.pt-BR.yml27
-rw-r--r--config/locales-glitch/simple_form.pt-PT.yml1
-rw-r--r--config/locales-glitch/simple_form.ro.yml1
-rw-r--r--config/locales-glitch/simple_form.ru.yml1
-rw-r--r--config/locales-glitch/simple_form.sa.yml1
-rw-r--r--config/locales-glitch/simple_form.sc.yml1
-rw-r--r--config/locales-glitch/simple_form.sco.yml1
-rw-r--r--config/locales-glitch/simple_form.si.yml1
-rw-r--r--config/locales-glitch/simple_form.sk.yml1
-rw-r--r--config/locales-glitch/simple_form.sl.yml1
-rw-r--r--config/locales-glitch/simple_form.sq.yml1
-rw-r--r--config/locales-glitch/simple_form.sr-Latn.yml1
-rw-r--r--config/locales-glitch/simple_form.sr.yml1
-rw-r--r--config/locales-glitch/simple_form.sv.yml1
-rw-r--r--config/locales-glitch/simple_form.ta.yml1
-rw-r--r--config/locales-glitch/simple_form.te.yml1
-rw-r--r--config/locales-glitch/simple_form.th.yml1
-rw-r--r--config/locales-glitch/simple_form.tr.yml1
-rw-r--r--config/locales-glitch/simple_form.tt.yml1
-rw-r--r--config/locales-glitch/simple_form.ug.yml1
-rw-r--r--config/locales-glitch/simple_form.uk.yml1
-rw-r--r--config/locales-glitch/simple_form.ur.yml1
-rw-r--r--config/locales-glitch/simple_form.vi.yml1
-rw-r--r--config/locales-glitch/simple_form.zh-CN.yml18
-rw-r--r--config/locales-glitch/simple_form.zh-HK.yml1
-rw-r--r--config/locales-glitch/simple_form.zh-TW.yml1
-rw-r--r--config/locales-glitch/sk.yml1
-rw-r--r--config/locales-glitch/sl.yml1
-rw-r--r--config/locales-glitch/sq.yml1
-rw-r--r--config/locales-glitch/sr-Latn.yml1
-rw-r--r--config/locales-glitch/sr.yml1
-rw-r--r--config/locales-glitch/sv.yml1
-rw-r--r--config/locales-glitch/ta.yml1
-rw-r--r--config/locales-glitch/te.yml1
-rw-r--r--config/locales-glitch/th.yml1
-rw-r--r--config/locales-glitch/tr.yml1
-rw-r--r--config/locales-glitch/tt.yml1
-rw-r--r--config/locales-glitch/ug.yml1
-rw-r--r--config/locales-glitch/uk.yml1
-rw-r--r--config/locales-glitch/ur.yml1
-rw-r--r--config/locales-glitch/vi.yml1
-rw-r--r--config/locales-glitch/zh-CN.yml20
-rw-r--r--config/locales-glitch/zh-HK.yml1
-rw-r--r--config/locales-glitch/zh-TW.yml1
-rw-r--r--config/navigation.rb6
-rw-r--r--config/routes.rb9
-rw-r--r--config/settings.yml14
-rw-r--r--config/themes.yml3
-rw-r--r--config/webpack/configuration.js54
-rw-r--r--config/webpack/generateLocalePacks.js102
-rw-r--r--config/webpack/rules/babel.js1
-rw-r--r--config/webpack/rules/css.js3
-rw-r--r--config/webpack/shared.js76
-rw-r--r--config/webpack/translationRunner.js27
-rw-r--r--config/webpacker.yml1
202 files changed, 1237 insertions, 113 deletions
diff --git a/config/environments/production.rb b/config/environments/production.rb
index ef52228a0..95c6e790f 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -127,6 +127,7 @@ Rails.application.configure do
     'X-Frame-Options'        => 'DENY',
     'X-Content-Type-Options' => 'nosniff',
     'X-XSS-Protection'       => '0',
+    'X-Clacks-Overhead'      => 'GNU Natalie Nguyen',
     'Referrer-Policy'        => 'same-origin',
   }
 
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index 46dd3124b..a3b5e5c72 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -4,12 +4,19 @@
 base_locale: en
 data:
   read:
-    - config/locales/%{locale}.yml
-    - config/locales/**/*.%{locale}.yml
+    - config/locales-glitch/%{locale}.yml
+    - config/locales-glitch/*.%{locale}.yml
 
   write:
-    - ['{devise, simple_form, doorkeeper}.*', 'config/locales/\1.%{locale}.yml']
+    - [
+        '{devise, simple_form, doorkeeper}.*',
+        'config/locales-glitch/\1.%{locale}.yml',
+      ]
+    - config/locales-glitch/%{locale}.yml
+
+  external:
     - config/locales/%{locale}.yml
+    - config/locales/**/*.%{locale}.yml
 
   yaml:
     write:
@@ -50,7 +57,7 @@ ignore_unused:
   - 'activerecord.errors.*'
   - '{devise,pagination,doorkeeper}.*'
   - '{date,datetime,time,number}.*'
-  - 'simple_form.{yes,no,recommended,not_recommended}'
+  - 'simple_form.{yes,no,recommended,not_recommended,glitch_only}'
   - 'simple_form.{placeholders,hints,labels}.*'
   - 'simple_form.{error_notification,required}.:'
   - 'errors.messages.*'
@@ -62,6 +69,7 @@ ignore_unused:
   - 'admin.reports.summary.actions.*'
   - 'admin_mailer.new_appeal.actions.*'
   - 'statuses.attached.*'
+  - 'themes.*'
   - 'move_handler.carry_{mutes,blocks}_over_text'
   - 'notification_mailer.*'
 
diff --git a/config/initializers/0_duplicate_migrations.rb b/config/initializers/0_duplicate_migrations.rb
new file mode 100644
index 000000000..6c45e4bd2
--- /dev/null
+++ b/config/initializers/0_duplicate_migrations.rb
@@ -0,0 +1,52 @@
+# Some migrations have been present in glitch-soc for a long time and have then
+# been merged in upstream Mastodon, under a different version number.
+#
+# This puts us in an uneasy situation in which if we remove upstream's
+# migration file, people migrating from upstream will end up having a conflict
+# with their already-ran migration.
+#
+# On the other hand, if we keep upstream's migration and remove our own,
+# any current glitch-soc user will have a conflict during migration.
+#
+# For lack of a better solution, as those migrations are indeed identical,
+# we decided monkey-patching Rails' Migrator to completely ignore the duplicate,
+# keeping only the one that has run, or an arbitrary one.
+
+ALLOWED_DUPLICATES = [20180410220657, 20180831171112].freeze
+
+module ActiveRecord
+  class Migrator
+    def self.new(direction, migrations, schema_migration, target_version = nil)
+      migrated = Set.new(Base.connection.migration_context.get_all_versions)
+
+      migrations.group_by(&:name).each do |name, duplicates|
+        if duplicates.length > 1 && duplicates.all? { |m| ALLOWED_DUPLICATES.include?(m.version) }
+          # We have a set of allowed duplicates. Keep the migrated one, if any.
+          non_migrated = duplicates.reject { |m| migrated.include?(m.version.to_i) }
+
+          if duplicates.length == non_migrated.length || non_migrated.length == 0
+            # There weren't any migrated one, so we have to pick one “canonical” migration
+            migrations = migrations - duplicates[1..-1]
+          else
+            # Just reject every duplicate which hasn't been migrated yet
+            migrations = migrations - non_migrated
+          end
+        end
+      end
+
+      super(direction, migrations, schema_migration, target_version)
+    end
+  end
+
+  class MigrationContext
+    def needs_migration?
+      # A set of duplicated migrations is considered migrated if at least one of
+      # them is migrated.
+      migrated = get_all_versions
+      migrations.group_by(&:name).each do |name, duplicates|
+        return true unless duplicates.any? { |m| migrated.include?(m.version.to_i) }
+      end
+      return false
+    end
+  end
+end
diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb
index 96026ce3b..ce8aa7af2 100644
--- a/config/initializers/content_security_policy.rb
+++ b/config/initializers/content_security_policy.rb
@@ -2,42 +2,46 @@
 # For further information see the following documentation
 # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
 
-def host_to_url(str)
-  "http#{Rails.configuration.x.use_https ? 's' : ''}://#{str}" unless str.blank?
-end
+if Rails.env.production?
+  assets_host = Rails.configuration.action_controller.asset_host || "https://#{ENV['WEB_DOMAIN'] || ENV['LOCAL_DOMAIN']}"
+  data_hosts = [assets_host]
 
-base_host = Rails.configuration.x.web_domain
+  if ENV['S3_ENABLED'] == 'true'
+    attachments_host = "https://#{ENV['S3_ALIAS_HOST'] || ENV['S3_CLOUDFRONT_HOST'] || ENV['S3_HOSTNAME'] || "s3-#{ENV['S3_REGION'] || 'us-east-1'}.amazonaws.com"}"
+    attachments_host = "https://#{Addressable::URI.parse(attachments_host).host}"
+  elsif ENV['SWIFT_ENABLED'] == 'true'
+    attachments_host = ENV['SWIFT_OBJECT_URL']
+    attachments_host = "https://#{Addressable::URI.parse(attachments_host).host}"
+  else
+    attachments_host = nil
+  end
 
-assets_host   = Rails.configuration.action_controller.asset_host
-assets_host ||= host_to_url(base_host)
+  data_hosts << attachments_host unless attachments_host.nil?
 
-media_host   = host_to_url(ENV['S3_ALIAS_HOST'])
-media_host ||= host_to_url(ENV['S3_CLOUDFRONT_HOST'])
-media_host ||= host_to_url(ENV['S3_HOSTNAME']) if ENV['S3_ENABLED'] == 'true'
-media_host ||= assets_host
+  if ENV['PAPERCLIP_ROOT_URL']
+    url = Addressable::URI.parse(assets_host) + ENV['PAPERCLIP_ROOT_URL']
+    data_hosts << "https://#{url.host}"
+  end
 
-Rails.application.config.content_security_policy do |p|
-  p.base_uri        :none
-  p.default_src     :none
-  p.frame_ancestors :none
-  p.font_src        :self, assets_host
-  p.img_src         :self, :https, :data, :blob, assets_host
-  p.style_src       :self, assets_host
-  p.media_src       :self, :https, :data, assets_host
-  p.frame_src       :self, :https
-  p.manifest_src    :self, assets_host
-  p.form_action     :self
-  p.child_src       :self, :blob, assets_host
-  p.worker_src      :self, :blob, assets_host
+  data_hosts.concat(ENV['EXTRA_DATA_HOSTS'].split('|')) if ENV['EXTRA_DATA_HOSTS']
 
-  if Rails.env.development?
-    webpacker_urls = %w(ws http).map { |protocol| "#{protocol}#{Webpacker.dev_server.https? ? 's' : ''}://#{Webpacker.dev_server.host_with_port}" }
+  data_hosts.uniq!
 
-    p.connect_src :self, :data, :blob, assets_host, media_host, Rails.configuration.x.streaming_api_base_url, *webpacker_urls
-    p.script_src  :self, :unsafe_inline, :unsafe_eval, assets_host
-  else
-    p.connect_src :self, :data, :blob, assets_host, media_host, Rails.configuration.x.streaming_api_base_url
-    p.script_src  :self, assets_host, "'wasm-unsafe-eval'"
+  Rails.application.config.content_security_policy do |p|
+    p.base_uri        :none
+    p.default_src     :none
+    p.frame_ancestors :none
+    p.script_src      :self, assets_host, "'wasm-unsafe-eval'"
+    p.font_src        :self, assets_host
+    p.img_src         :self, :data, :blob, *data_hosts
+    p.style_src       :self, assets_host
+    p.media_src       :self, :data, *data_hosts
+    p.frame_src       :self, :https
+    p.child_src       :self, :blob, assets_host
+    p.worker_src      :self, :blob, assets_host
+    p.connect_src     :self, :blob, :data, Rails.configuration.x.streaming_api_base_url, *data_hosts
+    p.manifest_src    :self, assets_host
+    p.form_action     :self
   end
 end
 
diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb
index 55f8c9c91..bc782bc76 100644
--- a/config/initializers/cors.rb
+++ b/config/initializers/cors.rb
@@ -30,5 +30,9 @@ Rails.application.config.middleware.insert_before 0, Rack::Cors do
       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/initializers/locale.rb b/config/initializers/locale.rb
new file mode 100644
index 000000000..4bcb1854c
--- /dev/null
+++ b/config/initializers/locale.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+Rails.application.configure do
+  config.i18n.load_path += Dir[Rails.root.join('app', 'javascript', 'flavours', '*', 'names.{rb,yml}').to_s]
+  config.i18n.load_path += Dir[Rails.root.join('app', 'javascript', 'flavours', '*', 'names', '*.{rb,yml}').to_s]
+  config.i18n.load_path += Dir[Rails.root.join('app', 'javascript', 'skins', '*', '*', 'names.{rb,yml}').to_s]
+  config.i18n.load_path += Dir[Rails.root.join('app', 'javascript', 'skins', '*', '*', 'names', '*.{rb,yml}').to_s]
+  config.i18n.load_path += Dir[Rails.root.join('config', 'locales-glitch', '*.{rb,yml}').to_s]
+end
diff --git a/config/initializers/simple_form.rb b/config/initializers/simple_form.rb
index 92cffc5a2..d167a1600 100644
--- a/config/initializers/simple_form.rb
+++ b/config/initializers/simple_form.rb
@@ -19,8 +19,17 @@ module RecommendedComponent
   end
 end
 
+module GlitchOnlyComponent
+  def glitch_only(_wrapper_options = nil)
+    return unless options[:glitch_only]
+    options[:label_text] = ->(raw_label_text, _required_label_text, _label_present) { safe_join([raw_label_text, ' ', content_tag(:span, I18n.t('simple_form.glitch_only'), class: 'glitch_only')]) }
+    nil
+  end
+end
+
 SimpleForm.include_component(AppendComponent)
 SimpleForm.include_component(RecommendedComponent)
+SimpleForm.include_component(GlitchOnlyComponent)
 
 SimpleForm.setup do |config|
   # Wrappers are used by the form builder to generate a
@@ -78,6 +87,7 @@ SimpleForm.setup do |config|
 
     b.wrapper tag: :div, class: :label_input do |ba|
       ba.optional :recommended
+      ba.optional :glitch_only
       ba.use :label
 
       ba.wrapper tag: :div, class: :label_input__wrapper do |bb|
diff --git a/config/locales-glitch/af.yml b/config/locales-glitch/af.yml
new file mode 100644
index 000000000..252f9fd5a
--- /dev/null
+++ b/config/locales-glitch/af.yml
@@ -0,0 +1 @@
+af:
diff --git a/config/locales-glitch/an.yml b/config/locales-glitch/an.yml
new file mode 100644
index 000000000..76cc0689b
--- /dev/null
+++ b/config/locales-glitch/an.yml
@@ -0,0 +1 @@
+an:
diff --git a/config/locales-glitch/ar.yml b/config/locales-glitch/ar.yml
new file mode 100644
index 000000000..c257bc08a
--- /dev/null
+++ b/config/locales-glitch/ar.yml
@@ -0,0 +1 @@
+ar:
diff --git a/config/locales-glitch/ast.yml b/config/locales-glitch/ast.yml
new file mode 100644
index 000000000..d762c9399
--- /dev/null
+++ b/config/locales-glitch/ast.yml
@@ -0,0 +1 @@
+ast:
diff --git a/config/locales-glitch/be.yml b/config/locales-glitch/be.yml
new file mode 100644
index 000000000..91ccc2d7e
--- /dev/null
+++ b/config/locales-glitch/be.yml
@@ -0,0 +1 @@
+be:
diff --git a/config/locales-glitch/bg.yml b/config/locales-glitch/bg.yml
new file mode 100644
index 000000000..d0e375da9
--- /dev/null
+++ b/config/locales-glitch/bg.yml
@@ -0,0 +1 @@
+bg:
diff --git a/config/locales-glitch/bn.yml b/config/locales-glitch/bn.yml
new file mode 100644
index 000000000..152c69829
--- /dev/null
+++ b/config/locales-glitch/bn.yml
@@ -0,0 +1 @@
+bn:
diff --git a/config/locales-glitch/br.yml b/config/locales-glitch/br.yml
new file mode 100644
index 000000000..c7677c850
--- /dev/null
+++ b/config/locales-glitch/br.yml
@@ -0,0 +1 @@
+br:
diff --git a/config/locales-glitch/bs.yml b/config/locales-glitch/bs.yml
new file mode 100644
index 000000000..e9e174462
--- /dev/null
+++ b/config/locales-glitch/bs.yml
@@ -0,0 +1 @@
+bs:
diff --git a/config/locales-glitch/ca.yml b/config/locales-glitch/ca.yml
new file mode 100644
index 000000000..f0c487273
--- /dev/null
+++ b/config/locales-glitch/ca.yml
@@ -0,0 +1 @@
+ca:
diff --git a/config/locales-glitch/ckb.yml b/config/locales-glitch/ckb.yml
new file mode 100644
index 000000000..77d538af7
--- /dev/null
+++ b/config/locales-glitch/ckb.yml
@@ -0,0 +1 @@
+ckb:
diff --git a/config/locales-glitch/co.yml b/config/locales-glitch/co.yml
new file mode 100644
index 000000000..5330938e0
--- /dev/null
+++ b/config/locales-glitch/co.yml
@@ -0,0 +1 @@
+co:
diff --git a/config/locales-glitch/cs.yml b/config/locales-glitch/cs.yml
new file mode 100644
index 000000000..940df937b
--- /dev/null
+++ b/config/locales-glitch/cs.yml
@@ -0,0 +1,38 @@
+---
+cs:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Při kopírování některých emoji došlo k chybě: %{message}'
+      batch_error: 'Došlo k chybě: %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Tato funkce používá externí skripty služby hCaptcha, což může být problém z hlediska bezpečí a ochrany dat. Také to může <strong>některým (hlavně postiženým) lidem registrační proces výrazně zkomplikovat</strong>. Z tohoto důvodu prosím raději zvažte jiné možnosti, jako je schvalování registrací nebo registrace pouze pro zvané.<br>Uživatelům pozvaným skrze omezenou pozvánku se CAPTCHA nezobrazí.
+        title: Vyžadovat po nových uživatelích opsání textu z obrázku (CAPTCHA)
+      flavour_and_skin:
+        title: Rozhraní a styl
+      hide_followers_count:
+        desc_html: Nezobrazovat na uživatelských profilech počet sledujících
+        title: Schovat počet sledujících
+      other:
+        preamble: Různá nastavení glitch-soc, která se nevešla do jiných kategorií.
+        title: Jiné
+      outgoing_spoilers:
+        desc_html: Při federování příspěvků se přidá toto varování o obsahu příspěvkům, které žádné nemají. To může být užitečné, pokud je váš server zaměřen na specifický obsah, pro který by jiné servery mohly varování o obsahu vyžadovat. Připojená média budou označena jako citlivá.
+        title: Varování o obsahu pro odesílané příspěvky
+      show_reblogs_in_public_timelines:
+        desc_html: Veřejné boosty veřejných příspěvků se zobrazí na místní a federované časové ose.
+        title: Zobrazovat ve veřejných časových osách boosty
+      show_replies_in_public_timelines:
+        desc_html: Na místní a federované časové ose se kromě odpovědí autora na vlastní příspěvky (vláken) zobrazí i ostatní veřejné odpovědi.
+        title: Zobrazovat ve veřejných časových osách odpovědi
+      trending_status_cw:
+        desc_html: Zobrazovat v rámci trendů (pokud jsou zapnuté) i příspěvky s varováním o obsahu. Změny tohoto nastavení se neprojeví retroaktivně.
+        title: Povolit v trendech příspěvky s varováním o obsahu
+  auth:
+    captcha_confirmation:
+      hint_html: Už jen poslední krok! Pro potvrzení svého účtu opište prosím text z obrázku (CAPTCHA). Pokud máte dotazy nebo potřebujete s potvrzením pomoct, můžete <a href="/about/more">kontaktovat administrátora</a>.
+      title: Ověření uživatele
+  generic:
+    use_this: Použít
+  settings:
+    flavours: Rozhraní
diff --git a/config/locales-glitch/cy.yml b/config/locales-glitch/cy.yml
new file mode 100644
index 000000000..deefc9438
--- /dev/null
+++ b/config/locales-glitch/cy.yml
@@ -0,0 +1 @@
+cy:
diff --git a/config/locales-glitch/da.yml b/config/locales-glitch/da.yml
new file mode 100644
index 000000000..347c94d5e
--- /dev/null
+++ b/config/locales-glitch/da.yml
@@ -0,0 +1 @@
+da:
diff --git a/config/locales-glitch/de.yml b/config/locales-glitch/de.yml
new file mode 100644
index 000000000..a2ea8248c
--- /dev/null
+++ b/config/locales-glitch/de.yml
@@ -0,0 +1,42 @@
+---
+de:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Fehler ist beim Kopieren einiger der ausgewählten Emoji aufgetreten: %{message}'
+      batch_error: 'Ein Fehler ist aufgetreten: %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Dies beruht auf externen Skripts von hCaptcha, was Sicherheits- und Datenschutz-Bedenken auslösen kann. Zusätzlich <strong>kann das den Registrierungsprozess für manche (besonders behinderte) Leute signifikant weniger zugänglich machen</strong>. Aus diesen Gründen, bitte ziehe alternative Maßnahmen, wie Zulassungs- oder Einladungs-basierte Registrierung, in Erwägung.<br>Nutzer, die durch eine Einladung mit eingeschränkter Verwendungsanzahl eingeladen wurden, werden kein CAPTCHA lösen müssen
+        title: Neue Benutzer sollen ein CAPTCHA lösen müssen, um ihr Konto zu bestätigen
+      flavour_and_skin:
+        title: Variante und Skin
+      hide_followers_count:
+        desc_html: Follower nicht auf Nutzerprofilen anzeigen
+        title: Anzahl der Follower verbergen
+      other:
+        preamble: Verschiedene glitch-soc-Einstellungen, die nicht in andere Kategorien passen.
+        title: Sonstiges
+      outgoing_spoilers:
+        desc_html: Füge diese Inhaltswarnung bei föderierten Toots hinzu, wenn sie noch keine haben. Nützlich, wenn dein Server auf bestimmte Inhalte spezialisiert ist, die andere Server hinter einer Inhaltswarnung haben wollen. Medien werden auch als empfindlich markiert werden.
+        title: Inhaltswarnung für ausgehende Toots
+      show_reblogs_in_public_timelines:
+        desc_html: Zeige öffentlich geteilte Toots in lokalen und öffentlichen Timelines.
+        title: Zeige geteilte Toots in öffentlichen Timelines
+      show_replies_in_public_timelines:
+        desc_html: Neben öffentlichen Selbst-Antworten (Threads), öffentliche Antworten in lokalen und öffentlichen Timelines anzeigen.
+        title: Antworten in öffentlichen Timelines anzeigen
+      trending_status_cw:
+        desc_html: Erlaube Posts mit Inhaltswarnungen zu trenden, wenn angesagte Beiträge aktiviert sind. Änderungen an dieser Einstellung sind nicht rückwirkend.
+        title: Erlaube Posts mit Inhaltswarnungen zu trenden
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: Und auch für glitch-soc!
+  auth:
+    captcha_confirmation:
+      hint_html: Nur noch ein weiterer Schritt! Um dein Konto zu bestätigen, erfordert dieser Server das Lösen eines CAPTCHA von dir. Bei Fragen oder Problemen mit der Bestätigung kannst du <a href="/about/more">den Server-Administrator kontaktieren</a>.
+      title: Benutzer-Verifizierung
+  generic:
+    use_this: Benutze das
+  settings:
+    flavours: Varianten
diff --git a/config/locales-glitch/el.yml b/config/locales-glitch/el.yml
new file mode 100644
index 000000000..419ec705c
--- /dev/null
+++ b/config/locales-glitch/el.yml
@@ -0,0 +1 @@
+el:
diff --git a/config/locales-glitch/en-GB.yml b/config/locales-glitch/en-GB.yml
new file mode 100644
index 000000000..ef03d1810
--- /dev/null
+++ b/config/locales-glitch/en-GB.yml
@@ -0,0 +1 @@
+en-GB:
diff --git a/config/locales-glitch/en.yml b/config/locales-glitch/en.yml
new file mode 100644
index 000000000..e60a89e18
--- /dev/null
+++ b/config/locales-glitch/en.yml
@@ -0,0 +1,42 @@
+---
+en:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'An error occurred when copying some of the selected emoji: %{message}'
+      batch_error: 'An error occurred: %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: This relies on external scripts from hCaptcha, which may be a security and privacy concern. In addition, <strong>this can make the registration process significantly less accessible to some (especially disabled) people</strong>. For these reasons, please consider alternative measures such as approval-based or invite-based registration.<br>Users that have been invited through a limited-use invite will not need to solve a CAPTCHA
+        title: Require new users to solve a CAPTCHA to confirm their account
+      flavour_and_skin:
+        title: Flavour and skin
+      hide_followers_count:
+        desc_html: Do not show followers count on user profiles
+        title: Hide followers count
+      other:
+        preamble: Various glitch-soc settings not fitting in other categories.
+        title: Other
+      outgoing_spoilers:
+        desc_html: When federating toots, add this content warning to toots that do not have one. It is useful if your server is specialized in content other servers might want to have under a Content Warning. Media will also be marked as sensitive.
+        title: Content warning for outgoing toots
+      show_reblogs_in_public_timelines:
+        desc_html: Show public boosts of public toots in local and public timelines.
+        title: Show boosts in public timelines
+      show_replies_in_public_timelines:
+        desc_html: In addition to public self-replies (threads), show public replies in local and public timelines.
+        title: Show replies in public timelines
+      trending_status_cw:
+        desc_html: When trending posts are enabled, allow posts with Content Warnings to be eligible. Changes to this setting are not retroactive.
+        title: Allow posts with Content Warnings to trend
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: And likewise for glitch-soc!
+  auth:
+    captcha_confirmation:
+      hint_html: Just one more step! To confirm your account, this server requires you to solve a CAPTCHA. You can <a href="/about/more">contact the server administrator</a> if you have questions or need assistance with confirming your account.
+      title: User verification
+  generic:
+    use_this: Use this
+  settings:
+    flavours: Flavours
diff --git a/config/locales-glitch/eo.yml b/config/locales-glitch/eo.yml
new file mode 100644
index 000000000..759981404
--- /dev/null
+++ b/config/locales-glitch/eo.yml
@@ -0,0 +1 @@
+eo:
diff --git a/config/locales-glitch/es-AR.yml b/config/locales-glitch/es-AR.yml
new file mode 100644
index 000000000..fd38e165e
--- /dev/null
+++ b/config/locales-glitch/es-AR.yml
@@ -0,0 +1,20 @@
+---
+es-AR:
+  admin:
+    settings:
+      hide_followers_count:
+        desc_html: No mostrar el conteo de seguidorxs en perfiles de usuarix
+        title: Ocultar conteo de seguidorxs
+      outgoing_spoilers:
+        desc_html: Cuando los toots federen, agrega esta etiqueta de contenido a los toots que no tengan. Es útil si tu servidor se especializa en contenido que otros servidores desearían tener con una advertencia de contenido. Los medios también se marcarán como sensibles.
+        title: Advertencia de contenido para los toots salientes
+      show_reblogs_in_public_timelines:
+        desc_html: Mostrar retoots públicos en las línea de tiempo local y pública.
+        title: Mostrar retoots en líneas de tiempo públicas
+      show_replies_in_public_timelines:
+        desc_html: Además de auto-respuestas públicas (hilos), mostrar respuestas públicas en las línea de tiempo local y pública.
+        title: Mostrar respuestas en líneas de tiempo públicas
+  generic:
+    use_this: Usar
+  settings:
+    flavours: Ediciones
diff --git a/config/locales-glitch/es-MX.yml b/config/locales-glitch/es-MX.yml
new file mode 100644
index 000000000..48e24be76
--- /dev/null
+++ b/config/locales-glitch/es-MX.yml
@@ -0,0 +1,20 @@
+---
+es-MX:
+  admin:
+    settings:
+      hide_followers_count:
+        desc_html: No mostrar el conteo de seguidorxs en perfiles de usuarix
+        title: Ocultar conteo de seguidorxs
+      outgoing_spoilers:
+        desc_html: Cuando los toots federen, agrega esta etiqueta de contenido a los toots que no tengan. Es útil si tu servidor se especializa en contenido que otros servidores desearían tener con una advertencia de contenido. Los medios también se marcarán como sensibles.
+        title: Advertencia de contenido para los toots salientes
+      show_reblogs_in_public_timelines:
+        desc_html: Mostrar retoots públicos en las línea de tiempo local y pública.
+        title: Mostrar retoots en líneas de tiempo públicas
+      show_replies_in_public_timelines:
+        desc_html: Además de auto-respuestas públicas (hilos), mostrar respuestas públicas en las línea de tiempo local y pública.
+        title: Mostrar respuestas en líneas de tiempo públicas
+  generic:
+    use_this: Usar
+  settings:
+    flavours: Ediciones
diff --git a/config/locales-glitch/es.yml b/config/locales-glitch/es.yml
new file mode 100644
index 000000000..05a931372
--- /dev/null
+++ b/config/locales-glitch/es.yml
@@ -0,0 +1,34 @@
+---
+es:
+  admin:
+    custom_emojis:
+      batch_copy_error: Se produjo un error cuando se copian algunos emojis seleccionados %{message}
+      batch_error: Ocurrió un error %{message}
+    settings:
+      captcha_enabled:
+        title: Requerir que usuarixs nuevxs resuelvan un CAPTCHA para confirmar su cuenta
+      hide_followers_count:
+        desc_html: No mostrar el conteo de seguidorxs en perfiles de usuarix
+        title: Ocultar conteo de seguidorxs
+      outgoing_spoilers:
+        desc_html: Cuando los toots federen, agrega esta etiqueta de contenido a los toots que no tengan. Es útil si tu servidor se especializa en contenido que otros servidores desearían tener con una advertencia de contenido. Los medios también se marcarán como sensibles.
+        title: Advertencia de contenido para publicaciones salientes
+      show_reblogs_in_public_timelines:
+        desc_html: Mostrar impulsos públicos en las líneas de tiempo local y pública.
+        title: Mostrar impulsos en líneas de tiempo públicas
+      show_replies_in_public_timelines:
+        desc_html: Además de auto-respuestas públicas (hilos), mostrar respuestas públicas en las líneas de tiempo local y pública.
+        title: Mostrar respuestas en líneas de tiempo públicas
+      trending_status_cw:
+        title: Permitir que publicaciones con advertencias de contenido sean tendencia
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: Al igual que para glitch-soc!
+  auth:
+    captcha_confirmation:
+      title: Verificación de usuarix
+  generic:
+    use_this: Usar
+  settings:
+    flavours: Ediciones
diff --git a/config/locales-glitch/et.yml b/config/locales-glitch/et.yml
new file mode 100644
index 000000000..e020c4ffc
--- /dev/null
+++ b/config/locales-glitch/et.yml
@@ -0,0 +1 @@
+et:
diff --git a/config/locales-glitch/eu.yml b/config/locales-glitch/eu.yml
new file mode 100644
index 000000000..566e176fc
--- /dev/null
+++ b/config/locales-glitch/eu.yml
@@ -0,0 +1 @@
+eu:
diff --git a/config/locales-glitch/fa.yml b/config/locales-glitch/fa.yml
new file mode 100644
index 000000000..88215f82c
--- /dev/null
+++ b/config/locales-glitch/fa.yml
@@ -0,0 +1 @@
+fa:
diff --git a/config/locales-glitch/fi.yml b/config/locales-glitch/fi.yml
new file mode 100644
index 000000000..23c538b19
--- /dev/null
+++ b/config/locales-glitch/fi.yml
@@ -0,0 +1 @@
+fi:
diff --git a/config/locales-glitch/fo.yml b/config/locales-glitch/fo.yml
new file mode 100644
index 000000000..69f792cca
--- /dev/null
+++ b/config/locales-glitch/fo.yml
@@ -0,0 +1 @@
+fo:
diff --git a/config/locales-glitch/fr-QC.yml b/config/locales-glitch/fr-QC.yml
new file mode 100644
index 000000000..0cba194f5
--- /dev/null
+++ b/config/locales-glitch/fr-QC.yml
@@ -0,0 +1,42 @@
+---
+fr-QC:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Une erreur est survenue lors de la copie de certains des émojis sélectionnés : %{message}'
+      batch_error: 'Une erreur est survenue : %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Ceci se base sur des scripts externes venant de hCaptcha, ce qui peut engendrer des soucis de sécurité et de confidentialité. De plus, <strong>cela peut rendre l'inscription beaucoup moins accessible pour certaines personnes (comme les personnes handicapées)</strong>. Pour ces raisons, veuillez préférer des mesures alternatives telles que l'inscription sur acceptation ou invitation. <br>Les utilisateurs qui ont été invités via une invitation à usage limité n'auront pas à résoudre un CAPTCHA
+        title: Obliger les nouveaux utilisateurs à résoudre un CAPTCHA pour vérifier leur compte
+      flavour_and_skin:
+        title: Apparence et thèmes
+      hide_followers_count:
+        desc_html: Ne pas afficher le nombre d'abonné·e·s sur les profils des utilisateurs
+        title: Cacher le nombre d'abonné·e·s
+      other:
+        preamble: Divers autres paramètres de glitch-soc.
+        title: Autres
+      outgoing_spoilers:
+        desc_html: Ajouter un avertissement de contenu à tous les messages lorsqu'ils sont fédérés s'ils n'en possèdent pas déjà. Cela peut être utile si votre serveur est spécialisé dans un type de contenu sur lequel les autres serveurs pourraient vouloir un Avertissement de Contenu. Les médias seront également marqués comme sensibles.
+        title: Avertissement de contenu pour les messages sortants
+      show_reblogs_in_public_timelines:
+        desc_html: Afficher les partages publics de posts publics dans le fil local et global.
+        title: Afficher les partages dans les fils publics
+      show_replies_in_public_timelines:
+        desc_html: En plus des réponses à soi-même (threads), afficher les réponses publiques dans le fil local et global.
+        title: Afficher les réponses dans les fils publics
+      trending_status_cw:
+        desc_html: Quand les posts en tendance sont activés, permettre aux posts avec des avertissements de contenu (CW) d'être éligibles. Les changements effectués sur ce paramètre ne sont pas rétroactifs.
+        title: Autoriser les posts avec des avertissements de contenu à être en tendances
+  appearance:
+    localization:
+      glitch_guide_link: https://fr.crowdin.com/project/glitch-soc
+      glitch_guide_link_text: Et c'est pareil avec glitch-soc !
+  auth:
+    captcha_confirmation:
+      hint_html: Plus qu'une étape ! Pour vérifier votre compte sur ce serveur, vous devez résoudre un CAPTCHA. Vous pouvez <a href="/about/more">contacter l'administrateur·ice du serveur</a> si vous avez des questions ou besoin d'assistance dans la vérification de votre compte.
+      title: Vérification de l'utilisateur
+  generic:
+    use_this: Utiliser ceci
+  settings:
+    flavours: Thèmes
diff --git a/config/locales-glitch/fr.yml b/config/locales-glitch/fr.yml
new file mode 100644
index 000000000..15c3f8ce5
--- /dev/null
+++ b/config/locales-glitch/fr.yml
@@ -0,0 +1,42 @@
+---
+fr:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Une erreur est survenue lors de la copie de certains des émojis sélectionnés : %{message}'
+      batch_error: 'Une erreur est survenue : %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Ceci se base sur des scripts externes venant de hCaptcha, ce qui peut engendrer des soucis de sécurité et de confidentialité. De plus, <strong>cela peut rendre l'inscription beaucoup moins accessible pour certaines personnes (comme les personnes handicapées)</strong>. Pour ces raisons, veuillez préférer des mesures alternatives telles que l'inscription sur acceptation ou invitation. <br>Les utilisateurs qui ont été invités via une invitation à usage limité n'auront pas à résoudre un CAPTCHA
+        title: Obliger les nouveaux utilisateurs à résoudre un CAPTCHA pour vérifier leur compte
+      flavour_and_skin:
+        title: Apparence et thèmes
+      hide_followers_count:
+        desc_html: Ne pas afficher le nombre d'abonné·e·s sur les profils des utilisateurs
+        title: Cacher le nombre d'abonné·e·s
+      other:
+        preamble: Divers autres paramètres de glitch-soc.
+        title: Autres
+      outgoing_spoilers:
+        desc_html: Ajouter un avertissement de contenu à tous les messages lorsqu'ils sont fédérés s'ils n'en possèdent pas déjà. Cela peut être utile si votre serveur est spécialisé dans un type de contenu sur lequel les autres serveurs pourraient vouloir un Avertissement de Contenu. Les médias seront également marqués comme sensibles.
+        title: Avertissement de contenu pour les messages sortants
+      show_reblogs_in_public_timelines:
+        desc_html: Afficher les partages publics de posts publics dans le fil local et global.
+        title: Afficher les partages dans les fils publics
+      show_replies_in_public_timelines:
+        desc_html: En plus des réponses à soi-même (threads), afficher les réponses publiques dans le fil local et global.
+        title: Afficher les réponses dans les fils publics
+      trending_status_cw:
+        desc_html: Quand les posts en tendance sont activés, permettre aux posts avec des avertissements de contenu (CW) d'être éligibles. Les changements effectués sur ce paramètre ne sont pas rétroactifs.
+        title: Autoriser les posts avec des avertissements de contenu à être en tendances
+  appearance:
+    localization:
+      glitch_guide_link: https://fr.crowdin.com/project/glitch-soc
+      glitch_guide_link_text: Et c'est pareil avec glitch-soc !
+  auth:
+    captcha_confirmation:
+      hint_html: Plus qu'une étape ! Pour vérifier votre compte sur ce serveur, vous devez résoudre un CAPTCHA. Vous pouvez <a href="/about/more">contacter l'administrateur·ice du serveur</a> si vous avez des questions ou besoin d'assistance dans la vérification de votre compte.
+      title: Vérification de l'utilisateur
+  generic:
+    use_this: Utiliser ceci
+  settings:
+    flavours: Thèmes
diff --git a/config/locales-glitch/fy.yml b/config/locales-glitch/fy.yml
new file mode 100644
index 000000000..c05849f20
--- /dev/null
+++ b/config/locales-glitch/fy.yml
@@ -0,0 +1 @@
+fy:
diff --git a/config/locales-glitch/ga.yml b/config/locales-glitch/ga.yml
new file mode 100644
index 000000000..20a9da24e
--- /dev/null
+++ b/config/locales-glitch/ga.yml
@@ -0,0 +1 @@
+ga:
diff --git a/config/locales-glitch/gd.yml b/config/locales-glitch/gd.yml
new file mode 100644
index 000000000..1912f6c6a
--- /dev/null
+++ b/config/locales-glitch/gd.yml
@@ -0,0 +1 @@
+gd:
diff --git a/config/locales-glitch/gl.yml b/config/locales-glitch/gl.yml
new file mode 100644
index 000000000..8ec5fc81c
--- /dev/null
+++ b/config/locales-glitch/gl.yml
@@ -0,0 +1 @@
+gl:
diff --git a/config/locales-glitch/he.yml b/config/locales-glitch/he.yml
new file mode 100644
index 000000000..af6fa60a7
--- /dev/null
+++ b/config/locales-glitch/he.yml
@@ -0,0 +1 @@
+he:
diff --git a/config/locales-glitch/hi.yml b/config/locales-glitch/hi.yml
new file mode 100644
index 000000000..d758a5b53
--- /dev/null
+++ b/config/locales-glitch/hi.yml
@@ -0,0 +1 @@
+hi:
diff --git a/config/locales-glitch/hr.yml b/config/locales-glitch/hr.yml
new file mode 100644
index 000000000..f67f33c7e
--- /dev/null
+++ b/config/locales-glitch/hr.yml
@@ -0,0 +1 @@
+hr:
diff --git a/config/locales-glitch/hu.yml b/config/locales-glitch/hu.yml
new file mode 100644
index 000000000..52314c50c
--- /dev/null
+++ b/config/locales-glitch/hu.yml
@@ -0,0 +1 @@
+hu:
diff --git a/config/locales-glitch/hy.yml b/config/locales-glitch/hy.yml
new file mode 100644
index 000000000..c40654016
--- /dev/null
+++ b/config/locales-glitch/hy.yml
@@ -0,0 +1 @@
+hy:
diff --git a/config/locales-glitch/id.yml b/config/locales-glitch/id.yml
new file mode 100644
index 000000000..8446cbad9
--- /dev/null
+++ b/config/locales-glitch/id.yml
@@ -0,0 +1 @@
+id:
diff --git a/config/locales-glitch/ig.yml b/config/locales-glitch/ig.yml
new file mode 100644
index 000000000..7c264f0d7
--- /dev/null
+++ b/config/locales-glitch/ig.yml
@@ -0,0 +1 @@
+ig:
diff --git a/config/locales-glitch/io.yml b/config/locales-glitch/io.yml
new file mode 100644
index 000000000..c63dc0e8d
--- /dev/null
+++ b/config/locales-glitch/io.yml
@@ -0,0 +1 @@
+io:
diff --git a/config/locales-glitch/is.yml b/config/locales-glitch/is.yml
new file mode 100644
index 000000000..337c106df
--- /dev/null
+++ b/config/locales-glitch/is.yml
@@ -0,0 +1 @@
+is:
diff --git a/config/locales-glitch/it.yml b/config/locales-glitch/it.yml
new file mode 100644
index 000000000..85830635a
--- /dev/null
+++ b/config/locales-glitch/it.yml
@@ -0,0 +1 @@
+it:
diff --git a/config/locales-glitch/ja.yml b/config/locales-glitch/ja.yml
new file mode 100644
index 000000000..54ebfaeca
--- /dev/null
+++ b/config/locales-glitch/ja.yml
@@ -0,0 +1,20 @@
+---
+ja:
+  admin:
+    settings:
+      hide_followers_count:
+        desc_html: プロフィールページのフォロワー数を見られないようにします
+        title: フォロワー数を隠す
+      outgoing_spoilers:
+        desc_html: トゥートが連合される際、閲覧注意としてマークされていないトゥートにこの警告が追加されます。これはあなたのインスタンスが他のインスタンスに警告をして欲しいとされる投稿に特化している場合に便利です。 メディアは閲覧注意にマークされます。
+        title: 発信するトゥートへの警告
+      show_reblogs_in_public_timelines:
+        desc_html: ローカルタイムラインと連合タイムラインに公開投稿のブーストを表示します
+        title: 公開タイムラインにブーストを表示
+      show_replies_in_public_timelines:
+        desc_html: 自分への公開投稿の返信に加えて、すべての公開投稿の返信をローカルタイムラインと連合タイムラインに表示します。
+        title: 公開タイムラインに返信を表示
+  generic:
+    use_this: これを使う
+  settings:
+    flavours: フレーバー
diff --git a/config/locales-glitch/ka.yml b/config/locales-glitch/ka.yml
new file mode 100644
index 000000000..57a95cb04
--- /dev/null
+++ b/config/locales-glitch/ka.yml
@@ -0,0 +1 @@
+ka:
diff --git a/config/locales-glitch/kab.yml b/config/locales-glitch/kab.yml
new file mode 100644
index 000000000..2109c04b3
--- /dev/null
+++ b/config/locales-glitch/kab.yml
@@ -0,0 +1 @@
+kab:
diff --git a/config/locales-glitch/kk.yml b/config/locales-glitch/kk.yml
new file mode 100644
index 000000000..1dcc9b127
--- /dev/null
+++ b/config/locales-glitch/kk.yml
@@ -0,0 +1 @@
+kk:
diff --git a/config/locales-glitch/kn.yml b/config/locales-glitch/kn.yml
new file mode 100644
index 000000000..d094088d8
--- /dev/null
+++ b/config/locales-glitch/kn.yml
@@ -0,0 +1 @@
+kn:
diff --git a/config/locales-glitch/ko.yml b/config/locales-glitch/ko.yml
new file mode 100644
index 000000000..dd8da3792
--- /dev/null
+++ b/config/locales-glitch/ko.yml
@@ -0,0 +1,42 @@
+---
+ko:
+  admin:
+    custom_emojis:
+      batch_copy_error: '선택된 에모지를 복사하던 중 오류가 발생했습니다: %{message}'
+      batch_error: '에러가 발생했습니다: %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: 이것은 hCaptcha의 외부 스크립트에 의존합니다, 이것은 개인정보 보호에 위협을 가할 수도 있습니다. 추가적으로, <strong>이것은 몇몇 사람들(특히나 장애인들)에게 가입 절차의 접근성을 심각하게 떨어트릴 수 있습니다</strong>. 이러한 이유로, 대체제로 승인 전용이나 초대제를 통한 가입을 고려해보세요.<br>한정된 사용만 가능한 초대장을 통한 가입자들은 CAPTCHA를 풀지 않아도 됩니다
+        title: 새로운 사용자가 계정 확인을 위해서는 CAPTCHA를 풀어야 하도록 합니다
+      flavour_and_skin:
+        title: 풍미와 스킨
+      hide_followers_count:
+        desc_html: 사용자 프로필에 팔로워 수를 표시하지 않습니다
+        title: 팔로워 수 숨기기
+      other:
+        preamble: 다른 곳에 맞지 않는 다양한 글리치 전용 설정들.
+        title: 기타
+      outgoing_spoilers:
+        desc_html: 툿을 연합할 때 열람주의가 없다면 여기 적힌 열람주의를 추가합니다. 다른 서버에서 열람주의를 설정하기를 요하는 주제에 특화된 서버라면 유용합니다. 미디어 또한 민감함으로 설정됩니다.
+        title: 나가는 툿에 대한 열람주의
+      show_reblogs_in_public_timelines:
+        desc_html: 공개글의 공개적인 부스트를 로컬과 공개 타임라인에 표시합니다.
+        title: 부스트를 공개 타임라인에 표시
+      show_replies_in_public_timelines:
+        desc_html: 자기자신에 대한 답글(글타래)와 마찬가지로, 공개적인 답글을 로컬과 공개 타임라인에 표시합니다.
+        title: 답글을 공개 타임라인에 표시
+      trending_status_cw:
+        desc_html: 유행하는 게시물이 활성화 되었을 때, 열람주의가 설정된 글도 허용합니다. 이 설정의 변경은 소급 적용되지 않습니다.
+        title: 열람주의를 가진 글이 유행에 오를 수 있도록 허용
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: 글리치도 마찬가지입니다!
+  auth:
+    captcha_confirmation:
+      hint_html: 한가지 단계가 남았습니다! 계정을 확인하기 위해서는, CAPTCHA를 풀어야 합니다. 질문이 있거나 계정 확인 과정에서 도움을 받고 싶은 경우 <a href="/about/more">서버의 관리자에게 연락해서</a> 해결할 수 있습니다.
+      title: 사용자 확인
+  generic:
+    use_this: 사용하기
+  settings:
+    flavours: 풍미
diff --git a/config/locales-glitch/ku.yml b/config/locales-glitch/ku.yml
new file mode 100644
index 000000000..b36f7c988
--- /dev/null
+++ b/config/locales-glitch/ku.yml
@@ -0,0 +1 @@
+ku:
diff --git a/config/locales-glitch/kw.yml b/config/locales-glitch/kw.yml
new file mode 100644
index 000000000..b2cfc12ff
--- /dev/null
+++ b/config/locales-glitch/kw.yml
@@ -0,0 +1 @@
+kw:
diff --git a/config/locales-glitch/la.yml b/config/locales-glitch/la.yml
new file mode 100644
index 000000000..3a7ba0d44
--- /dev/null
+++ b/config/locales-glitch/la.yml
@@ -0,0 +1 @@
+la:
diff --git a/config/locales-glitch/lt.yml b/config/locales-glitch/lt.yml
new file mode 100644
index 000000000..6c5cb837a
--- /dev/null
+++ b/config/locales-glitch/lt.yml
@@ -0,0 +1 @@
+lt:
diff --git a/config/locales-glitch/lv.yml b/config/locales-glitch/lv.yml
new file mode 100644
index 000000000..1be0eabc0
--- /dev/null
+++ b/config/locales-glitch/lv.yml
@@ -0,0 +1 @@
+lv:
diff --git a/config/locales-glitch/mk.yml b/config/locales-glitch/mk.yml
new file mode 100644
index 000000000..8b9144a98
--- /dev/null
+++ b/config/locales-glitch/mk.yml
@@ -0,0 +1 @@
+mk:
diff --git a/config/locales-glitch/ml.yml b/config/locales-glitch/ml.yml
new file mode 100644
index 000000000..6931a683d
--- /dev/null
+++ b/config/locales-glitch/ml.yml
@@ -0,0 +1 @@
+ml:
diff --git a/config/locales-glitch/mr.yml b/config/locales-glitch/mr.yml
new file mode 100644
index 000000000..fe1639c6a
--- /dev/null
+++ b/config/locales-glitch/mr.yml
@@ -0,0 +1 @@
+mr:
diff --git a/config/locales-glitch/ms.yml b/config/locales-glitch/ms.yml
new file mode 100644
index 000000000..2925688a0
--- /dev/null
+++ b/config/locales-glitch/ms.yml
@@ -0,0 +1 @@
+ms:
diff --git a/config/locales-glitch/my.yml b/config/locales-glitch/my.yml
new file mode 100644
index 000000000..5e1fc6bee
--- /dev/null
+++ b/config/locales-glitch/my.yml
@@ -0,0 +1 @@
+my:
diff --git a/config/locales-glitch/nl.yml b/config/locales-glitch/nl.yml
new file mode 100644
index 000000000..f009eadee
--- /dev/null
+++ b/config/locales-glitch/nl.yml
@@ -0,0 +1 @@
+nl:
diff --git a/config/locales-glitch/nn.yml b/config/locales-glitch/nn.yml
new file mode 100644
index 000000000..777f4e600
--- /dev/null
+++ b/config/locales-glitch/nn.yml
@@ -0,0 +1 @@
+nn:
diff --git a/config/locales-glitch/no.yml b/config/locales-glitch/no.yml
new file mode 100644
index 000000000..1dcec34b6
--- /dev/null
+++ b/config/locales-glitch/no.yml
@@ -0,0 +1,2 @@
+---
+'no':
diff --git a/config/locales-glitch/oc.yml b/config/locales-glitch/oc.yml
new file mode 100644
index 000000000..325b34889
--- /dev/null
+++ b/config/locales-glitch/oc.yml
@@ -0,0 +1 @@
+oc:
diff --git a/config/locales-glitch/pa.yml b/config/locales-glitch/pa.yml
new file mode 100644
index 000000000..bb8a6c834
--- /dev/null
+++ b/config/locales-glitch/pa.yml
@@ -0,0 +1 @@
+pa:
diff --git a/config/locales-glitch/pl.yml b/config/locales-glitch/pl.yml
new file mode 100644
index 000000000..3fcdedcf3
--- /dev/null
+++ b/config/locales-glitch/pl.yml
@@ -0,0 +1,6 @@
+---
+pl:
+  generic:
+    use_this: Użyj tego
+  settings:
+    flavours: Odmiany
diff --git a/config/locales-glitch/pt-BR.yml b/config/locales-glitch/pt-BR.yml
new file mode 100644
index 000000000..95c1579ba
--- /dev/null
+++ b/config/locales-glitch/pt-BR.yml
@@ -0,0 +1,42 @@
+---
+pt-BR:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Ocorreu um erro ao copiar alguns dos emojis selecionados: %{message}'
+      batch_error: 'Ocorreu um erro: %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Isto se baseia em scripts externos de hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, <strong>isto pode tornar o processo de registro significativamente menos acessível para algumas pessoas (especialmente deficientes)</strong>. Por estas razões, favor considerar medidas alternativas como o registro baseado em aprovação ou em convite.<br>Os usuários que tiverem sido convidados através de um convite de uso limitado não precisarão resolver um CAPTCHA
+        title: Exigir que novos usuários resolvam um CAPTCHA para confirmar sua conta
+      flavour_and_skin:
+        title: Sabor e tema
+      hide_followers_count:
+        desc_html: Não mostrar contagem de seguidores em perfis de usuário
+        title: Ocultar número de seguidores
+      other:
+        preamble: Várias configurações de glitch-soc que não se ajustam em outras categorias.
+        title: Outros
+      outgoing_spoilers:
+        desc_html: Ao federar toots, adicione este aviso de conteúdo aos toots que não possuem um. É útil se seu servidor for especializado em conteúdo que outros servidores podem querer ter sob um Aviso de Conteúdo. Os meios de comunicação também serão marcados como sensíveis.
+        title: Aviso de conteúdo para toots enviados
+      show_reblogs_in_public_timelines:
+        desc_html: Mostrar impulsos públicos de toots públicos nas linhas de tempo locais e públicas.
+        title: Mostrar impulsos em timelines públicas
+      show_replies_in_public_timelines:
+        desc_html: Além das auto-respostas públicas (tópicos), mostrar respostas públicas em linhas do tempo locais e públicas.
+        title: Mostrar respostas em linhas do tempo públicas
+      trending_status_cw:
+        desc_html: Quando as mensagens de tendência estiverem habilitadas, permitir que as mensagens com Avisos de Conteúdo sejam elegíveis. As alterações a esta configuração não são retroativas.
+        title: Permitir que mensagens com Avisos de Conteúdo tornem-se tendência
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: E também para glitch-soc!
+  auth:
+    captcha_confirmation:
+      hint_html: Só mais um passo! Para confirmar a sua conta, este servidor requer que você resolva um CAPTCHA. Você pode <a href="/about/more">entrar em contato com o administrador do servidor</a> se você tiver dúvidas ou precisa de ajuda para confirmar sua conta.
+      title: Verificação de usuário
+  generic:
+    use_this: Use isto
+  settings:
+    flavours: Sabores
diff --git a/config/locales-glitch/pt-PT.yml b/config/locales-glitch/pt-PT.yml
new file mode 100644
index 000000000..18e41a056
--- /dev/null
+++ b/config/locales-glitch/pt-PT.yml
@@ -0,0 +1,42 @@
+---
+pt-PT:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Houve um erro ao copiar alguns dos emoji selecionados: %{message}'
+      batch_error: 'Houve um erro: %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Isto depende de scripts externos da hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, <strong>isto pode tornar o processo de registo menos acessível para algumas pessoas (especialmente as com limitações físicas)</strong>. Por isto, considera medidas alternativas tais como registo mediante aprovação ou sob convite.<br>Pessoas que se registam com um convite não precisam de resolver um CAPTCHA
+        title: Exigir que novas contas resolvam um CAPTCHA para validar o registo
+      flavour_and_skin:
+        title: Sabor e tema
+      hide_followers_count:
+        desc_html: Não mostrar o número de seguidores nos perfis
+        title: Esconder o número de seguidores
+      other:
+        preamble: Várias opções do glitch-soc que não cabem noutras categorias.
+        title: Outras opções
+      outgoing_spoilers:
+        desc_html: Ao federar toots, juntar este aviso de conteúdo aos toots que não têm aviso. Isto é útil se o teu servidor for especializado em conteúdos que outros servidores podem querer ter sob um Aviso de Conteúdo. Os media também vão ser marcados como sensíveis.
+        title: Aviso de conteúdo para toots enviados
+      show_reblogs_in_public_timelines:
+        desc_html: Mostrar boosts públicos de toots públicos nas linhas de tempo locais e públicas.
+        title: Mostrar boosts nas timelines públicas
+      show_replies_in_public_timelines:
+        desc_html: Além de auto-respostas públicas (fios), mostrar as respostas públicas em linhas de tempo locais e públicas.
+        title: Mostrar respostas nas linhas de tempo públicas
+      trending_status_cw:
+        desc_html: Quando os posts em tendência estão ativados, permitir que posts com Avisos de Conteúdo também possam aparecer. As alterações nesta opção não são retroativas.
+        title: Permitir que posts com Avisos de Conteúdo possam aparecer nos posts em tendência
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: E também para o glitch-soc!
+  auth:
+    captcha_confirmation:
+      hint_html: Só mais um passo! Para confirmares a tua conta, este servidor exige que resolvas um CAPTCHA. Podes <a href="/about/more">entrar em contacto com o administrador do servidor</a> se tiveres dúvidas ou precisares de ajuda.
+      title: Verificação
+  generic:
+    use_this: Usar isto
+  settings:
+    flavours: Sabores
diff --git a/config/locales-glitch/ro.yml b/config/locales-glitch/ro.yml
new file mode 100644
index 000000000..79dbaa871
--- /dev/null
+++ b/config/locales-glitch/ro.yml
@@ -0,0 +1 @@
+ro:
diff --git a/config/locales-glitch/ru.yml b/config/locales-glitch/ru.yml
new file mode 100644
index 000000000..ddc9d1e32
--- /dev/null
+++ b/config/locales-glitch/ru.yml
@@ -0,0 +1 @@
+ru:
diff --git a/config/locales-glitch/sa.yml b/config/locales-glitch/sa.yml
new file mode 100644
index 000000000..07ea4372a
--- /dev/null
+++ b/config/locales-glitch/sa.yml
@@ -0,0 +1 @@
+sa:
diff --git a/config/locales-glitch/sc.yml b/config/locales-glitch/sc.yml
new file mode 100644
index 000000000..91bd6d92f
--- /dev/null
+++ b/config/locales-glitch/sc.yml
@@ -0,0 +1 @@
+sc:
diff --git a/config/locales-glitch/sco.yml b/config/locales-glitch/sco.yml
new file mode 100644
index 000000000..8165e00a1
--- /dev/null
+++ b/config/locales-glitch/sco.yml
@@ -0,0 +1 @@
+sco:
diff --git a/config/locales-glitch/si.yml b/config/locales-glitch/si.yml
new file mode 100644
index 000000000..b0b50956e
--- /dev/null
+++ b/config/locales-glitch/si.yml
@@ -0,0 +1 @@
+si:
diff --git a/config/locales-glitch/simple_form.af.yml b/config/locales-glitch/simple_form.af.yml
new file mode 100644
index 000000000..252f9fd5a
--- /dev/null
+++ b/config/locales-glitch/simple_form.af.yml
@@ -0,0 +1 @@
+af:
diff --git a/config/locales-glitch/simple_form.an.yml b/config/locales-glitch/simple_form.an.yml
new file mode 100644
index 000000000..76cc0689b
--- /dev/null
+++ b/config/locales-glitch/simple_form.an.yml
@@ -0,0 +1 @@
+an:
diff --git a/config/locales-glitch/simple_form.ar.yml b/config/locales-glitch/simple_form.ar.yml
new file mode 100644
index 000000000..c257bc08a
--- /dev/null
+++ b/config/locales-glitch/simple_form.ar.yml
@@ -0,0 +1 @@
+ar:
diff --git a/config/locales-glitch/simple_form.ast.yml b/config/locales-glitch/simple_form.ast.yml
new file mode 100644
index 000000000..d762c9399
--- /dev/null
+++ b/config/locales-glitch/simple_form.ast.yml
@@ -0,0 +1 @@
+ast:
diff --git a/config/locales-glitch/simple_form.be.yml b/config/locales-glitch/simple_form.be.yml
new file mode 100644
index 000000000..91ccc2d7e
--- /dev/null
+++ b/config/locales-glitch/simple_form.be.yml
@@ -0,0 +1 @@
+be:
diff --git a/config/locales-glitch/simple_form.bg.yml b/config/locales-glitch/simple_form.bg.yml
new file mode 100644
index 000000000..d0e375da9
--- /dev/null
+++ b/config/locales-glitch/simple_form.bg.yml
@@ -0,0 +1 @@
+bg:
diff --git a/config/locales-glitch/simple_form.bn.yml b/config/locales-glitch/simple_form.bn.yml
new file mode 100644
index 000000000..152c69829
--- /dev/null
+++ b/config/locales-glitch/simple_form.bn.yml
@@ -0,0 +1 @@
+bn:
diff --git a/config/locales-glitch/simple_form.br.yml b/config/locales-glitch/simple_form.br.yml
new file mode 100644
index 000000000..c7677c850
--- /dev/null
+++ b/config/locales-glitch/simple_form.br.yml
@@ -0,0 +1 @@
+br:
diff --git a/config/locales-glitch/simple_form.bs.yml b/config/locales-glitch/simple_form.bs.yml
new file mode 100644
index 000000000..e9e174462
--- /dev/null
+++ b/config/locales-glitch/simple_form.bs.yml
@@ -0,0 +1 @@
+bs:
diff --git a/config/locales-glitch/simple_form.ca.yml b/config/locales-glitch/simple_form.ca.yml
new file mode 100644
index 000000000..f0c487273
--- /dev/null
+++ b/config/locales-glitch/simple_form.ca.yml
@@ -0,0 +1 @@
+ca:
diff --git a/config/locales-glitch/simple_form.ckb.yml b/config/locales-glitch/simple_form.ckb.yml
new file mode 100644
index 000000000..77d538af7
--- /dev/null
+++ b/config/locales-glitch/simple_form.ckb.yml
@@ -0,0 +1 @@
+ckb:
diff --git a/config/locales-glitch/simple_form.co.yml b/config/locales-glitch/simple_form.co.yml
new file mode 100644
index 000000000..5330938e0
--- /dev/null
+++ b/config/locales-glitch/simple_form.co.yml
@@ -0,0 +1 @@
+co:
diff --git a/config/locales-glitch/simple_form.cs.yml b/config/locales-glitch/simple_form.cs.yml
new file mode 100644
index 000000000..a0823d699
--- /dev/null
+++ b/config/locales-glitch/simple_form.cs.yml
@@ -0,0 +1,24 @@
+---
+cs:
+  simple_form:
+    hints:
+      defaults:
+        fields: Na svém profilu můžete mít zobrazeno několik položek (max. %{count}) jako tabulku
+        setting_default_content_type_html: Předpokládat, že nové příspěvky jsou napsané v HTML, pokud není uvedeno jinak
+        setting_default_content_type_markdown: Předpokládat, že nové příspěvky používají pro formátování Markdown, pokud není uvedeno jinak
+        setting_default_content_type_plain: Předpokládat, že nové příspěvky nejsou nijak formátované, pokud není uvedeno jinak (standardní chování Mastodonu)
+        setting_default_language: Jazyk vašich příspěvků lze detekovat automaticky, ale není to vždycky přesné
+        setting_hide_followers_count: Počet vašich sledujících se nebude nikomu zobrazovat, ani vám. Některé aplikace mohou zobrazit negativní počet sledujících.
+        setting_skin: Aplikuje barevný styl na zvolené rozhraní Mastodonu
+    labels:
+      defaults:
+        setting_default_content_type: Výchozí formát příspěvků
+        setting_default_content_type_plain: Prostý text
+        setting_favourite_modal: Před oblíbením příspěvku zobrazit potvrzovací dialog (pouze pro rozhraní Glitch)
+        setting_hide_followers_count: Skrýt počet vašich sledujících
+        setting_skin: Styl
+        setting_system_emoji_font: Použít výchozí emoji systému (pouze pro rozhraní Glitch)
+      notification_emails:
+        trending_link: Nový populární odkaz vyžaduje schválení
+        trending_status: Nový populární příspěvek vyžaduje schválení
+        trending_tag: Nový populární hashtag vyžaduje schválení
diff --git a/config/locales-glitch/simple_form.cy.yml b/config/locales-glitch/simple_form.cy.yml
new file mode 100644
index 000000000..deefc9438
--- /dev/null
+++ b/config/locales-glitch/simple_form.cy.yml
@@ -0,0 +1 @@
+cy:
diff --git a/config/locales-glitch/simple_form.da.yml b/config/locales-glitch/simple_form.da.yml
new file mode 100644
index 000000000..347c94d5e
--- /dev/null
+++ b/config/locales-glitch/simple_form.da.yml
@@ -0,0 +1 @@
+da:
diff --git a/config/locales-glitch/simple_form.de.yml b/config/locales-glitch/simple_form.de.yml
new file mode 100644
index 000000000..0d92038c5
--- /dev/null
+++ b/config/locales-glitch/simple_form.de.yml
@@ -0,0 +1,27 @@
+---
+de:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: Du kannst bis zu %{count} Elemente auf deinem Profil anzeigen lassen, die als Tabelle dargestellt werden
+        setting_default_content_type_html: Beim Schreiben von Toots annehmen, dass sie in rohem HTML geschrieben sind, sofern nicht anders angegeben
+        setting_default_content_type_markdown: Beim Schreiben von Toots annehmen, dass sie in Markdown für Rich-Text-Formatierung geschrieben sind, sofern nicht anders angegeben
+        setting_default_content_type_plain: Beim Schreiben von Toots annehmen, dass sie in Klartext ohne spezielle Formatierung geschrieben sind, sofern nicht anders angegeben (standardmäßiges Mastodon-Verhalten)
+        setting_default_language: Die Sprache deiner Toots kann automatisch erkannt werden, aber sie ist nicht immer korrekt
+        setting_hide_followers_count: Verberge deine Follower-Anzahl vor allen, einschließlich dir. Manche Anwendungen könnten eine negative Follower-Anzahl anzeigen.
+        setting_skin: Verändert die ausgewählte Mastodon-Variante
+    labels:
+      defaults:
+        setting_default_content_type: Standardformat für Toots
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Unformatierter Text
+        setting_favourite_modal: Bestätigungsdialog vor dem Favorisieren anzeigen (gilt nur für Glitch-Variante)
+        setting_hide_followers_count: Anzahl der Follower verbergen
+        setting_skin: Skin
+        setting_system_emoji_font: Systemschriftart für Emojis verwenden (nur für Glitch-Variante)
+      notification_emails:
+        trending_link: Neuer angesagter Link muss überprüft werden
+        trending_status: Neuer angesagter Post muss überprüft werden
+        trending_tag: Neuer angesagter Tag muss überprüft werden
diff --git a/config/locales-glitch/simple_form.el.yml b/config/locales-glitch/simple_form.el.yml
new file mode 100644
index 000000000..419ec705c
--- /dev/null
+++ b/config/locales-glitch/simple_form.el.yml
@@ -0,0 +1 @@
+el:
diff --git a/config/locales-glitch/simple_form.en-GB.yml b/config/locales-glitch/simple_form.en-GB.yml
new file mode 100644
index 000000000..ef03d1810
--- /dev/null
+++ b/config/locales-glitch/simple_form.en-GB.yml
@@ -0,0 +1 @@
+en-GB:
diff --git a/config/locales-glitch/simple_form.en.yml b/config/locales-glitch/simple_form.en.yml
new file mode 100644
index 000000000..6930c09a6
--- /dev/null
+++ b/config/locales-glitch/simple_form.en.yml
@@ -0,0 +1,27 @@
+---
+en:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: You can have up to %{count} items displayed as a table on your profile
+        setting_default_content_type_html: When writing toots, assume they are written in raw HTML, unless specified otherwise
+        setting_default_content_type_markdown: When writing toots, assume they are using Markdown for rich text formatting, unless specified otherwise
+        setting_default_content_type_plain: When writing toots, assume they are plain text with no special formatting, unless specified otherwise (default Mastodon behavior)
+        setting_default_language: The language of your toots can be detected automatically, but it's not always accurate
+        setting_hide_followers_count: Hide your followers count from everybody, including you. Some applications may display a negative followers count.
+        setting_skin: Reskins the selected Mastodon flavour
+    labels:
+      defaults:
+        setting_default_content_type: Default format for toots
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Plain text
+        setting_favourite_modal: Show confirmation dialog before favouriting (applies to Glitch flavour only)
+        setting_hide_followers_count: Hide your followers count
+        setting_skin: Skin
+        setting_system_emoji_font: Use system's default font for emojis (applies to Glitch flavour only)
+      notification_emails:
+        trending_link: New trending link requires review
+        trending_status: New trending post requires review
+        trending_tag: New trending tag requires review
diff --git a/config/locales-glitch/simple_form.eo.yml b/config/locales-glitch/simple_form.eo.yml
new file mode 100644
index 000000000..759981404
--- /dev/null
+++ b/config/locales-glitch/simple_form.eo.yml
@@ -0,0 +1 @@
+eo:
diff --git a/config/locales-glitch/simple_form.es-AR.yml b/config/locales-glitch/simple_form.es-AR.yml
new file mode 100644
index 000000000..affb4eae3
--- /dev/null
+++ b/config/locales-glitch/simple_form.es-AR.yml
@@ -0,0 +1,18 @@
+---
+es-AR:
+  simple_form:
+    hints:
+      defaults:
+        setting_default_content_type_html: Al escribir toots, asume que estás escritos en HTML, a menos que se especifique lo contrario
+        setting_default_content_type_markdown: Al escribir toots, asume que estás usando Markdown para dar formato de texto enriquecido, a menos que se especifique lo contrario
+        setting_default_content_type_plain: Al escribir toots, asume que estás usando texto sin formato, a menos que se especifique lo contrario (predeterminado de Mastodon)
+        setting_default_language: El idioma de tus toots se puede detectar automáticamente, pero no siempre es correcto
+        setting_skin: Cambia el diseño de la edición seleccionada de Mastodon
+    labels:
+      defaults:
+        setting_default_content_type: Formato predeterminado de tus toots
+        setting_default_content_type_plain: Sin formato
+        setting_favourite_modal: Mostrar diálogo de confirmación antes de marcar como favorito (sólo aplica a la edición Glich)
+        setting_hide_followers_count: Ocultar tu conteo de seguidorxs
+        setting_skin: Diseño
+        setting_system_emoji_font: Usar la fuente predeterminada del sistema para emojis (sólo aplica a la edición Glitch)
diff --git a/config/locales-glitch/simple_form.es-MX.yml b/config/locales-glitch/simple_form.es-MX.yml
new file mode 100644
index 000000000..561ca3b28
--- /dev/null
+++ b/config/locales-glitch/simple_form.es-MX.yml
@@ -0,0 +1,18 @@
+---
+es-MX:
+  simple_form:
+    hints:
+      defaults:
+        setting_default_content_type_html: Al escribir toots, asume que estás escritos en HTML, a menos que se especifique lo contrario
+        setting_default_content_type_markdown: Al escribir toots, asume que estás usando Markdown para dar formato de texto enriquecido, a menos que se especifique lo contrario
+        setting_default_content_type_plain: Al escribir toots, asume que estás usando texto sin formato, a menos que se especifique lo contrario (predeterminado de Mastodon)
+        setting_default_language: El idioma de tus toots se puede detectar automáticamente, pero no siempre es correcto
+        setting_skin: Cambia el diseño de la edición seleccionada de Mastodon
+    labels:
+      defaults:
+        setting_default_content_type: Formato predeterminado de tus toots
+        setting_default_content_type_plain: Sin formato
+        setting_favourite_modal: Mostrar diálogo de confirmación antes de marcar como favorito (sólo aplica a la edición Glich)
+        setting_hide_followers_count: Ocultar tu conteo de seguidorxs
+        setting_skin: Diseño
+        setting_system_emoji_font: Usar la fuente predeterminada del sistema para emojis (sólo aplica a la edición Glitch)
diff --git a/config/locales-glitch/simple_form.es.yml b/config/locales-glitch/simple_form.es.yml
new file mode 100644
index 000000000..22277d30d
--- /dev/null
+++ b/config/locales-glitch/simple_form.es.yml
@@ -0,0 +1,18 @@
+---
+es:
+  simple_form:
+    hints:
+      defaults:
+        setting_default_content_type_html: Al escribir toots, asume que estás escritos en HTML, a menos que se especifique lo contrario
+        setting_default_content_type_markdown: Al escribir toots, asume que estás usando Markdown para dar formato de texto enriquecido, a menos que se especifique lo contrario
+        setting_default_content_type_plain: Al escribir toots, asume que estás usando texto sin formato, a menos que se especifique lo contrario (predeterminado de Mastodon)
+        setting_default_language: El idioma de tus toots se puede detectar automáticamente, pero no siempre es correcto
+        setting_skin: Cambia el diseño de la edición seleccionada de Mastodon
+    labels:
+      defaults:
+        setting_default_content_type: Formato predeterminado de tus toots
+        setting_default_content_type_plain: Sin formato
+        setting_favourite_modal: Mostrar diálogo de confirmación antes de marcar como favorito (sólo aplica a la edición Glich)
+        setting_hide_followers_count: Ocultar tu conteo de seguidorxs
+        setting_skin: Diseño
+        setting_system_emoji_font: Usar la fuente predeterminada del sistema para emojis (sólo aplica a la edición Glitch)
diff --git a/config/locales-glitch/simple_form.et.yml b/config/locales-glitch/simple_form.et.yml
new file mode 100644
index 000000000..e020c4ffc
--- /dev/null
+++ b/config/locales-glitch/simple_form.et.yml
@@ -0,0 +1 @@
+et:
diff --git a/config/locales-glitch/simple_form.eu.yml b/config/locales-glitch/simple_form.eu.yml
new file mode 100644
index 000000000..566e176fc
--- /dev/null
+++ b/config/locales-glitch/simple_form.eu.yml
@@ -0,0 +1 @@
+eu:
diff --git a/config/locales-glitch/simple_form.fa.yml b/config/locales-glitch/simple_form.fa.yml
new file mode 100644
index 000000000..88215f82c
--- /dev/null
+++ b/config/locales-glitch/simple_form.fa.yml
@@ -0,0 +1 @@
+fa:
diff --git a/config/locales-glitch/simple_form.fi.yml b/config/locales-glitch/simple_form.fi.yml
new file mode 100644
index 000000000..23c538b19
--- /dev/null
+++ b/config/locales-glitch/simple_form.fi.yml
@@ -0,0 +1 @@
+fi:
diff --git a/config/locales-glitch/simple_form.fo.yml b/config/locales-glitch/simple_form.fo.yml
new file mode 100644
index 000000000..69f792cca
--- /dev/null
+++ b/config/locales-glitch/simple_form.fo.yml
@@ -0,0 +1 @@
+fo:
diff --git a/config/locales-glitch/simple_form.fr-QC.yml b/config/locales-glitch/simple_form.fr-QC.yml
new file mode 100644
index 000000000..70cade1f0
--- /dev/null
+++ b/config/locales-glitch/simple_form.fr-QC.yml
@@ -0,0 +1,27 @@
+---
+fr-QC:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: Vous pouvez avoir jusqu'à %{count} éléments affichés en tant que tableau sur votre profil
+        setting_default_content_type_html: Vos posts sont écrits en HTML brut, sauf indication contraire
+        setting_default_content_type_markdown: Vos posts utilisent Markdown pour un formatage de texte enrichi, sauf indication contraire
+        setting_default_content_type_plain: Vos posts sont écrits en texte brut sans formatage spécial, sauf indication contraire (comportement par défaut de Mastodon)
+        setting_default_language: La langue utilisée pour vos posts peut être automatiquement détectée, cependant cette détection n'est pas toujours fiable
+        setting_hide_followers_count: Cacher votre nombre d'abonné·e·s à tout le monde, y compris vous. Certaines applications peuvent afficher un nombre négatif d'abonné·e·s.
+        setting_skin: Relooke le mode de Mastodon choisi
+    labels:
+      defaults:
+        setting_default_content_type: Format par défaut pour les posts
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Texte brut
+        setting_favourite_modal: Afficher une fenêtre de confirmation avant de mettre en favori un post (s'applique uniquement au mode Glitch)
+        setting_hide_followers_count: Cacher votre nombre d'abonné·e·s
+        setting_skin: Thème
+        setting_system_emoji_font: Utiliser la police par défaut du système pour les émojis (s'applique uniquement au mode Glitch)
+      notification_emails:
+        trending_link: Un nouveau lien en tendances nécessite un examen
+        trending_status: Un nouveau post en tendances nécessite un examen
+        trending_tag: Un nouveau tag en tendances nécessite un examen
diff --git a/config/locales-glitch/simple_form.fr.yml b/config/locales-glitch/simple_form.fr.yml
new file mode 100644
index 000000000..bc6302cf8
--- /dev/null
+++ b/config/locales-glitch/simple_form.fr.yml
@@ -0,0 +1,27 @@
+---
+fr:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: Vous pouvez avoir jusqu'à %{count} éléments affichés en tant que tableau sur votre profil
+        setting_default_content_type_html: Vos posts sont écrits en HTML brut, sauf indication contraire
+        setting_default_content_type_markdown: Vos posts utilisent Markdown pour un formatage de texte enrichi, sauf indication contraire
+        setting_default_content_type_plain: Vos posts sont écrits en texte brut sans formatage spécial, sauf indication contraire (comportement par défaut de Mastodon)
+        setting_default_language: La langue utilisée pour vos posts peut être automatiquement détectée, cependant cette détection n'est pas toujours fiable
+        setting_hide_followers_count: Cacher votre nombre d'abonné·e·s à tout le monde, y compris vous. Certaines applications peuvent afficher un nombre négatif d'abonné·e·s.
+        setting_skin: Relooke le mode de Mastodon choisi
+    labels:
+      defaults:
+        setting_default_content_type: Format par défaut pour les posts
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Texte brut
+        setting_favourite_modal: Afficher une fenêtre de confirmation avant de mettre en favori un post (s'applique uniquement au mode Glitch)
+        setting_hide_followers_count: Cacher votre nombre d'abonné·e·s
+        setting_skin: Thème
+        setting_system_emoji_font: Utiliser la police par défaut du système pour les émojis (s'applique uniquement au mode Glitch)
+      notification_emails:
+        trending_link: Un nouveau lien en tendances nécessite un examen
+        trending_status: Un nouveau post en tendances nécessite un examen
+        trending_tag: Un nouveau tag en tendances nécessite un examen
diff --git a/config/locales-glitch/simple_form.fy.yml b/config/locales-glitch/simple_form.fy.yml
new file mode 100644
index 000000000..c05849f20
--- /dev/null
+++ b/config/locales-glitch/simple_form.fy.yml
@@ -0,0 +1 @@
+fy:
diff --git a/config/locales-glitch/simple_form.ga.yml b/config/locales-glitch/simple_form.ga.yml
new file mode 100644
index 000000000..20a9da24e
--- /dev/null
+++ b/config/locales-glitch/simple_form.ga.yml
@@ -0,0 +1 @@
+ga:
diff --git a/config/locales-glitch/simple_form.gd.yml b/config/locales-glitch/simple_form.gd.yml
new file mode 100644
index 000000000..1912f6c6a
--- /dev/null
+++ b/config/locales-glitch/simple_form.gd.yml
@@ -0,0 +1 @@
+gd:
diff --git a/config/locales-glitch/simple_form.gl.yml b/config/locales-glitch/simple_form.gl.yml
new file mode 100644
index 000000000..8ec5fc81c
--- /dev/null
+++ b/config/locales-glitch/simple_form.gl.yml
@@ -0,0 +1 @@
+gl:
diff --git a/config/locales-glitch/simple_form.he.yml b/config/locales-glitch/simple_form.he.yml
new file mode 100644
index 000000000..af6fa60a7
--- /dev/null
+++ b/config/locales-glitch/simple_form.he.yml
@@ -0,0 +1 @@
+he:
diff --git a/config/locales-glitch/simple_form.hi.yml b/config/locales-glitch/simple_form.hi.yml
new file mode 100644
index 000000000..d758a5b53
--- /dev/null
+++ b/config/locales-glitch/simple_form.hi.yml
@@ -0,0 +1 @@
+hi:
diff --git a/config/locales-glitch/simple_form.hr.yml b/config/locales-glitch/simple_form.hr.yml
new file mode 100644
index 000000000..f67f33c7e
--- /dev/null
+++ b/config/locales-glitch/simple_form.hr.yml
@@ -0,0 +1 @@
+hr:
diff --git a/config/locales-glitch/simple_form.hu.yml b/config/locales-glitch/simple_form.hu.yml
new file mode 100644
index 000000000..52314c50c
--- /dev/null
+++ b/config/locales-glitch/simple_form.hu.yml
@@ -0,0 +1 @@
+hu:
diff --git a/config/locales-glitch/simple_form.hy.yml b/config/locales-glitch/simple_form.hy.yml
new file mode 100644
index 000000000..c40654016
--- /dev/null
+++ b/config/locales-glitch/simple_form.hy.yml
@@ -0,0 +1 @@
+hy:
diff --git a/config/locales-glitch/simple_form.id.yml b/config/locales-glitch/simple_form.id.yml
new file mode 100644
index 000000000..8446cbad9
--- /dev/null
+++ b/config/locales-glitch/simple_form.id.yml
@@ -0,0 +1 @@
+id:
diff --git a/config/locales-glitch/simple_form.ig.yml b/config/locales-glitch/simple_form.ig.yml
new file mode 100644
index 000000000..7c264f0d7
--- /dev/null
+++ b/config/locales-glitch/simple_form.ig.yml
@@ -0,0 +1 @@
+ig:
diff --git a/config/locales-glitch/simple_form.io.yml b/config/locales-glitch/simple_form.io.yml
new file mode 100644
index 000000000..c63dc0e8d
--- /dev/null
+++ b/config/locales-glitch/simple_form.io.yml
@@ -0,0 +1 @@
+io:
diff --git a/config/locales-glitch/simple_form.is.yml b/config/locales-glitch/simple_form.is.yml
new file mode 100644
index 000000000..337c106df
--- /dev/null
+++ b/config/locales-glitch/simple_form.is.yml
@@ -0,0 +1 @@
+is:
diff --git a/config/locales-glitch/simple_form.it.yml b/config/locales-glitch/simple_form.it.yml
new file mode 100644
index 000000000..85830635a
--- /dev/null
+++ b/config/locales-glitch/simple_form.it.yml
@@ -0,0 +1 @@
+it:
diff --git a/config/locales-glitch/simple_form.ja.yml b/config/locales-glitch/simple_form.ja.yml
new file mode 100644
index 000000000..558d9da9c
--- /dev/null
+++ b/config/locales-glitch/simple_form.ja.yml
@@ -0,0 +1,19 @@
+---
+ja:
+  simple_form:
+    hints:
+      defaults:
+        setting_default_content_type_html: トゥートを作成するとき特に指定がない限り生のHTMLで書かれているとします
+        setting_default_content_type_markdown: トゥートを作成するとき特に指定がない限りリッチテキスト形式のマークダウンで書かれているとします
+        setting_default_content_type_plain: トゥートを作成するとき特に指定がない限りプレーンテキストで書かれているとします(Mastodon既定の動作)
+        setting_default_language: あなたのトゥートの言語を自動検出しますが必ずしも正確ではありません
+        setting_skin: 選択したMastodonフレーバーに変更します
+    labels:
+      defaults:
+        setting_default_content_type: 既定のトゥート形式
+        setting_default_content_type_markdown: マークダウン
+        setting_default_content_type_plain: プレーンテキスト
+        setting_favourite_modal: お気に入りをする前に確認ダイアログを表示する
+        setting_hide_followers_count: フォロワー数を隠す
+        setting_skin: スキン
+        setting_system_emoji_font: 絵文字にシステム既定のフォントを使用する(Glitch Edition フレーバーのみに適用されます)
diff --git a/config/locales-glitch/simple_form.ka.yml b/config/locales-glitch/simple_form.ka.yml
new file mode 100644
index 000000000..57a95cb04
--- /dev/null
+++ b/config/locales-glitch/simple_form.ka.yml
@@ -0,0 +1 @@
+ka:
diff --git a/config/locales-glitch/simple_form.kab.yml b/config/locales-glitch/simple_form.kab.yml
new file mode 100644
index 000000000..2109c04b3
--- /dev/null
+++ b/config/locales-glitch/simple_form.kab.yml
@@ -0,0 +1 @@
+kab:
diff --git a/config/locales-glitch/simple_form.kk.yml b/config/locales-glitch/simple_form.kk.yml
new file mode 100644
index 000000000..1dcc9b127
--- /dev/null
+++ b/config/locales-glitch/simple_form.kk.yml
@@ -0,0 +1 @@
+kk:
diff --git a/config/locales-glitch/simple_form.kn.yml b/config/locales-glitch/simple_form.kn.yml
new file mode 100644
index 000000000..d094088d8
--- /dev/null
+++ b/config/locales-glitch/simple_form.kn.yml
@@ -0,0 +1 @@
+kn:
diff --git a/config/locales-glitch/simple_form.ko.yml b/config/locales-glitch/simple_form.ko.yml
new file mode 100644
index 000000000..0390b7043
--- /dev/null
+++ b/config/locales-glitch/simple_form.ko.yml
@@ -0,0 +1,27 @@
+---
+ko:
+  simple_form:
+    glitch_only: 글리치
+    hints:
+      defaults:
+        fields: 최대 %{count}개의 항목을 프로필에 표 형태로 표시할 수 있습니다
+        setting_default_content_type_html: 게시물을 작성할 때, 형식을 지정하지 않았다면, 생 HTML이라고 가정합니다
+        setting_default_content_type_markdown: 게시물을 작성할 때, 형식을 지정하지 않았다면, 마크다운이라고 가정합니다
+        setting_default_content_type_plain: 게시물을 작성할 때, 형식을 지정하지 않았다면, 일반적인 텍스트라고 가정합니다. (마스토돈의 기본 동작)
+        setting_default_language: 작성하는 게시물의 언어는 자동으로 설정될 수 있습니다, 하지만 언제나 정확하지는 않습니다
+        setting_hide_followers_count: 나를 포함해서 모든 사람들에게서 내 팔로워 수를 숨깁니다. 몇몇 앱에서는 팔로워 수가 음수로 표시될 수 있습니다.
+        setting_skin: 선택한 마스토돈 풍미의 스킨을 바꿉니다
+    labels:
+      defaults:
+        setting_default_content_type: 게시물의 기본 포맷
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: 마크다운
+        setting_default_content_type_plain: 일반 텍스트
+        setting_favourite_modal: 관심글을 지정할 때 확인 창을 띄웁니다(글리치 풍미에만 적용됨)
+        setting_hide_followers_count: 내 팔로워 수 숨기기
+        setting_skin: 스킨
+        setting_system_emoji_font: 에모지에 시스템 기본 폰트 적용하기 (글리치 풍미에만 적용됨)
+      notification_emails:
+        trending_link: 새로 유행중인 링크에 대한 리뷰가 필요할 때
+        trending_status: 새로 유행중인 게시물에 대한 리뷰가 필요할 때
+        trending_tag: 새로 유행중인 해시태그에 대한 리뷰가 필요할 때
diff --git a/config/locales-glitch/simple_form.ku.yml b/config/locales-glitch/simple_form.ku.yml
new file mode 100644
index 000000000..b36f7c988
--- /dev/null
+++ b/config/locales-glitch/simple_form.ku.yml
@@ -0,0 +1 @@
+ku:
diff --git a/config/locales-glitch/simple_form.kw.yml b/config/locales-glitch/simple_form.kw.yml
new file mode 100644
index 000000000..b2cfc12ff
--- /dev/null
+++ b/config/locales-glitch/simple_form.kw.yml
@@ -0,0 +1 @@
+kw:
diff --git a/config/locales-glitch/simple_form.la.yml b/config/locales-glitch/simple_form.la.yml
new file mode 100644
index 000000000..3a7ba0d44
--- /dev/null
+++ b/config/locales-glitch/simple_form.la.yml
@@ -0,0 +1 @@
+la:
diff --git a/config/locales-glitch/simple_form.lt.yml b/config/locales-glitch/simple_form.lt.yml
new file mode 100644
index 000000000..6c5cb837a
--- /dev/null
+++ b/config/locales-glitch/simple_form.lt.yml
@@ -0,0 +1 @@
+lt:
diff --git a/config/locales-glitch/simple_form.lv.yml b/config/locales-glitch/simple_form.lv.yml
new file mode 100644
index 000000000..1be0eabc0
--- /dev/null
+++ b/config/locales-glitch/simple_form.lv.yml
@@ -0,0 +1 @@
+lv:
diff --git a/config/locales-glitch/simple_form.mk.yml b/config/locales-glitch/simple_form.mk.yml
new file mode 100644
index 000000000..8b9144a98
--- /dev/null
+++ b/config/locales-glitch/simple_form.mk.yml
@@ -0,0 +1 @@
+mk:
diff --git a/config/locales-glitch/simple_form.ml.yml b/config/locales-glitch/simple_form.ml.yml
new file mode 100644
index 000000000..6931a683d
--- /dev/null
+++ b/config/locales-glitch/simple_form.ml.yml
@@ -0,0 +1 @@
+ml:
diff --git a/config/locales-glitch/simple_form.mr.yml b/config/locales-glitch/simple_form.mr.yml
new file mode 100644
index 000000000..fe1639c6a
--- /dev/null
+++ b/config/locales-glitch/simple_form.mr.yml
@@ -0,0 +1 @@
+mr:
diff --git a/config/locales-glitch/simple_form.ms.yml b/config/locales-glitch/simple_form.ms.yml
new file mode 100644
index 000000000..2925688a0
--- /dev/null
+++ b/config/locales-glitch/simple_form.ms.yml
@@ -0,0 +1 @@
+ms:
diff --git a/config/locales-glitch/simple_form.my.yml b/config/locales-glitch/simple_form.my.yml
new file mode 100644
index 000000000..5e1fc6bee
--- /dev/null
+++ b/config/locales-glitch/simple_form.my.yml
@@ -0,0 +1 @@
+my:
diff --git a/config/locales-glitch/simple_form.nl.yml b/config/locales-glitch/simple_form.nl.yml
new file mode 100644
index 000000000..f009eadee
--- /dev/null
+++ b/config/locales-glitch/simple_form.nl.yml
@@ -0,0 +1 @@
+nl:
diff --git a/config/locales-glitch/simple_form.nn.yml b/config/locales-glitch/simple_form.nn.yml
new file mode 100644
index 000000000..777f4e600
--- /dev/null
+++ b/config/locales-glitch/simple_form.nn.yml
@@ -0,0 +1 @@
+nn:
diff --git a/config/locales-glitch/simple_form.no.yml b/config/locales-glitch/simple_form.no.yml
new file mode 100644
index 000000000..1dcec34b6
--- /dev/null
+++ b/config/locales-glitch/simple_form.no.yml
@@ -0,0 +1,2 @@
+---
+'no':
diff --git a/config/locales-glitch/simple_form.oc.yml b/config/locales-glitch/simple_form.oc.yml
new file mode 100644
index 000000000..325b34889
--- /dev/null
+++ b/config/locales-glitch/simple_form.oc.yml
@@ -0,0 +1 @@
+oc:
diff --git a/config/locales-glitch/simple_form.pa.yml b/config/locales-glitch/simple_form.pa.yml
new file mode 100644
index 000000000..bb8a6c834
--- /dev/null
+++ b/config/locales-glitch/simple_form.pa.yml
@@ -0,0 +1 @@
+pa:
diff --git a/config/locales-glitch/simple_form.pl.yml b/config/locales-glitch/simple_form.pl.yml
new file mode 100644
index 000000000..264494c2d
--- /dev/null
+++ b/config/locales-glitch/simple_form.pl.yml
@@ -0,0 +1,10 @@
+---
+pl:
+  simple_form:
+    hints:
+      defaults:
+        setting_skin: Zmienia wygląd używanej odmiany Mastodona
+    labels:
+      defaults:
+        setting_favourite_modal: Pytaj o potwierdzenie przed dodaniem do ulubionych
+        setting_skin: Motyw
diff --git a/config/locales-glitch/simple_form.pt-BR.yml b/config/locales-glitch/simple_form.pt-BR.yml
new file mode 100644
index 000000000..831f18d23
--- /dev/null
+++ b/config/locales-glitch/simple_form.pt-BR.yml
@@ -0,0 +1,27 @@
+---
+pt-BR:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: Você pode ter até %{count} itens exibidos como uma tabela no seu perfil
+        setting_default_content_type_html: Ao escrever toots, assume que estão escritos em HTML bruto, a menos que especificado de outra forma
+        setting_default_content_type_markdown: Ao escrever toots, assume que ele está usando Markdown para formatação de texto, a menos que especificado seja diferente
+        setting_default_content_type_plain: Ao escrever toots, assume que eles são textos simples sem formatação especial, a menos que esteja especificado de outra forma (comportamento padrão do Mastodon)
+        setting_default_language: O idioma dos seus toots pode ser detectado automaticamente, mas nem sempre é preciso
+        setting_hide_followers_count: Ocultar a contagem de seguidores de todos, incluindo você. Algumas aplicações podem exibir uma contagem de seguidores negativa.
+        setting_skin: Reaplica o sabor Mastodon selecionado
+    labels:
+      defaults:
+        setting_default_content_type: Formato padrão para toots
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Texto sem formatação
+        setting_favourite_modal: Mostrar diálogo antes de favoritar (aplica-se somente ao sabor Glitch)
+        setting_hide_followers_count: Ocultar sua contagem de seguidores
+        setting_skin: Tema
+        setting_system_emoji_font: Usar fonte padrão do sistema para emojis (aplica-se somente ao sabor Glitch)
+      notification_emails:
+        trending_link: Novo link em tendência requer revisão
+        trending_status: Nova postagem em tendência requer revisão
+        trending_tag: Nova tag em tendência requer revisão
diff --git a/config/locales-glitch/simple_form.pt-PT.yml b/config/locales-glitch/simple_form.pt-PT.yml
new file mode 100644
index 000000000..a1a2dc36b
--- /dev/null
+++ b/config/locales-glitch/simple_form.pt-PT.yml
@@ -0,0 +1 @@
+pt-PT:
diff --git a/config/locales-glitch/simple_form.ro.yml b/config/locales-glitch/simple_form.ro.yml
new file mode 100644
index 000000000..79dbaa871
--- /dev/null
+++ b/config/locales-glitch/simple_form.ro.yml
@@ -0,0 +1 @@
+ro:
diff --git a/config/locales-glitch/simple_form.ru.yml b/config/locales-glitch/simple_form.ru.yml
new file mode 100644
index 000000000..ddc9d1e32
--- /dev/null
+++ b/config/locales-glitch/simple_form.ru.yml
@@ -0,0 +1 @@
+ru:
diff --git a/config/locales-glitch/simple_form.sa.yml b/config/locales-glitch/simple_form.sa.yml
new file mode 100644
index 000000000..07ea4372a
--- /dev/null
+++ b/config/locales-glitch/simple_form.sa.yml
@@ -0,0 +1 @@
+sa:
diff --git a/config/locales-glitch/simple_form.sc.yml b/config/locales-glitch/simple_form.sc.yml
new file mode 100644
index 000000000..91bd6d92f
--- /dev/null
+++ b/config/locales-glitch/simple_form.sc.yml
@@ -0,0 +1 @@
+sc:
diff --git a/config/locales-glitch/simple_form.sco.yml b/config/locales-glitch/simple_form.sco.yml
new file mode 100644
index 000000000..8165e00a1
--- /dev/null
+++ b/config/locales-glitch/simple_form.sco.yml
@@ -0,0 +1 @@
+sco:
diff --git a/config/locales-glitch/simple_form.si.yml b/config/locales-glitch/simple_form.si.yml
new file mode 100644
index 000000000..b0b50956e
--- /dev/null
+++ b/config/locales-glitch/simple_form.si.yml
@@ -0,0 +1 @@
+si:
diff --git a/config/locales-glitch/simple_form.sk.yml b/config/locales-glitch/simple_form.sk.yml
new file mode 100644
index 000000000..f634a0282
--- /dev/null
+++ b/config/locales-glitch/simple_form.sk.yml
@@ -0,0 +1 @@
+sk:
diff --git a/config/locales-glitch/simple_form.sl.yml b/config/locales-glitch/simple_form.sl.yml
new file mode 100644
index 000000000..26c7ce2e3
--- /dev/null
+++ b/config/locales-glitch/simple_form.sl.yml
@@ -0,0 +1 @@
+sl:
diff --git a/config/locales-glitch/simple_form.sq.yml b/config/locales-glitch/simple_form.sq.yml
new file mode 100644
index 000000000..44ddadc95
--- /dev/null
+++ b/config/locales-glitch/simple_form.sq.yml
@@ -0,0 +1 @@
+sq:
diff --git a/config/locales-glitch/simple_form.sr-Latn.yml b/config/locales-glitch/simple_form.sr-Latn.yml
new file mode 100644
index 000000000..c482b5e44
--- /dev/null
+++ b/config/locales-glitch/simple_form.sr-Latn.yml
@@ -0,0 +1 @@
+sr-Latn:
diff --git a/config/locales-glitch/simple_form.sr.yml b/config/locales-glitch/simple_form.sr.yml
new file mode 100644
index 000000000..9e26af819
--- /dev/null
+++ b/config/locales-glitch/simple_form.sr.yml
@@ -0,0 +1 @@
+sr:
diff --git a/config/locales-glitch/simple_form.sv.yml b/config/locales-glitch/simple_form.sv.yml
new file mode 100644
index 000000000..7e73a972a
--- /dev/null
+++ b/config/locales-glitch/simple_form.sv.yml
@@ -0,0 +1 @@
+sv:
diff --git a/config/locales-glitch/simple_form.ta.yml b/config/locales-glitch/simple_form.ta.yml
new file mode 100644
index 000000000..4320953ce
--- /dev/null
+++ b/config/locales-glitch/simple_form.ta.yml
@@ -0,0 +1 @@
+ta:
diff --git a/config/locales-glitch/simple_form.te.yml b/config/locales-glitch/simple_form.te.yml
new file mode 100644
index 000000000..34c54f18f
--- /dev/null
+++ b/config/locales-glitch/simple_form.te.yml
@@ -0,0 +1 @@
+te:
diff --git a/config/locales-glitch/simple_form.th.yml b/config/locales-glitch/simple_form.th.yml
new file mode 100644
index 000000000..a4431912a
--- /dev/null
+++ b/config/locales-glitch/simple_form.th.yml
@@ -0,0 +1 @@
+th:
diff --git a/config/locales-glitch/simple_form.tr.yml b/config/locales-glitch/simple_form.tr.yml
new file mode 100644
index 000000000..077d41667
--- /dev/null
+++ b/config/locales-glitch/simple_form.tr.yml
@@ -0,0 +1 @@
+tr:
diff --git a/config/locales-glitch/simple_form.tt.yml b/config/locales-glitch/simple_form.tt.yml
new file mode 100644
index 000000000..5eab4abff
--- /dev/null
+++ b/config/locales-glitch/simple_form.tt.yml
@@ -0,0 +1 @@
+tt:
diff --git a/config/locales-glitch/simple_form.ug.yml b/config/locales-glitch/simple_form.ug.yml
new file mode 100644
index 000000000..289acf241
--- /dev/null
+++ b/config/locales-glitch/simple_form.ug.yml
@@ -0,0 +1 @@
+ug:
diff --git a/config/locales-glitch/simple_form.uk.yml b/config/locales-glitch/simple_form.uk.yml
new file mode 100644
index 000000000..c256c3246
--- /dev/null
+++ b/config/locales-glitch/simple_form.uk.yml
@@ -0,0 +1 @@
+uk:
diff --git a/config/locales-glitch/simple_form.ur.yml b/config/locales-glitch/simple_form.ur.yml
new file mode 100644
index 000000000..2cace5883
--- /dev/null
+++ b/config/locales-glitch/simple_form.ur.yml
@@ -0,0 +1 @@
+ur:
diff --git a/config/locales-glitch/simple_form.vi.yml b/config/locales-glitch/simple_form.vi.yml
new file mode 100644
index 000000000..326506f0b
--- /dev/null
+++ b/config/locales-glitch/simple_form.vi.yml
@@ -0,0 +1 @@
+vi:
diff --git a/config/locales-glitch/simple_form.zh-CN.yml b/config/locales-glitch/simple_form.zh-CN.yml
new file mode 100644
index 000000000..63b9e9222
--- /dev/null
+++ b/config/locales-glitch/simple_form.zh-CN.yml
@@ -0,0 +1,18 @@
+---
+zh-CN:
+  simple_form:
+    hints:
+      defaults:
+        setting_default_content_type_html: 在撰写嘟文时,除非另有指定,假定它们使用原始 HTML 语言撰写
+        setting_default_content_type_markdown: 在撰写嘟文时,除非另有指定,假定它们使用 Markdown 进行富文本格式化
+        setting_default_content_type_plain: 在撰写嘟文时,除非另有指定,假定它们是没有特殊格式的纯文本(默认的 Mastodon 行为)
+        setting_default_language: 你的嘟文语言可以自动检测,但不一定准确
+        setting_skin: 更换为所选择的 Mastodon 风味
+    labels:
+      defaults:
+        setting_default_content_type: 嘟文的默认格式
+        setting_default_content_type_plain: 纯文本
+        setting_favourite_modal: 在喜欢嘟文前询问我 (仅限于 Glitch 风味)
+        setting_hide_followers_count: 隐藏你的关注者人数
+        setting_skin: 皮肤
+        setting_system_emoji_font: 表情符号使用系统默认字体 (仅限于 Glitch 风味)
diff --git a/config/locales-glitch/simple_form.zh-HK.yml b/config/locales-glitch/simple_form.zh-HK.yml
new file mode 100644
index 000000000..8e51e5648
--- /dev/null
+++ b/config/locales-glitch/simple_form.zh-HK.yml
@@ -0,0 +1 @@
+zh-HK:
diff --git a/config/locales-glitch/simple_form.zh-TW.yml b/config/locales-glitch/simple_form.zh-TW.yml
new file mode 100644
index 000000000..cb82c0526
--- /dev/null
+++ b/config/locales-glitch/simple_form.zh-TW.yml
@@ -0,0 +1 @@
+zh-TW:
diff --git a/config/locales-glitch/sk.yml b/config/locales-glitch/sk.yml
new file mode 100644
index 000000000..f634a0282
--- /dev/null
+++ b/config/locales-glitch/sk.yml
@@ -0,0 +1 @@
+sk:
diff --git a/config/locales-glitch/sl.yml b/config/locales-glitch/sl.yml
new file mode 100644
index 000000000..26c7ce2e3
--- /dev/null
+++ b/config/locales-glitch/sl.yml
@@ -0,0 +1 @@
+sl:
diff --git a/config/locales-glitch/sq.yml b/config/locales-glitch/sq.yml
new file mode 100644
index 000000000..44ddadc95
--- /dev/null
+++ b/config/locales-glitch/sq.yml
@@ -0,0 +1 @@
+sq:
diff --git a/config/locales-glitch/sr-Latn.yml b/config/locales-glitch/sr-Latn.yml
new file mode 100644
index 000000000..c482b5e44
--- /dev/null
+++ b/config/locales-glitch/sr-Latn.yml
@@ -0,0 +1 @@
+sr-Latn:
diff --git a/config/locales-glitch/sr.yml b/config/locales-glitch/sr.yml
new file mode 100644
index 000000000..9e26af819
--- /dev/null
+++ b/config/locales-glitch/sr.yml
@@ -0,0 +1 @@
+sr:
diff --git a/config/locales-glitch/sv.yml b/config/locales-glitch/sv.yml
new file mode 100644
index 000000000..7e73a972a
--- /dev/null
+++ b/config/locales-glitch/sv.yml
@@ -0,0 +1 @@
+sv:
diff --git a/config/locales-glitch/ta.yml b/config/locales-glitch/ta.yml
new file mode 100644
index 000000000..4320953ce
--- /dev/null
+++ b/config/locales-glitch/ta.yml
@@ -0,0 +1 @@
+ta:
diff --git a/config/locales-glitch/te.yml b/config/locales-glitch/te.yml
new file mode 100644
index 000000000..34c54f18f
--- /dev/null
+++ b/config/locales-glitch/te.yml
@@ -0,0 +1 @@
+te:
diff --git a/config/locales-glitch/th.yml b/config/locales-glitch/th.yml
new file mode 100644
index 000000000..a4431912a
--- /dev/null
+++ b/config/locales-glitch/th.yml
@@ -0,0 +1 @@
+th:
diff --git a/config/locales-glitch/tr.yml b/config/locales-glitch/tr.yml
new file mode 100644
index 000000000..077d41667
--- /dev/null
+++ b/config/locales-glitch/tr.yml
@@ -0,0 +1 @@
+tr:
diff --git a/config/locales-glitch/tt.yml b/config/locales-glitch/tt.yml
new file mode 100644
index 000000000..5eab4abff
--- /dev/null
+++ b/config/locales-glitch/tt.yml
@@ -0,0 +1 @@
+tt:
diff --git a/config/locales-glitch/ug.yml b/config/locales-glitch/ug.yml
new file mode 100644
index 000000000..289acf241
--- /dev/null
+++ b/config/locales-glitch/ug.yml
@@ -0,0 +1 @@
+ug:
diff --git a/config/locales-glitch/uk.yml b/config/locales-glitch/uk.yml
new file mode 100644
index 000000000..c256c3246
--- /dev/null
+++ b/config/locales-glitch/uk.yml
@@ -0,0 +1 @@
+uk:
diff --git a/config/locales-glitch/ur.yml b/config/locales-glitch/ur.yml
new file mode 100644
index 000000000..2cace5883
--- /dev/null
+++ b/config/locales-glitch/ur.yml
@@ -0,0 +1 @@
+ur:
diff --git a/config/locales-glitch/vi.yml b/config/locales-glitch/vi.yml
new file mode 100644
index 000000000..326506f0b
--- /dev/null
+++ b/config/locales-glitch/vi.yml
@@ -0,0 +1 @@
+vi:
diff --git a/config/locales-glitch/zh-CN.yml b/config/locales-glitch/zh-CN.yml
new file mode 100644
index 000000000..40a09c1c9
--- /dev/null
+++ b/config/locales-glitch/zh-CN.yml
@@ -0,0 +1,20 @@
+---
+zh-CN:
+  admin:
+    settings:
+      hide_followers_count:
+        desc_html: 不要在用户资料中显示关注者人数
+        title: 隐藏关注者人数
+      outgoing_spoilers:
+        desc_html: 在联邦化嘟文的时候,将这个内容警告添加到没有内容警告的嘟文中。如果你的服务器专用于其他服务器可能希望有内容警告的内容,它会很有用。媒体也将被标记为敏感。
+        title: 对外嘟文的内容警告
+      show_reblogs_in_public_timelines:
+        desc_html: 在本地和跨站时间线中显示公开嘟文的公开转嘟。
+        title: 在公共时间线中显示转嘟
+      show_replies_in_public_timelines:
+        desc_html: 除了公开的自我回复(线程模式),在本地和跨站时间轴中显示公开回复。
+        title: 在公共时间轴中显示回复
+  generic:
+    use_this: 使用这个
+  settings:
+    flavours: 风味
diff --git a/config/locales-glitch/zh-HK.yml b/config/locales-glitch/zh-HK.yml
new file mode 100644
index 000000000..8e51e5648
--- /dev/null
+++ b/config/locales-glitch/zh-HK.yml
@@ -0,0 +1 @@
+zh-HK:
diff --git a/config/locales-glitch/zh-TW.yml b/config/locales-glitch/zh-TW.yml
new file mode 100644
index 000000000..cb82c0526
--- /dev/null
+++ b/config/locales-glitch/zh-TW.yml
@@ -0,0 +1 @@
+zh-TW:
diff --git a/config/navigation.rb b/config/navigation.rb
index 30817d025..aab72d27c 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -15,6 +15,12 @@ SimpleNavigation::Configuration.run do |navigation|
       s.item :other, safe_join([fa_icon('cog fw'), t('preferences.other')]), settings_preferences_other_path
     end
 
+    n.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_path 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_path(flavour)
+      end
+    end
+
     n.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_path, if: -> { current_user.functional? }
     n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters}, if: -> { current_user.functional? }
     n.item :statuses_cleanup, safe_join([fa_icon('history fw'), t('settings.statuses_cleanup')]), statuses_cleanup_path, if: -> { current_user.functional_or_moved? }
diff --git a/config/routes.rb b/config/routes.rb
index 22ef10866..099933116 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -8,6 +8,7 @@ Rails.application.routes.draw do
   # have alternative format representations requiring separate controllers
   web_app_paths = %w(
     /getting-started
+    /getting-started-misc
     /keyboard-shortcuts
     /home
     /public
@@ -71,6 +72,7 @@ Rails.application.routes.draw do
       resource :setup, only: [:show, :update], controller: :setup
       resource :challenge, only: [:create], controller: :challenges
       get 'sessions/security_key_options', to: 'sessions#webauthn_options'
+      post 'captcha_confirmation', to: 'confirmations#confirm_captcha', as: :captcha_confirmation
     end
   end
 
@@ -182,6 +184,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, :create]
 
@@ -275,6 +279,7 @@ Rails.application.routes.draw do
       resource :about, only: [:show, :update], controller: 'about'
       resource :appearance, only: [:show, :update], controller: 'appearance'
       resource :discovery, only: [:show, :update], controller: 'discovery'
+      resource :other, only: [:show, :update], controller: 'other'
     end
 
     resources :site_uploads, only: [:destroy]
@@ -467,6 +472,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
@@ -562,9 +568,10 @@ Rails.application.routes.draw do
         end
       end
 
-      resources :notifications, only: [:index, :show] do
+      resources :notifications, only: [:index, :show, :destroy] do
         collection do
           post :clear
+          delete :destroy_multiple
         end
 
         member do
diff --git a/config/settings.yml b/config/settings.yml
index 4ac521a4b..65eee7516 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -2,7 +2,7 @@
 # important settings can be changed from the admin interface.
 
 defaults: &defaults
-  site_title: Mastodon
+  site_title: 'Mastodon Glitch Edition'
   site_short_description: ''
   site_description: ''
   site_extended_description: ''
@@ -12,14 +12,17 @@ defaults: &defaults
   registrations_mode: 'open'
   profile_directory: true
   closed_registrations_message: ''
-  timeline_preview: true
+  timeline_preview: false
   show_staff_badge: true
   preview_sensitive_media: false
   noindex: false
-  theme: 'default'
+  flavour: 'glitch'
+  skin: 'default'
   trends: true
   trends_as_landing_page: true
   trendable_by_default: false
+  trending_status_cw: true
+  hide_followers_count: false
   reserved_usernames:
     - admin
     - support
@@ -33,9 +36,14 @@ defaults: &defaults
   bootstrap_timeline_accounts: ''
   activity_api_enabled: true
   peers_api_enabled: true
+  show_reblogs_in_public_timelines: false
+  show_replies_in_public_timelines: false
+  default_content_type: 'text/plain'
   show_domain_blocks: 'disabled'
   show_domain_blocks_rationale: 'disabled'
+  outgoing_spoilers: ''
   require_invite_text: false
+  captcha_enabled: false
   backups_retention_period: 7
 
 development:
diff --git a/config/themes.yml b/config/themes.yml
deleted file mode 100644
index 9c21c9459..000000000
--- a/config/themes.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-default: styles/application.scss
-contrast: styles/contrast.scss
-mastodon-light: styles/mastodon-light.scss
diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js
index 25b6b7abd..55ee06c0c 100644
--- a/config/webpack/configuration.js
+++ b/config/webpack/configuration.js
@@ -1,15 +1,58 @@
 // Common configuration for webpacker loaded from config/webpacker.yml
 
-const { resolve } = require('path');
+const { basename, dirname, extname, join, resolve } = require('path');
 const { env } = require('process');
 const { load } = require('js-yaml');
-const { readFileSync } = require('fs');
+const { lstatSync, readFileSync } = require('fs');
+const glob = require('glob');
 
 const configPath = resolve('config', 'webpacker.yml');
 const settings = load(readFileSync(configPath), 'utf8')[env.RAILS_ENV || 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 = load(readFileSync(themePath), 'utf8');
+const core = function () {
+  const coreFile = resolve('app', 'javascript', 'core', 'theme.yml');
+  const data = load(readFileSync(coreFile), 'utf8');
+  if (!data.pack_directory) {
+    data.pack_directory = dirname(coreFile);
+  }
+  return data.pack ? data : {};
+}();
+
+flavourFiles.forEach((flavourFile) => {
+  const data = load(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;
+  }
+});
+
+skinFiles.forEach((skinFile) => {
+  let skin = basename(skinFile);
+  const name = basename(dirname(skinFile));
+  if (!flavours[name]) {
+    return;
+  }
+  const data = flavours[name].skin;
+  if (lstatSync(skinFile).isDirectory()) {
+    data[skin] = {};
+    const skinPacks = glob.sync(join(skinFile, '*.{css,scss}'));
+    skinPacks.forEach((pack) => {
+      data[skin][basename(pack, extname(pack))] = pack;
+    });
+  } else if ((skin = skin.match(/^(.*)\.s?css$/i))) {
+    data[skin[1]] = { common: skinFile };
+  }
+});
 
 const output = {
   path: resolve('public', settings.public_output_path),
@@ -18,7 +61,8 @@ const output = {
 
 module.exports = {
   settings,
-  themes,
+  core,
+  flavours,
   env: {
     NODE_ENV: env.NODE_ENV,
     PUBLIC_OUTPUT_PATH: settings.public_output_path,
diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js
index b71cf2ade..b1b818159 100644
--- a/config/webpack/generateLocalePacks.js
+++ b/config/webpack/generateLocalePacks.js
@@ -1,52 +1,74 @@
+// 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 => {
+    return /\.json$/.test(filename) &&
+      !/defaultMessages/.test(filename) &&
+      !/whitelist/.test(filename);
+  }).map(filename => filename.replace(/\.json$/, ''));
+
+  let inherited_locales_path = null;
+  if (flavour.inherit_locales && flavours[flavour.inherit_locales]?.locales) {
+    inherited_locales_path = flavours[flavour.inherit_locales]?.locales;
+  }
+
+  const outPath = resolve('tmp', 'locales', entry);
+
+  rimraf.sync(outPath);
+  mkdirp.sync(outPath);
 
-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
+  locales.forEach(function (locale) {
+    const localePath = join(outPath, `${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/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}/${locale}.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;
+${inherited_locales_path ? `import inherited from '../../../${inherited_locales_path}/${locale}.json';` : ''}
+import messages from '../../../${flavour.locales}/${locale}.json';
+import localeData from '${localeDataPath}';
+import { setLocale } from 'locales';
 
+setLocale({
+  localeData,
+  ${inherited_locales_path ? 'messages: Object.assign({}, inherited, messages)' : 'messages'},
+});
+`;
+    writeFileSync(localePath, localeContent, 'utf8');
+    map[`locales/${entry}/${locale}`] = localePath;
+  });
 
+  return map;
+}, {});
diff --git a/config/webpack/rules/babel.js b/config/webpack/rules/babel.js
index 2fc245c43..4d25748ee 100644
--- a/config/webpack/rules/babel.js
+++ b/config/webpack/rules/babel.js
@@ -12,6 +12,7 @@ module.exports = {
     {
       loader: 'babel-loader',
       options: {
+        sourceRoot: 'app/javascript',
         cacheDirectory: join(settings.cache_path, 'babel-loader'),
         cacheCompression: env.NODE_ENV === 'production',
         compact: env.NODE_ENV === 'production',
diff --git a/config/webpack/rules/css.js b/config/webpack/rules/css.js
index bc1f42c13..6ecfb3164 100644
--- a/config/webpack/rules/css.js
+++ b/config/webpack/rules/css.js
@@ -20,6 +20,9 @@ module.exports = {
     {
       loader: 'sass-loader',
       options: {
+        sassOptions: {
+          includePaths: ['app/javascript'],
+        },
         implementation: require('sass'),
         sourceMap: true,
       },
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index 78f660cfc..405858d0c 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -5,33 +5,57 @@ const { basename, dirname, join, relative, resolve } = require('path');
 const { sync } = require('glob');
 const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 const AssetsManifestPlugin = require('webpack-assets-manifest');
-const extname = require('path-complete-extname');
-const { env, settings, themes, output } = require('./configuration');
+const { env, settings, core, flavours, output } = require('./configuration.js');
 const rules = require('./rules');
-const localePackPaths = require('./generateLocalePacks');
+const localePacks = require('./generateLocalePacks');
+
+function reducePacks (data, into = {}) {
+  if (!data.pack) return into;
+
+  for (const entry in data.pack) {
+    const pack = data.pack[entry];
+    if (!pack) continue;
+
+    let packFiles = [];
+    if (typeof pack === 'string')
+      packFiles = [pack];
+    else if (Array.isArray(pack))
+      packFiles = pack;
+    else
+      packFiles = [pack.filename];
+
+    if (packFiles) {
+      into[data.name ? `flavours/${data.name}/${entry}` : `core/${entry}`] = packFiles.map(packFile => resolve(data.pack_directory, packFile));
+    }
+  }
+
+  if (!data.name) return into;
+
+  for (const skinName in data.skin) {
+    const skin = data.skin[skinName];
+    if (!skin) continue;
+
+    for (const entry in skin) {
+      const packFile = skin[entry];
+      if (!packFile) continue;
+
+      into[`skins/${data.name}/${skinName}/${entry}`] = resolve(packFile);
+    }
+  }
+
+  return into;
+}
+
+const entries = Object.assign(
+  { locales: resolve('app', 'javascript', 'locales') },
+  localePacks,
+  reducePacks(core),
+  Object.values(flavours).reduce((map, data) => reducePacks(data, map), {})
+);
 
-const extensionGlob = `**/*{${settings.extensions.join(',')}}*`;
-const entryPath = join(settings.source_path, settings.source_entry_path);
-const packPaths = sync(join(entryPath, extensionGlob));
 
 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;
-    }, {}),
-  ),
+  entry: entries,
 
   output: {
     filename: 'js/[name]-[chunkhash].js',
@@ -44,7 +68,7 @@ module.exports = {
 
   optimization: {
     runtimeChunk: {
-      name: 'common',
+      name: 'locales',
     },
     splitChunks: {
       cacheGroups: {
@@ -52,7 +76,9 @@ module.exports = {
         vendors: false,
         common: {
           name: 'common',
-          chunks: 'all',
+          chunks (chunk) {
+            return !(chunk.name in entries);
+          },
           minChunks: 2,
           minSize: 0,
           test: /^(?!.*[\\/]node_modules[\\/]react-intl[\\/]).+$/,
diff --git a/config/webpack/translationRunner.js b/config/webpack/translationRunner.js
index 38050baf8..c7f84cc7e 100644
--- a/config/webpack/translationRunner.js
+++ b/config/webpack/translationRunner.js
@@ -1,11 +1,12 @@
 const fs = require('fs');
 const path = require('path');
-const { default: manageTranslations } = require('react-intl-translations-manager');
+const { default: manageTranslations, readMessageFiles } = require('react-intl-translations-manager');
 
 const RFC5646_REGEXP = /^[a-z]{2,3}(?:-(?:x|[A-Za-z]{2,4}))*$/;
 
 const rootDirectory = path.resolve(__dirname, '..', '..');
-const translationsDirectory = path.resolve(rootDirectory, 'app', 'javascript', 'mastodon', 'locales');
+const externalDefaultMessages = path.resolve(rootDirectory, 'app', 'javascript', 'mastodon', 'locales', 'defaultMessages.json');
+const translationsDirectory = path.resolve(rootDirectory, 'app', 'javascript', 'flavours', 'glitch', 'locales');
 const messagesDirectory = path.resolve(rootDirectory, 'build', 'messages');
 const availableLanguages = fs.readdirSync(translationsDirectory).reduce((languages, filename) => {
   const basename = path.basename(filename, '.json');
@@ -86,6 +87,25 @@ validateLanguages(languages, [
   !argv.force && testAvailability,
 ].filter(Boolean));
 
+// Override `provideExtractedMessages` to ignore translation strings provided upstream already
+const provideExtractedMessages = () => {
+  const extractedMessages = readMessageFiles(messagesDirectory);
+  const originalExtractedMessages = JSON.parse(fs.readFileSync(externalDefaultMessages, 'utf8'));
+  const originalKeys = new Set();
+
+  originalExtractedMessages.forEach(file => {
+    file.descriptors.forEach(descriptor => {
+      originalKeys.add(descriptor.id)
+    });
+  });
+
+  extractedMessages.forEach(file => {
+    file.descriptors = file.descriptors.filter((descriptor) => !originalKeys.has(descriptor.id));
+  });
+
+  return extractedMessages.filter((file) => file.descriptors.length > 0);
+};
+
 // manage translations
 manageTranslations({
   messagesDirectory,
@@ -96,4 +116,7 @@ manageTranslations({
   jsonOptions: {
     trailingNewline: true,
   },
+  overrideCoreMethods: {
+    provideExtractedMessages,
+  },
 });
diff --git a/config/webpacker.yml b/config/webpacker.yml
index 1745a1798..179d4082c 100644
--- a/config/webpacker.yml
+++ b/config/webpacker.yml
@@ -26,6 +26,7 @@ default: &default
     - .tiff
     - .ico
     - .svg
+    - .gif
     - .eot
     - .otf
     - .ttf