about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
authorThibaut Girka <thib@sitedethib.com>2018-07-15 18:17:37 +0200
committerThibaut Girka <thib@sitedethib.com>2018-07-16 14:50:42 +0200
commitf26f1145ac0fab4a657ee1fc784e824858601bd3 (patch)
tree3980b53a1440a8e6d4ee8c539668c3c190363017 /config
parent8e8491e1dab5e2ed98770710e0a32484de8530b3 (diff)
parent7a686082370ad6d1c7a7d0ad331c22bf3e1fbede (diff)
Merge branch 'master' into glitch-soc/merge-upstream
 Conflicts:
	Dockerfile
	app/javascript/packs/common.js
	config/webpack/loaders/sass.js
	config/webpack/shared.js
	db/schema.rb
	package.json
	yarn.lock

A lot of the conflicts come from updating webpack.

Even though upstream deleted app/javascript/packs/common.js, I kept
glitch-soc's version as it unifies JS/CSS packs behavior across flavours.

Ported glitch changes to webpack 4.x
Diffstat (limited to 'config')
-rw-r--r--config/locales/cs.yml4
-rw-r--r--config/locales/da.yml30
-rw-r--r--config/locales/doorkeeper.ja.yml2
-rw-r--r--config/locales/doorkeeper.pt-BR.yml30
-rw-r--r--config/locales/el.yml11
-rw-r--r--config/locales/en.yml8
-rw-r--r--config/locales/gl.yml8
-rw-r--r--config/locales/ja.yml7
-rw-r--r--config/locales/nl.yml10
-rw-r--r--config/locales/simple_form.da.yml2
-rw-r--r--config/locales/simple_form.de.yml2
-rw-r--r--config/locales/simple_form.el.yml4
-rw-r--r--config/locales/simple_form.en.yml2
-rw-r--r--config/locales/simple_form.fa.yml5
-rw-r--r--config/locales/simple_form.gl.yml4
-rw-r--r--config/locales/simple_form.ja.yml5
-rw-r--r--config/locales/simple_form.ko.yml3
-rw-r--r--config/locales/simple_form.nl.yml4
-rw-r--r--config/locales/simple_form.sk.yml3
-rw-r--r--config/locales/sk.yml14
-rw-r--r--config/navigation.rb1
-rw-r--r--config/routes.rb7
-rw-r--r--config/webpack/development.js2
-rw-r--r--config/webpack/loaders/sass.js34
-rw-r--r--config/webpack/production.js35
-rw-r--r--config/webpack/shared.js31
-rw-r--r--config/webpack/test.js4
27 files changed, 220 insertions, 52 deletions
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 7b6021f13..135ecda31 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -1,7 +1,7 @@
 ---
 cs:
   about:
-    about_hashtag_html: Toto jsou veřejné příspěvky typu označené jako <strong>#%{hashtag}</strong>. Pokud máte účet kdekoliv na fediverse, můžete s nimi interagovat.
+    about_hashtag_html: Toto jsou veřejné tooty označené jako <strong>#%{hashtag}</strong>. Pokud máte účet kdekoliv na fediverse, můžete s nimi interagovat.
     about_mastodon_html: Mastodon je sociální síť založená na otevřených webových protokolech a svobodném, otevřeném softwaru. Je decentrovalizovaná jako e-mail.
     about_this: O této instanci
     administered_by: 'Server spravuje:'
@@ -18,7 +18,7 @@ cs:
     features:
       humane_approach_body: Mastodon, poučen z chyb jiných sociálních sítí, se snaží bojovat se zneužíváním sociálních sítí vytvářením etických možností.
       humane_approach_title: Lidštější přístup
-      not_a_product_title: Jste osoba, ne produkt.
+      not_a_product_title: Jste osoba, ne produkt
     generic_description: "%{domain} je jedním serverem v síti"
     learn_more: Zjistit více
     source_code: Zdrojový kód
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 0e3da55f1..f91ba00d5 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -10,7 +10,7 @@ da:
     contact_missing: Ikke sat
     contact_unavailable: Ikke tilgængeligt
     description_headline: Hvad er %{domain}?
-    domain_count_after: andre instancer
+    domain_count_after: andre instanser
     domain_count_before: Forbundet til
     extended_description_html: |
       <h3>Et godt sted for regler</h3>
@@ -27,7 +27,7 @@ da:
     generic_description: "%{domain} er en server i netværket"
     hosted_on: Mostodon hostet på %{domain}
     learn_more: Lær mere
-    other_instances: Liste over instancer
+    other_instances: Liste over instanser
     source_code: Kildekode
     status_count_after: statusser
     status_count_before: Som har skrevet
@@ -46,7 +46,7 @@ da:
     people_who_follow: Folk der følger %{name}
     posts: Dyt
     posts_with_replies: Toots og svar
-    remote_follow: Følg fra andre instancer
+    remote_follow: Følg fra andre instanser
     reserved_username: Brugernavnet er reserveret
     roles:
       admin: Administrator
@@ -256,6 +256,10 @@ da:
         expired: Udløbet
         title: Filtre
       title: Invitationer
+    relays:
+      setup: Opsæt en videresendelses forbindelse
+      status: Status
+      title: Videresendelser
     reports:
       account:
         note: notat
@@ -297,7 +301,11 @@ da:
         username: Kontakt brugernavn
       hero:
         title: Billede af helt
+      peers_api_enabled:
+        title: Udgiv liste over opdagede instanser
       registrations:
+        closed_message:
+          title: Besked for lukkede registreringer
         deletion:
           desc_html: Tillad alle at slette deres konto
           title: Åben konto sletning
@@ -338,6 +346,7 @@ da:
     new_report:
       body: "%{reporter} har anmeldt %{target}"
       body_remote: Nogen fra %{domain} har anmeldt %{target}
+      subject: Ny anmeldelse for %{instance} (#%{id})
   application_mailer:
     notification_preferences: Ændre email indstillinger
     salutation: "%{name},"
@@ -359,6 +368,9 @@ da:
     migrate_account: Flyt til en anden konto
     or: eller
     or_log_in_with: Eller log in med
+    providers:
+      cas: CAS
+      saml: SAML
     register: Opret dig
     register_elsewhere: Opret dig på en anden server
     reset_password: Nulstil kodeord
@@ -378,8 +390,15 @@ da:
     distance_in_words:
       about_x_hours: "%{count}t"
       about_x_months: "%{count} måneder"
+      about_x_years: "%{count}år"
+      almost_x_years: "%{count}år"
       half_a_minute: Lige nu
+      less_than_x_minutes: "%{count}m"
       less_than_x_seconds: Lige nu
+      over_x_years: "%{count}år"
+      x_days: "%{count}d"
+      x_minutes: "%{count}m"
+      x_months: "%{count}md"
       x_seconds: "%{count}s"
   deletes:
     bad_password_msg: Godt forsøg, hackere! Forkert kodeord
@@ -401,6 +420,7 @@ da:
       download: Hent dit arkiv
       size: Størrelse
     blocks: Du blokerer
+    csv: CSV
     follows: Du følger
     mutes: Du dæmper
   filters:
@@ -445,9 +465,13 @@ da:
     expires_in_prompt: Aldrig
     generate: Generer
     invited_by: 'Du er blevet inviteret af:'
+    max_uses:
+      one: 1 benyttelse
+      other: "%{count} benyttelser"
     max_uses_prompt: Ubegrænset
     table:
       expires_at: Udløber
+      uses: Benyttelser
     title: Inviter folk
   media_attachments:
     validations:
diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml
index 76174ef79..9bc2d9a80 100644
--- a/config/locales/doorkeeper.ja.yml
+++ b/config/locales/doorkeeper.ja.yml
@@ -133,7 +133,7 @@ ja:
       write:blocks: ユーザーのブロックやドメインの非表示
       write:favourites: トゥートのお気に入り登録
       write:filters: フィルターの変更
-      write:follows: フォローの変更
+      write:follows: あなたの代わりにフォロー、アンフォロー
       write:lists: リストの変更
       write:media: メディアのアップロード
       write:mutes: アカウントや会話のミュート
diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml
index afacfd7f7..dfab853c6 100644
--- a/config/locales/doorkeeper.pt-BR.yml
+++ b/config/locales/doorkeeper.pt-BR.yml
@@ -114,7 +114,29 @@ pt-BR:
       application:
         title: Autorização OAuth obrigatória
     scopes:
-      follow: seguir, bloquear, desbloquear e deixar de seguir outras contas
-      push: receber notificações push na sua conta
-      read: ler os dados da sua conta
-      write: postar em seu nome
+      follow: modificar as relações com outras contas
+      push: receber suas notificações push
+      read: ler todos os dados da sua conta
+      read:accounts: ver as informações da conta
+      read:blocks: ver seus bloqueios
+      read:favourites: ver seus favoritos
+      read:filters: ver seus filtros
+      read:follows: ver quem você segue
+      read:lists: ver suas listas
+      read:mutes: ver seus usuários silenciados
+      read:notifications: ver suas notificações
+      read:reports: ver suas denúncias
+      read:search: buscar em seu nome
+      read:statuses: ver todos os status
+      write: modificar todos os dados da sua conta
+      write:accounts: modificar seu perfil
+      write:blocks: bloquear contas e domínios
+      write:favourites: status favoritos
+      write:filters: criar filtros
+      write:follows: seguir pessoas
+      write:lists: criar listas
+      write:media: enviar arquivos de mídia
+      write:mutes: silenciar pessoas e conversas
+      write:notifications: limpar suas notificações
+      write:reports: reportar outras pessoas
+      write:statuses: publicar status
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 11ba128c1..cc65b1958 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -261,6 +261,14 @@ el:
         expired: Ληγμένες
         title: Φίλτρο
       title: Προσκλήσεις
+    relays:
+      add_new: Πρόσθεσε νέο ανταποκριτή (relay)
+      description_html: Ο <strong>ομοσπονδιακός ανταποκριτής</strong> είναι ένας ενδιάμεσος εξυπηρετητής (server) που ανταλλάσσει μεγάλους όγκους δημόσιων τουτ μεταξύ εξυπηρετητών που εγγράφονται και δημοσιεύουν σε αυτόν. <strong>Βοηθάει μικρούς και μεσαίους εξυπηρετητές να ανακαλύψουν περιεχόμενο στο fediverse</strong>, που υπό άλλες συνθήκες θα χρειαζόταν κάποιους τοπικούς χρήστες που να ακολουθούν χρήστες σε απομακρυσμένους εξυπηρετητές.
+      enable_hint: Μόλις ενεργοποιηθεί, ο εξυπηρετητής (server) σου θα εγγραφεί σε όλα τα δημόσια τουτ αυτού του ανταποκριτή (relay) και θα αρχίσει να προωθεί τα δικά του δημόσια τουτ σε αυτόν.
+      inbox_url: URL ανταποκριτή
+      setup: Όρισε μια σύνδεση ανταπόκρισης
+      status: Κατάσταση
+      title: Ανταποκριτές
     report_notes:
       created_msg: Επιτυχής δημιουργία σημείωσης καταγγελίας!
       destroyed_msg: Επιτυχής διαγραφή σημείωσης καταγγελίας!
@@ -316,6 +324,9 @@ el:
       peers_api_enabled:
         desc_html: Ονόματα τομέων που αυτός ο κόμβος έχει ήδη συναντήσει στο fediverse
         title: Δημοσίευση λίστας κόμβων που έχουν ανακαλυφθεί
+      preview_sensitive_media:
+        desc_html: Οι προεπισκοπήσεις συνδέσμων σε τρίτους ιστότοπους θα είναι ορατές ακόμα κι όταν το πολυμέσο έχει σημειωθεί ως ευαίσθητο
+        title: Εμφάνιση ευαίσθητων πολυμέσων στις προεπισκοπήσεις OpenGraph
       registrations:
         closed_message:
           desc_html: Εμφανίζεται στην εισαγωγική σελίδα όταν οι εγγραφές είναι κλειστές. Μπορείς να χρησιμοποιήσεις HTML tags
diff --git a/config/locales/en.yml b/config/locales/en.yml
index e8dd4c8af..6066b6b0b 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -261,6 +261,14 @@ en:
         expired: Expired
         title: Filter
       title: Invites
+    relays:
+      add_new: Add new relay
+      description_html: A <strong>federation relay</strong> is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. <strong>It can help small and medium servers discover content from the fediverse</strong>, which would otherwise require local users manually following other people on remote servers.
+      enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it.
+      inbox_url: Relay URL
+      setup: Setup a relay connection
+      status: Status
+      title: Relays
     report_notes:
       created_msg: Report note successfully created!
       destroyed_msg: Report note successfully deleted!
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index f1de0a7c7..a0f2435de 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -261,6 +261,14 @@ gl:
         expired: Cadudado
         title: Filtro
       title: Convida
+    relays:
+      add_new: Engadir un novo repetidor
+      description_html: Un <strong>repetidor da federación</strong> é un servidor intermedio que intercambia grandes volumes de toots públicos entre servidores que se suscriban e publiquen nel. <strong>Pode axudar a servidores pequenos e medios a descubrir contido no fediverso</strong>, o que de outro xeito precisaría que as usuarias locais seguisen a outra xente en servidores remotos.
+      enable_hint: Unha vez activado, o seu servidor suscribirase a todos os toots públicos de este servidor, e tamén comezará a eviar a el os toots públicos do servidor.
+      inbox_url: URL do repetidor
+      setup: Configurar a conexión ao repetidor
+      status: Estado
+      title: Repetidores
     report_notes:
       created_msg: Creouse correctamente a nota do informe!
       destroyed_msg: Nota do informe eliminouse con éxito!
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 99fd5dd7b..9adf0c7fa 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -261,6 +261,11 @@ ja:
         expired: 期限切れ
         title: フィルター
       title: 招待
+    relays:
+      add_new: リレーを追加
+      inbox_url: Relay URL
+      status: ステータス
+      title: リレー
     report_notes:
       created_msg: レポートメモを書き込みました!
       destroyed_msg: レポートメモを削除しました!
@@ -706,7 +711,7 @@ ja:
     disallowed_hashtags:
       one: '許可されていないハッシュタグが含まれています: %{tags}'
       other: '許可されていないハッシュタグが含まれています: %{tags}'
-    language_detection: 自動的に言語を検出する
+    language_detection: 自動検出
     open_in_web: Webで開く
     over_character_limit: 上限は %{max}文字までです
     pin_errors:
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 26a3b652b..1db8b6836 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -261,6 +261,14 @@ nl:
         expired: Verlopen
         title: Filter
       title: Uitnodigingen
+    relays:
+      add_new: Nieuwe relayserver toevoegen
+      description_html: Een <strong>federatie-relay</strong> is een tussenliggende server die grote hoeveelheden openbare toots uitwisselt tussen servers die zich hierop hebben geabonneerd. <strong>Het kan kleine en middelgrote servers helpen om content uit de fediverse te ontdekken</strong>, waarvoor anders lokale gebruikers handmatig mensen van externe servers moeten volgen.
+      enable_hint: Eenmaal ingeschakeld gaat jouw server zich op alle openbare toots van deze relayserver abonneren en stuurt het de openbare toots van jouw server naar de relayserver.
+      inbox_url: Relay-URL
+      setup: Een verbinding met een relayserver maken
+      status: Status
+      title: Relayservers
     report_notes:
       created_msg: Opmerking bij gerapporteerde toot succesvol aangemaakt!
       destroyed_msg: Opmerking bij gerapporteerde toot succesvol verwijderd!
@@ -492,7 +500,7 @@ nl:
       delete: Verwijderen
       title: Filters
     new:
-      title: Nieuwe filter toevoegen
+      title: Nieuw filter toevoegen
   followers:
     domain: Domein
     explanation_html: Wanneer je de privacy van jouw toots wilt garanderen, moet je goed weten wie jouw volgers zijn. <strong>Toots die alleen aan jouw volgers zijn gericht, worden aan de Mastodonservers van jouw volgers afgeleverd.</strong> Daarom wil je ze misschien controleren en desnoods volgers verwijderen die zich op een Mastodonserver bevinden die jij niet vertrouwd. Bijvoorbeeld omdat de beheerder(s) of de software van zo'n server jouw privacy niet respecteert.
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index 07862e8a8..9d6587776 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -25,6 +25,7 @@ da:
         setting_hide_network: Hvem du følger og hvem der følger dig vil ikke blive vist på din profil
         setting_noindex: Påvirker din offentlige profil og status sider
         setting_theme: Påvirker hvordan Mastodon ser ud nåt du er logget ind via en hvilken som helst enhed.
+        whole_word: Når nøgle ordet eller udtrykket kun er alfabetisk, vil det kun blive brugt hvis det passer hele ordet
       imports:
         data: CSV fil eksporteret fra en anden Mastodon instans
       sessions:
@@ -77,6 +78,7 @@ da:
         type: Importtype
         username: Brugernavn
         username_or_email: Brugernavn eller Email
+        whole_word: Helt ord
       interactions:
         must_be_follower: Bloker notifikationer fra folk der ikke følger dig
         must_be_following: Bloker notifikationer fra folk du ikke følger
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index fb8d9e7c7..9e29a2824 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -48,7 +48,7 @@ de:
         data: Daten
         display_name: Anzeigename
         email: E-Mail-Adresse
-        expires_in: Gültig bis
+        expires_in: Läuft ab
         fields: Profil-Metadaten
         header: Kopfbild
         irreversible: Fallen lassen anstatt es zu verstecken
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index 00fba5d27..293c5ac7c 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -13,6 +13,7 @@ el:
           other: απομένουν <span class="name-counter">%{count}</span> χαρακτήρες
         fields: Μπορείς να έχεις έως 4 σημειώσεις σε μορφή πίνακα στο προφίλ σου
         header: PNG, GIF ή JPG. Έως 2MB. Θα μειωθεί σε διάσταση 700x335px
+        inbox_url: Αντέγραψε το URL της αρχικής σελίδας του ανταποκριτή (relay) που θέλεις να χρησιμοποιήσεις
         irreversible: Τα φιλτραρισμένα τουτ θα εξαφανιστούν αμετάκλητα, ακόμα και αν το φίλτρο αργότερα αφαιρεθεί
         locale: Η γλώσσα του περιβάλλοντος χρήσης, των email και των ειδοποιήσεων ώθησης
         locked: Απαιτεί να εγκρίνεις χειροκίνητα τους ακόλουθούς σου
@@ -25,6 +26,7 @@ el:
         setting_hide_network: Το ποιους ακολουθείς και το ποιοι σε ακολουθούν δε θα φαίνεται στο προφίλ σου
         setting_noindex: Επηρεάζει το δημόσιο προφίλ και τις δημοσιεύσεις σου
         setting_theme: Επηρεάζει την εμφάνιση του Mastodon όταν συνδέεται από οποιαδήποτε συσκευή.
+        whole_word: Όταν η λέξη ή η φράση κλειδί είναι μόνο αλφαριθμητική, θα εφαρμοστεί μόνο αν ταιριάζει με ολόκληρη τη λέξη
       imports:
         data: Αρχείο CSV που έχει εξαχθεί από διαφορετικό κόμβο Mastodon
       sessions:
@@ -51,6 +53,7 @@ el:
         expires_in: Λήξη μετά από
         fields: Μετεδεδομένα προφίλ
         header: Επικεφαλίδα
+        inbox_url: Το URL του inbox του ανταποκριτή (relay)
         irreversible: Απόρριψη αντί για κρύψιμο
         locale: Γλώσσα περιβάλλοντος
         locked: Κλείδωμα λογαριασμού
@@ -77,6 +80,7 @@ el:
         type: Τύπος εισαγωγής
         username: Όνομα χρηστη
         username_or_email: Όνομα ή διεύθυνση email χρήστη
+        whole_word: Ολόκληρη λέξη
       interactions:
         must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς
         must_be_following: Μπλόκαρε τις ειδοποιήσεις που προέρχονται από άτομα που δεν τα ακολουθείς
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index d74ccdfe2..cd99160e5 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -13,6 +13,7 @@ en:
           other: <span class="name-counter">%{count}</span> characters left
         fields: You can have up to 4 items displayed as a table on your profile
         header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px
+        inbox_url: Copy the URL from the frontpage of the relay you want to use
         irreversible: Filtered toots will disappear irreversibly, even if filter is later removed
         locale: The language of the user interface, e-mails and push notifications
         locked: Requires you to manually approve followers
@@ -52,6 +53,7 @@ en:
         expires_in: Expire after
         fields: Profile metadata
         header: Header
+        inbox_url: URL of the relay inbox
         irreversible: Drop instead of hide
         locale: Interface language
         locked: Lock account
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index 2a2cc6731..f4266e167 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -13,6 +13,7 @@ fa:
           other: <span class="name-counter">%{count}</span> حرف باقی مانده
         fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید
         header: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۳۳۵×۷۰۰ پیکسل تبدیل خواهد شد
+        inbox_url: نشانی صفحهٔ اصلی رله‌ای را که می‌خواهید به کار ببرید کپی کنید
         irreversible: بوق‌های فیلترشده به طور برگشت‌ناپذیری ناپدید می‌شوند، حتی اگر فیلتر را بعداً بردارید
         locale: زبان محیط کاربری، ایمیل‌ها، و اعلان‌ها
         locked: باید پیگیران تازه را خودتان تأیید کنید
@@ -20,10 +21,12 @@ fa:
           one: <span class="note-counter">1</span> حرف باقی مانده
           other: <span class="note-counter">%{count}</span> حرف باقی مانده
         phrase: مستقل از کوچکی و بزرگی حروف، با متن اصلی یا هشدار محتوای بوق‌ها مقایسه می‌شود
+        scopes: واسط‌های برنامه‌نویسی که این برنامه به آن دسترسی دارد. اگر بالاترین سطح دسترسی را انتخاب کنید، دیگر نیازی به انتخاب سطح‌های پایینی ندارید.
         setting_default_language: زبان نوشته‌های شما به طور خودکار تشخیص داده می‌شود، ولی این تشخصی همیشه دقیق نیست
         setting_hide_network: فهرست پیگیران شما و فهرست کسانی که شما پی می‌گیرید روی نمایهٔ شما دیده نخواهد شد
         setting_noindex: روی نمایهٔ عمومی و صفحهٔ نوشته‌های شما تأثیر می‌گذارد
         setting_theme: ظاهر ماستدون را وقتی که از هر دستگاهی به آن وارد می‌شوید تعیین می‌کند.
+        whole_word: اگر کلیدواژه فقط دارای حروف و اعداد باشد، تنها وقتی پیدا می‌شود که با کل یک واژه در متن منطبق باشد، نه با بخشی از یک واژه
       imports:
         data: پروندهٔ CSV که از سرور ماستدون دیگری برون‌سپاری شده
       sessions:
@@ -50,6 +53,7 @@ fa:
         expires_in: تاریخ انقضا
         fields: اطلاعات تکمیلی نمایه
         header: تصویر زمینه
+        inbox_url: نشانی صندوق ورودی رله
         irreversible: به جای پنهان‌سازی، حذف کن
         locale: زبان محیط کاربری
         locked: خصوصی‌کردن حساب
@@ -76,6 +80,7 @@ fa:
         type: نوع درون‌ریزی
         username: نام کاربری (تنها حروف انگلیسی)
         username_or_email: نام کاربری یا ایمیل
+        whole_word: تطابق واژهٔ کامل
       interactions:
         must_be_follower: مسدودکردن اعلان‌های همه به جز پیگیران
         must_be_following: مسدودکردن اعلان‌های کسانی که شما پی نمی‌گیرید
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 25694395d..84990a66f 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -13,6 +13,7 @@ gl:
           other: <span class="name-counter">%{count}</span> caracteres restantes
         fields: Pode ter ate 4 elementos no seu perfil mostrados como unha táboa
         header: PNG, GIF ou JPG. Máximo 2MB. Será reducida a 700x335px
+        inbox_url: Copiar o URL desde a páxina de inicio do repetidor que quere utilizar
         irreversible: Os toots filtrados desaparecerán de xeito irreversible, incluso si despois se elimina o filtro
         locale: O idioma da interface de usuaria, correos e notificacións
         locked: Require que vostede acepte as seguidoras de xeito manual
@@ -25,6 +26,7 @@ gl:
         setting_hide_network: Non se mostrará no seu perfil quen a segue e quen a está a seguir
         setting_noindex: Afecta ao seu perfil público e páxinas de estado
         setting_theme: Afecta ao aspecto de Mastodon en calquer dispositivo cando está conectada.
+        whole_word: Si a chave ou frase de paso é só alfanumérica, só se aplicará si concorda a palabra completa
       imports:
         data: Ficheiro CSV exportado desde outra instancia Mastodon
       sessions:
@@ -51,6 +53,7 @@ gl:
         expires_in: Caducidade despois de
         fields: Metadatos do perfil
         header: Cabeceira
+        inbox_url: URL da caixa de entrada do repetidor
         irreversible: Soltar en lugar de agochar
         locale: Idioma da interface
         locked: Protexer conta
@@ -77,6 +80,7 @@ gl:
         type: Tipo de importación
         username: Nome de usuaria
         username_or_email: Nome de usuaria ou Correo-e
+        whole_word: Palabra completa
       interactions:
         must_be_follower: Bloquear as notificacións de non-seguidoras
         must_be_following: Bloquea as notificacións de personas que non segue
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 9b98c683d..469a1a18e 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -40,7 +40,7 @@ ja:
         chosen_languages: 表示する言語
         confirm_new_password: 新しいパスワード(確認用)
         confirm_password: パスワード(確認用)
-        context: フィルター対象
+        context: 除外対象
         current_password: 現在のパスワード
         data: データ
         display_name: 表示名
@@ -48,6 +48,7 @@ ja:
         expires_in: 有効期限
         fields: プロフィール補足情報
         header: ヘッダー
+        inbox_url: URL of the relay inbox
         irreversible: 隠すのではなく除外する
         locale: 言語
         locked: 承認制アカウントにする
@@ -56,7 +57,7 @@ ja:
         note: プロフィール
         otp_attempt: 二段階認証コード
         password: パスワード
-        phrase: 単語または語句
+        phrase: キーワードまたはフレーズ
         setting_auto_play_gif: アニメーションGIFを自動再生する
         setting_boost_modal: ブーストする前に確認ダイアログを表示する
         setting_default_language: 投稿する言語
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index e0a6a7405..392c24e82 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -20,10 +20,12 @@ ko:
           one: <span class="note-counter">1</span> 글자 남음
           other: <span class="note-counter">%{count}</span> 글자 남음
         phrase: 툿 내용이나 CW 내용 안에서 대소문자 구분 없이 매칭 됩니다
+        scopes: 애플리케이션에 허용할 API들입니다. 최상위 스코프를 선택하면 개별적인 것은 선택하지 않아도 됩니다.
         setting_default_language: 작성한 툿의 언어는 자동으로 인식할 수 있지만, 언제나 정확한 건 아닙니다
         setting_hide_network: 나를 팔로우 하는 사람들과 내가 팔로우 하는 사람들이 내 프로필에 표시되지 않게 합니다
         setting_noindex: 공개 프로필 및 각 툿페이지에 영향을 미칩니다
         setting_theme: 로그인중인 모든 디바이스에 적용되는 디자인입니다.
+        whole_word: 키워드가 영문과 숫자로만 이루어 진 경우, 단어 전체에 매칭 되었을 때에만 작동하게 합니다
       imports:
         data: 다른 마스토돈 인스턴스에서 추출된 CSV 파일
       sessions:
@@ -76,6 +78,7 @@ ko:
         type: 불러오기 종류
         username: 유저 이름
         username_or_email: 유저네임 또는 이메일
+        whole_word: 단어 전체에 매칭
       interactions:
         must_be_follower: 나를 팔로우 하지 않는 사람에게서 온 알림을 차단
         must_be_following: 내가 팔로우 하지 않는 사람에게서 온 알림을 차단
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index eb13ec195..47520a55b 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -13,6 +13,7 @@ nl:
           other: <span class="name-counter">%{count}</span> tekens over
         fields: Je kan maximaal 4 items als een tabel op je profiel weergeven
         header: PNG, GIF of JPG. Maximaal 2MB. Wordt teruggeschaald naar 700x335px
+        inbox_url: Kopieer de URL van de voorpagina van de relayserver die je wil gebruiken
         irreversible: Gefilterde toots verdwijnen onomkeerbaar, zelfs als de filter later wordt verwijderd
         locale: De taal van de gebruikersomgeving, e-mails en pushmeldingen
         locked: Vereist dat je handmatig volgers moet accepteren
@@ -25,6 +26,7 @@ nl:
         setting_hide_network: Wie jij volgt en wie jou volgen wordt niet op jouw profiel getoond
         setting_noindex: Heeft invloed op jouw openbare profiel en toots
         setting_theme: Heeft invloed op hoe de webapp van Mastodon eruitziet (op elk apparaat waarmee je inlogt).
+        whole_word: Wanneer het trefwoord of zinsdeel alfanumeriek is, wordt het alleen gefilterd wanneer het hele woord overeenkomt
       imports:
         data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd
       sessions:
@@ -51,6 +53,7 @@ nl:
         expires_in: Vervalt na
         fields: Metadata profiel
         header: Omslagfoto
+        inbox_url: Inbox-URL van de relayserver
         irreversible: Verwijderen in plaats van verbergen
         locale: Taal van de gebruikersomgeving
         locked: Maak account besloten
@@ -77,6 +80,7 @@ nl:
         type: Importtype
         username: Gebruikersnaam
         username_or_email: Gebruikersnaam of e-mailadres
+        whole_word: Heel woord
       interactions:
         must_be_follower: Meldingen van mensen die jou niet volgen blokkeren
         must_be_following: Meldingen van mensen die jij niet volgt blokkeren
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 39fa3b833..1fc1c7e69 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -27,6 +27,7 @@ sk:
         setting_hide_network: Koho následuješ, a kto následuje teba nebude zobrazené na tvojom profile
         setting_noindex: Ovplyvňuje verejný profil a statusy
         setting_theme: Toto ovplyvňuje ako Mastodon vyzerá pri prihlásení z hociakého zariadenia.
+        whole_word: Ak je kľúčové slovo, alebo fráza poskladaná iba s písmen a čísel, bude použité iba ak sa zhoduje s celým výrazom
       imports:
         data: CSV súbor vyexportovaný z inej Mastodon inštancie
       sessions:
@@ -53,6 +54,7 @@ sk:
         expires_in: Expirovať po
         fields: Metadáta profilu
         header: Obrázok v hlavičke
+        inbox_url: URL adresa prechodnej schránky
         irreversible: Zahoď, namiesto skritia
         locale: Jazyk rozhrania
         locked: Zamknúť účet
@@ -79,6 +81,7 @@ sk:
         type: Typ importu
         username: Prezývka
         username_or_email: Prezívka, alebo email
+        whole_word: Celé slovo
       interactions:
         must_be_follower: Blokovať oznámenia od užívateľov, ktorí ťa nesledujú
         must_be_following: Blokovať oboznámenia ohľadom ľudí ktorých nesleduješ
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 9921eb525..ba596c266 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -259,9 +259,12 @@ sk:
       filter:
         all: Všetky
         available: Dostupné
-        expired: Expirované
+        expired: Vypršalo
         title: Filtrovať
       title: Pozvánky
+    relays:
+      add_new: Pridaj novú priechodnú oporu
+      status: Stav
     report_notes:
       created_msg: Poznámka o nahlásení úspešne vytvorená!
       destroyed_msg: Poznámka o nahlásení úspešne vymazaná!
@@ -423,11 +426,11 @@ sk:
   authorize_follow:
     already_following: Tento účet už následuješ
     error: Naneštastie nastala chyba pri hľadaní vzdialeného účtu
-    follow: Následovať
-    follow_request: 'Poslali ste požiadavku následovať užívateľa:'
-    following: 'Podarilo sa! Teraz už následujete užívateľa:'
+    follow: Následuj
+    follow_request: 'Poslal/a si žiadosť následovať užívateľa:'
+    following: 'Podarilo sa! Teraz už následuješ užívateľa:'
     post_follow:
-      close: Alebo môžete iba zatvoriť toto okno.
+      close: Alebo môžeš iba zatvoriť toto okno.
       return: Ukáž užívateľov profil
       web: Prejdi do siete
     title: Následuj %{acct}
@@ -635,6 +638,7 @@ sk:
     browser: Prehliadač
     browsers:
       alipay: Alipay
+      blackberry: RIM Blackberry
       chrome: Google Chrome
       edge: Microsoft Edge
       electron: Electron
diff --git a/config/navigation.rb b/config/navigation.rb
index 460027595..f44c3153f 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -42,6 +42,7 @@ SimpleNavigation::Configuration.run do |navigation|
     primary.item :admin, safe_join([fa_icon('cogs fw'), t('admin.title')]), proc { current_user.admin? ? edit_admin_settings_url : admin_custom_emojis_url }, if: proc { current_user.staff? } do |admin|
       admin.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url, if: -> { current_user.admin? }
       admin.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_url, highlights_on: %r{/admin/custom_emojis}
+      admin.item :relays, safe_join([fa_icon('exchange fw'), t('admin.relays.title')]), admin_relays_url, if: -> { current_user.admin? }, highlights_on: %r{/admin/relays}
       admin.item :subscriptions, safe_join([fa_icon('paper-plane-o fw'), t('admin.subscriptions.title')]), admin_subscriptions_url, if: -> { current_user.admin? }
       admin.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' }, if: -> { current_user.admin? }
       admin.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' }, if: -> { current_user.admin? }
diff --git a/config/routes.rb b/config/routes.rb
index 9778d8b41..95a25536b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -134,6 +134,13 @@ Rails.application.routes.draw do
     resource :settings, only: [:edit, :update]
     resources :invites, only: [:index, :create, :destroy]
 
+    resources :relays, only: [:index, :new, :create, :destroy] do
+      member do
+        post :enable
+        post :disable
+      end
+    end
+
     resources :instances, only: [:index] do
       collection do
         post :resubscribe
diff --git a/config/webpack/development.js b/config/webpack/development.js
index 12670f5cd..d54d919ec 100644
--- a/config/webpack/development.js
+++ b/config/webpack/development.js
@@ -16,6 +16,8 @@ if (process.env.VAGRANT) {
 }
 
 module.exports = merge(sharedConfig, {
+  mode: 'development',
+
   devtool: 'cheap-module-eval-source-map',
 
   stats: {
diff --git a/config/webpack/loaders/sass.js b/config/webpack/loaders/sass.js
index 96ad7abe8..920d5350f 100644
--- a/config/webpack/loaders/sass.js
+++ b/config/webpack/loaders/sass.js
@@ -1,15 +1,27 @@
-const ExtractTextPlugin = require('extract-text-webpack-plugin');
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 const { env } = require('../configuration.js');
 
 module.exports = {
-  test: /\.(scss|sass|css)$/i,
-  use: ExtractTextPlugin.extract({
-    fallback: 'style-loader',
-    use: [
-      { loader: 'css-loader', options: { minimize: env.NODE_ENV === 'production' } },
-      { loader: 'postcss-loader', options: { sourceMap: true } },
-      'resolve-url-loader',
-      { loader: 'sass-loader', options: { includePaths: ['app/javascript'] } },
-    ],
-  }),
+  test: /\.s?css$/i,
+  use: [
+    MiniCssExtractPlugin.loader,
+    {
+      loader: 'css-loader',
+      options: {
+        minimize: env.NODE_ENV === 'production',
+      },
+    },
+    {
+      loader: 'postcss-loader',
+      options: {
+        sourceMap: true,
+      },
+    },
+    {
+      loader: 'sass-loader',
+      options: {
+        includePaths: ['app/javascript'],
+      },
+    },
+  ],
 };
diff --git a/config/webpack/production.js b/config/webpack/production.js
index 037a76a59..58c7fa69a 100644
--- a/config/webpack/production.js
+++ b/config/webpack/production.js
@@ -1,7 +1,7 @@
 // Note: You must restart bin/webpack-dev-server for changes to take effect
 
-const webpack = require('webpack');
 const merge = require('webpack-merge');
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
 const CompressionPlugin = require('compression-webpack-plugin');
 const sharedConfig = require('./shared.js');
 const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
@@ -36,6 +36,8 @@ if (process.env.S3_ENABLED === 'true') {
 }
 
 module.exports = merge(sharedConfig, {
+  mode: 'production',
+
   output: {
     filename: '[name]-[chunkhash].js',
     chunkFilename: '[name]-[chunkhash].js',
@@ -44,19 +46,28 @@ module.exports = merge(sharedConfig, {
   devtool: 'source-map', // separate sourcemap file, suitable for production
   stats: 'normal',
 
-  plugins: [
-    new webpack.optimize.UglifyJsPlugin({
-      sourceMap: true,
-      mangle: true,
+  optimization: {
+    minimize: true,
+    minimizer: [
+      new UglifyJsPlugin({
+        sourceMap: true,
 
-      compress: {
-        warnings: false,
-      },
+        uglifyOptions: {
+          mangle: true,
 
-      output: {
-        comments: false,
-      },
-    }),
+          compress: {
+            warnings: false,
+          },
+
+          output: {
+            comments: false,
+          },
+        },
+      }),
+    ],
+  },
+
+  plugins: [
     new CompressionPlugin({
       asset: '[path].gz[query]',
       algorithm: compressionAlgorithm,
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index 35b9bbd1c..6b6629a37 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -1,9 +1,9 @@
 // Note: You must restart bin/webpack-dev-server for changes to take effect
 
 const webpack = require('webpack');
-const { join, resolve } = require('path');
+const { basename, dirname, join, relative, resolve } = require('path');
 const { sync } = require('glob');
-const ExtractTextPlugin = require('extract-text-webpack-plugin');
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 const ManifestPlugin = require('webpack-manifest-plugin');
 const { env, settings, core, flavours, output, loadersDir } = require('./configuration.js');
 const localePacks = require('./generateLocalePacks');
@@ -59,6 +59,25 @@ module.exports = {
     publicPath: output.publicPath,
   },
 
+  optimization: {
+    runtimeChunk: {
+      name: 'locales',
+    },
+    splitChunks: {
+      cacheGroups: {
+        default: false,
+        vendors: false,
+        locales: {
+          name: 'locales',
+          chunks: 'all',
+          minChunks: Infinity,
+          minSize: 0,
+        },
+      },
+    },
+    occurrenceOrder: true,
+  },
+
   module: {
     rules: sync(join(loadersDir, '*.js')).map(loader => require(loader)),
   },
@@ -72,17 +91,13 @@ module.exports = {
         resource.request = resource.request.replace(/^history/, 'history/es');
       }
     ),
-    new ExtractTextPlugin({
+    new MiniCssExtractPlugin({
       filename: env.NODE_ENV === 'production' ? '[name]-[contenthash].css' : '[name].css',
-      allChunks: true,
     }),
     new ManifestPlugin({
       publicPath: output.publicPath,
       writeToFileEmit: true,
-    }),
-    new webpack.optimize.CommonsChunkPlugin({
-      name: 'locales',
-      minChunks: Infinity, // It doesn't make sense to use common chunks with multiple frontend support.
+      filter: file => !file.isAsset || file.isModuleAsset,
     }),
   ],
 
diff --git a/config/webpack/test.js b/config/webpack/test.js
index 6b2b073bb..8b56eb92f 100644
--- a/config/webpack/test.js
+++ b/config/webpack/test.js
@@ -3,4 +3,6 @@
 const merge = require('webpack-merge');
 const sharedConfig = require('./shared.js');
 
-module.exports = merge(sharedConfig, {});
+module.exports = merge(sharedConfig, {
+  mode: 'development',
+});