about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/environments/development.rb5
-rw-r--r--config/environments/test.rb5
-rw-r--r--config/initializers/inflections.rb2
-rw-r--r--config/initializers/mime_types.rb5
-rw-r--r--config/initializers/vapid.rb17
-rw-r--r--config/locales/ca.yml9
-rw-r--r--config/locales/en.yml24
-rw-r--r--config/locales/fa.yml9
-rw-r--r--config/locales/fr.yml23
-rw-r--r--config/locales/he.yml9
-rw-r--r--config/locales/id.yml9
-rw-r--r--config/locales/ja.yml59
-rw-r--r--config/locales/ko.yml9
-rw-r--r--config/locales/no.yml9
-rw-r--r--config/locales/oc.yml9
-rw-r--r--config/locales/pl.yml78
-rw-r--r--config/locales/pt-BR.yml9
-rw-r--r--config/locales/pt.yml9
-rw-r--r--config/locales/simple_form.en.yml3
-rw-r--r--config/locales/th.yml9
-rw-r--r--config/locales/tr.yml9
-rw-r--r--config/locales/zh-CN.yml9
-rw-r--r--config/locales/zh-HK.yml9
-rw-r--r--config/routes.rb21
-rw-r--r--config/settings.yml1
-rw-r--r--config/webpack/production.js14
26 files changed, 176 insertions, 198 deletions
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 406fa970b..4c60965c8 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -31,6 +31,11 @@ Rails.application.configure do
     config.logger = ActiveSupport::TaggedLogging.new(logger)
   end
 
+  # Generate random VAPID keys
+  vapid_key = Webpush.generate_key
+  config.x.vapid_private_key = vapid_key.private_key
+  config.x.vapid_public_key = vapid_key.public_key
+
   # Don't care if the mailer can't send.
   config.action_mailer.raise_delivery_errors = false
 
diff --git a/config/environments/test.rb b/config/environments/test.rb
index bde69eba1..e68cb156d 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -40,6 +40,11 @@ Rails.application.configure do
   # Print deprecation notices to the stderr.
   config.active_support.deprecation = :stderr
 
+  # Generate random VAPID keys
+  vapid_key = Webpush.generate_key
+  config.x.vapid_private_key = vapid_key.private_key
+  config.x.vapid_public_key = vapid_key.public_key
+
   # Raises error for missing translations
   # config.action_view.raise_on_missing_translations = true
 end
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index a7b1ef690..26275d092 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -14,4 +14,6 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
   inflect.acronym 'StatsD'
   inflect.acronym 'OEmbed'
   inflect.acronym 'ActivityPub'
+  inflect.acronym 'PubSubHubbub'
+  inflect.acronym 'ActivityStreams'
 end
diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb
index b1b73c846..30e91ad63 100644
--- a/config/initializers/mime_types.rb
+++ b/config/initializers/mime_types.rb
@@ -1,5 +1,4 @@
 # Be sure to restart your server when you modify this file.
 
-Mime::Type.register "application/json",           :json, %w( text/x-json application/jsonrequest application/jrd+json )
-Mime::Type.register "text/xml",                   :xml,  %w( application/xml application/atom+xml application/xrd+xml )
-Mime::Type.register "application/activity+json",  :activitystreams2
+Mime::Type.register 'application/json', :json, %w(text/x-json application/jsonrequest application/jrd+json application/activity+json)
+Mime::Type.register 'text/xml',         :xml,  %w(application/xml application/atom+xml application/xrd+xml)
diff --git a/config/initializers/vapid.rb b/config/initializers/vapid.rb
new file mode 100644
index 000000000..618f5a3fb
--- /dev/null
+++ b/config/initializers/vapid.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+Rails.application.configure do
+
+  # You can generate the keys using the following command (first is the private key, second is the public one)
+  # You should only generate this once per instance. If you later decide to change it, all push subscription will
+  # be invalidated, requiring the users to access the website again to resubscribe.
+  #
+  # Generate with `rake mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web rake mastodon:webpush:generate_vapid_key` if you use docker compose)
+  #
+  # For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html
+
+  if Rails.env.production?
+    config.x.vapid_private_key = ENV['VAPID_PRIVATE_KEY']
+    config.x.vapid_public_key = ENV['VAPID_PUBLIC_KEY']
+  end
+end
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index f63aee3e6..0ba893a12 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -30,15 +30,6 @@ ca:
     remote_follow: Seguir
     reserved_username: El nom d'usuari està reservat
     unfollow: Deixar de seguir
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} shared an activity."
-      create:
-        name: "%{account_name} created a note."
-    outbox:
-      name: "%{account_name}'s Outbox"
-      summary: A collection of activities from user %{account_name}.
   admin:
     accounts:
       are_you_sure: Estàs segur?
diff --git a/config/locales/en.yml b/config/locales/en.yml
index c9b5d9ab8..be1f15e25 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -44,15 +44,6 @@ en:
     remote_follow: Remote follow
     reserved_username: The username is reserved
     unfollow: Unfollow
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} shared an activity."
-      create:
-        name: "%{account_name} created a note."
-    outbox:
-      name: "%{account_name}'s Outbox"
-      summary: A collection of activities from user %{account_name}.
   admin:
     accounts:
       are_you_sure: Are you sure?
@@ -335,6 +326,21 @@ en:
     next: Next
     prev: Prev
     truncate: "…"
+  push_notifications:
+    favourite:
+      title: "%{name} favourited your status"
+    follow:
+      title: "%{name} is now following you"
+    mention:
+      action_boost: 'Boost'
+      action_expand: 'Show more'
+      action_favourite: 'Favourite'
+      title: "%{name} mentioned you"
+    reblog:
+      title: "%{name} boosted your status"
+    subscribed:
+      body: "You can now receive push notifications."
+      title: "Subscription registered!"
   remote_follow:
     acct: Enter your username@domain you want to follow from
     missing_resource: Could not find the required redirect URL for your account
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index ade76d670..218d859bb 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -29,15 +29,6 @@ fa:
     posts: نوشته
     remote_follow: پیگیری غیرمستقیم
     unfollow: پایان پیگیری
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} فعالیتی آغاز کرد."
-      create:
-        name: "%{account_name} یادداشتی نوشت."
-    outbox:
-      name: صندوق خروجی %{account_name}
-      summary: مجموعه‌ای از فعالیت‌های کاربر %{account_name}.
   admin:
     accounts:
       are_you_sure: آیا مطمئن هستید؟
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index c2efd0c85..65e681b20 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -30,15 +30,6 @@ fr:
     remote_follow: Suivre à distance
     reserved_username: Ce nom d’utilisateur⋅ice est réservé
     unfollow: Ne plus suivre
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} a partagé une activité."
-      create:
-        name: "%{account_name} a créé une note."
-    outbox:
-      name: Boîte d’envoi de %{account_name}
-      summary: Liste d’activités de %{account_name}
   admin:
     accounts:
       are_you_sure: Êtes-vous certain⋅e ?
@@ -61,7 +52,7 @@ fr:
       media_attachments: Fichiers médias
       moderation:
         all: Tous
-        silenced: Muets
+        silenced: Masqués
         suspended: Suspendus
         title: Modération
       most_recent_activity: Dernière activité
@@ -85,11 +76,11 @@ fr:
         created_reports: Signalements créés par ce compte
         report: signalement
         targeted_reports: Signalements créés visant ce compte
-      silence: Rendre muet
+      silence: Masquer
       statuses: Statuts
       subscribe: S’abonner
       title: Comptes
-      undo_silenced: Annuler le silence
+      undo_silenced: Démasquer
       undo_suspension: Annuler la suspension
       unsubscribe: Se désabonner
       username: Nom d’utilisateur⋅ice
@@ -104,13 +95,13 @@ fr:
         hint: Le blocage de domaine n’empêchera pas la création de comptes dans la base de données, mais il appliquera automatiquement et rétrospectivement des méthodes de modération spécifiques sur ces comptes.
         severity:
           desc_html: "<strong>Silence</strong> rendra les messages des comptes concernés invisibles à ceux qui ne les suivent pas. <strong>Suspend</strong> supprimera tout le contenu des comptes concernés, les médias, et les données du profil."
-          silence: Muet
+          silence: Masqué
           suspend: Suspendre
         title: Nouveau blocage de domaine
       reject_media: Fichiers média rejetés
       reject_media_hint: Supprime localement les fichiers média stockés et refuse d’en télécharger ultérieurement. Ne concerne pas les suspensions.
       severities:
-        silence: Rendre muet
+        silence: Masquer
         suspend: Suspendre
       severity: Séverité
       show:
@@ -118,7 +109,7 @@ fr:
           one: Un compte affecté dans la base de données
           other: "%{count} comptes affectés dans la base de données"
         retroactive:
-          silence: Annuler le silence sur tous les comptes existants pour ce domaine
+          silence: Annuler le masquage sur tous les comptes existants pour ce domaine
           suspend: Annuler la suspension sur tous les comptes existants pour ce domaine
         title: Annuler le blocage de domaine pour %{domain}
         undo: Annuler
@@ -145,7 +136,7 @@ fr:
       reported_account: Compte signalé
       reported_by: Signalé par
       resolved: Résolus
-      silence_account: Rendre le compte muet
+      silence_account: Masquer le compte
       status: Statut
       suspend_account: Suspendre le compte
       target: Cible
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 21f8f1dc4..251b6914e 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -29,15 +29,6 @@ he:
     posts: הודעות
     remote_follow: מעקב מרחוק
     unfollow: הפסקת מעקב
-  activitypub:
-    activity:
-      announce:
-        name: הודעה שותפה על ידי %{account_name}.
-      create:
-        name: הודעה חדשה מאת %{account_name}.
-    outbox:
-      name: תיבת הדוא"ל היוצא של %{account_name}
-      summary: אוסף הפעילויות של %{account_name}.
   admin:
     accounts:
       are_you_sure: בטוח?
diff --git a/config/locales/id.yml b/config/locales/id.yml
index e3fe96331..7bda52c78 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -29,15 +29,6 @@ id:
     posts: Postingan
     remote_follow: Mengikuti
     unfollow: Berhenti mengikuti
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} membagikan aktivitas."
-      create:
-        name: "%{account_name} membuat catatan."
-    outbox:
-      name: "%{account_name} Outbox"
-      summary: Koleksi aktivitas dari pengguna %{account_name}.
   admin:
     accounts:
       are_you_sure: Anda yakin?
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index d57fe8da2..fda87526d 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -30,15 +30,6 @@ ja:
     remote_follow: リモートフォロー
     reserved_username: このユーザー名は予約されています。
     unfollow: フォロー解除
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} さんがアクティビティをシェアしました"
-      create:
-        name: "%{account_name} さんがノートを作成しました"
-    outbox:
-      name: "%{account_name} さんの送信トレイ"
-      summary: "%{account_name} さんからのアクティビティコレクション"
   admin:
     accounts:
       are_you_sure: 本当に実行しますか?
@@ -154,24 +145,31 @@ ja:
       view: 表示
     settings:
       contact_information:
-        email: 公開するメールアドレスを入力
-        username: ユーザー名を入力
+        email: ビジネスメールアドレス
+        username: 連絡先のユーザー名
       registrations:
         closed_message:
-          desc_html: 新規登録を停止しているときにフロントページに表示されます。<br>HTMLタグが利用可能です。
+          desc_html: 新規登録を停止しているときにフロントページに表示されます。HTMLタグが使えます
           title: 新規登録停止時のメッセージ
+        deletion:
+          desc_html: 誰でも自分のアカウントを削除できるようにします
+          title: アカウント削除を受け付ける
         open:
+          desc_html: 誰でも自由にアカウントを作成できるようにします
           title: 新規登録を受け付ける
       site_description:
-        desc_html: トップページへの表示と meta タグに使用されます。<br>HTMLタグ、特に<code>&lt;a&gt;</code> と <code>&lt;em&gt;</code>が利用可能です。
-        title: サイトの説明文
+        desc_html: フロントページへの表示と meta タグに使用される紹介文です。HTMLタグ、特に<code>&lt;a&gt;</code> と <code>&lt;em&gt;</code>が使えます。
+        title: インスタンスの説明
       site_description_extended:
-        desc_html: インスタンスについてのページに表示されます。<br>HTMLタグが利用可能です。
-        title: サイトの詳細な説明
+        desc_html: あなたのインスタンスにおける行動規範やルール、ガイドライン、そのほかの記述をする際に最適な場所です。HTMLタグが使えます
+        title: カスタム詳細説明
       site_terms:
-        desc_html: プライバシーポリシーのページに表示されます。<br>HTMLタグが利用可能です。
-        title: サイトのプライバシーポリシー
-      site_title: サイトのタイトル
+        desc_html: あなたは独自のプライバシーポリシーや利用規約、そのほかの法的根拠を書くことができます。HTMLタグが使えます
+        title: カスタム利用規約
+      site_title: インスタンスの名前
+      timeline_preview:
+        desc_html: ランディングページに公開タイムラインを表示します
+        title: タイムラインプレビュー
       title: サイト設定
     subscriptions:
       callback_url: コールバックURL
@@ -206,6 +204,12 @@ ja:
   authorize_follow:
     error: 残念ながら、リモートアカウントにエラーが発生しました。
     follow: フォロー
+    follow_request: 'あなたは以下のアカウントにフォローリクエストを送信しました:'
+    following: '成功! あなたは現在以下のアカウントをフォローしています:'
+    post_follow:
+      close: またはこのウィンドウを閉じます
+      return: ユーザーのプロフィールに戻る
+      web: Web を開く
     prompt_html: 'あなた(<strong>%{self}</strong>)は以下のアカウントのフォローをリクエストしました:'
     title: "%{acct} をフォロー"
   datetime:
@@ -307,6 +311,21 @@ ja:
     next: 次
     prev: 前
     truncate: "&hellip;"
+  push_notifications:
+    favourite:
+      title: あなたのトゥートが %{name} さんにお気に入り登録されました
+    follow:
+      title: '%{name} さんにフォローされました'
+    mention:
+      action_boost: ブースト
+      action_expand: もっと見る
+      action_favourite: お気に入り
+      title: '%{name} さんから返信がありました'
+    reblog:
+      title: あなたのトゥートが %{name} さんにブーストされました
+    subscribed:
+      body: あなたはプッシュ通知を受け取ることが出来ます
+      title: Subscription が登録されました
   remote_follow:
     acct: あなたの ユーザー名@ドメイン を入力してください
     missing_resource: リダイレクト先が見つかりませんでした
@@ -402,7 +421,7 @@ ja:
 
       <p>このサービスはあなたの個人情報の入力、送信、またはアクセスに際してあなたの個人情報の安全性を維持するために様々なセキュリティ手段をとっています。</p>
 
-      <h3 id="data-retention>データ保持のポリシーはどのようになっていますか?</h3>
+      <h3 id="data-retention">データ保持のポリシーはどのようになっていますか?</h3>
 
       <p>このサービスはデータ保持に関して次のことを行うよう努めます。:</p>
 
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index bafc19993..c7c310cfe 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -30,15 +30,6 @@ ko:
     remote_follow: 리모트 팔로우
     reserved_username: 이 아이디는 예약되어 있습니다.
     unfollow: 팔로우 해제
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} 님이 액티비티를 공유했습니다"
-      create:
-        name: "%{account_name} 님이 노트를 작성했습니다"
-    outbox:
-      name: "%{account_name} 님의 송신함"
-      summary: "%{account_name} 님의 액티비티 모음"
   admin:
     accounts:
       are_you_sure: 정말로 실행하시겠습니까?
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 004e1ff80..cf94524d2 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -29,15 +29,6 @@
     posts: Poster
     remote_follow: Følg fra andre instanser
     unfollow: Avfølg
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} delte en aktivitet."
-      create:
-        name: "%{account_name} laget en aktivitet."
-    outbox:
-      name: "%{account_name} sin utboks"
-      summary: En samling aktiviteter fra brukeren %{account_name}.
   admin:
     accounts:
       are_you_sure: Er du sikker?
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 91a6ca791..2eb85be58 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -29,15 +29,6 @@ oc:
     posts: Estatuts
     remote_follow: Sègre a distància
     unfollow: Quitar de sègre
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} a partejat una activitat."
-      create:
-        name: "%{account_name} a creat una nòta."
-    outbox:
-      name: "%{account_name}'s Outbox"
-      summary: A collection of activities from user %{account_name}.
   admin:
     accounts:
       are_you_sure: Sètz segur ?
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index c6588e846..6f2831670 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -1,17 +1,30 @@
 ---
 pl:
   about:
-    about_mastodon: Mastodon jest <em>wolną i otwartą</em> siecią społecznościową, <em>zdecentralizowaną</em> alternatywą dla zamkniętych, komercyjnych platform. Pozwala uniknąć ryzyka monopolizacji Twojej komunikacji przez jedną korporację. Wybierz serwer, któremu ufasz &mdash; nie ograniczy to Twoich możliwości komunikacji z innymi osobami w sieci. Każdy może też uruchomić własną instancję Mastodona i dołączyć do reszty tej <em>sieci społecznościowej</em>.
+    about_mastodon_html: Mastodon jest wolną i otwartą siecią społecznościową, zdecentralizowaną alternatywą dla zamkniętych, komercyjnych platform.
     about_this: O tej instancji
     business_email: 'Służbowy adres e-mail:'
-    closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta.
+    closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta. Możesz jednak zarejestrować się na innej instancji, uzyskując dostęp do tej samej sieci.
     contact: Kontakt
     description_headline: Czym jest %{domain}?
     domain_count_after: instancji
     domain_count_before: Serwer połączony z
+    features:
+      humane_approach_body: Nauczeni na błędach innych sieci społecznościowych, Mastodon został zaprojektowany tak, aby uniknąć częstych nadużyć.
+      humane_approach_title: Bardziej ludzkie podejście
+      not_a_product_body: Mastodon nie jest komercyjną siecią. Nie doświadczysz tu reklam, zbierania danych, ani centralnego ośrodka, tak jak w przypadku wielu rozwiązań.
+      not_a_product_title: Jesteś człowiekiem, nie produktem
+      real_conversation_body: Mając do dyspozycji 500 znaków na post, rozdrobnienie zawartości i ostrzeżenia o multimediach, możesz wyrażać siebie na wszystkie możliwe sposoby.
+      real_conversation_title: Zaprojektowany do prawdziwych rozmów
+      within_reach_body: Wiele aplikacji dla Androida, iOS i innych platform dzięki przyjaznemu programistom API sprawia, że możesz utrzymywać kontakt ze znajomymi praktycznie wszędzie.
+      within_reach_title: Zawsze w Twoim zasięgu
+    find_another_instance: Znajdź inną instancję
+    generic_description: "%{domain} jest jednym z serwerów sieci"
     get_started: Rozpocznijmy!
+    hosted_on: Mastodon uruchomiony na %{domain}
+    learn_more: Dowiedz się więcej
     links: Odnośniki
-    other_instances: Inne instancje
+    other_instances: Lista instancji
     source_code: Kod źródłowy
     status_count_after: wpisów
     status_count_before: Są autorami
@@ -19,6 +32,7 @@ pl:
     user_count_after: użytkowników
     user_count_before: Z serwera korzysta
     version: Wersja
+    what_is_mastodon: Czym jest Mastodon?
   accounts:
     follow: Śledź
     followers: Śledzących
@@ -30,15 +44,6 @@ pl:
     remote_follow: Zdalne śledzenie
     reserved_username: Ta nazwa użytkownika jest zarezerwowana.
     unfollow: Przestań śledzić
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} udostępnił(a) aktywność."
-      create:
-        name: "%{account_name} utworzył(a) wpis."
-    outbox:
-      name: Skrzynka %{account_name}
-      summary: Zbiór aktywności użytkownika %{account_name}.
   admin:
     accounts:
       are_you_sure: Jesteś tego pewien?
@@ -154,24 +159,31 @@ pl:
       view: Wyświetl
     settings:
       contact_information:
-        email: Wprowadź publiczny adres e-mail
-        username: Wprowadź nazwę użytkownika
+        email: Służbowy adres e-mail
+        username: Nazwa użytkownika do kontaktu
       registrations:
         closed_message:
-          desc_html: Wyświetlana na stronie głównej, gdy możliwość otwarej rejestracji<br>nie jest dostępna. Możesz korzystać z tagów HTML
+          desc_html: Wyświetlana na stronie głównej, gdy możliwość otwarej rejestracji nie jest dostępna. Możesz korzystać z tagów HTML
           title: Wiadomość o nieaktywnej rejestracji
+        deletion:
+          desc_html: Pozwól każdemu na usunięcie konta
+          title: Możliwość usunięcia
         open:
+          desc_html: Pozwól każdemu na założenie konta
           title: Otwarta rejestracja
       site_description:
-        desc_html: Wyświetlany jako nagłówek na stronie głównej oraz jako meta tag.<br>Możesz korzystać z tagów HTML, w szczególności z <code>&lt;a&gt;</code> i <code>&lt;em&gt;</code>.
-        title: Opis strony
+        desc_html: Akapit wprowadzający, widoczny na stronie głównej i znacznikach meta. Możesz korzystać z tagów HTML, w szczególności <code>&lt;a&gt;</code> i <code>&lt;em&gt;</code>.
+        title: Opis instancji
       site_description_extended:
-        desc_html: Wyświetlany w rozszerzonych informacjach o stronie<br>Możesz korzystać z tagów HTML
-        title: Extended site description
+        desc_html: Dobre miejsce na zasady użytkowania, wprowadzenie i inne rzeczy, które wyróżniają tą instancję. Możesz korzystać z tagów HTML
+        title: Niestandrdowy opis stronyv
       site_terms:
-        desc_html: Wyświetlana na stronie zasad użytkowania<br>Możesz używać tagów HTML
-        title: Polityka prywatności strony
-      site_title: Tytuł strony
+        desc_html: Miejsce na własną politykę prywatności, zasady użytkowania i inne unormowania prawne. Możesz używać tagów HTML
+        title: Niestandardowe zasady użytkowania
+      site_title: Nazwa instancji
+      timeline_preview:
+        desc_html: Wyświetlaj publiczną oś czasu na stronie widocznej dla niezalogowanych
+        title: Podgląd osi czasu
       title: Ustawienia strony
     subscriptions:
       callback_url: URL zwrotny
@@ -192,6 +204,7 @@ pl:
   applications:
     invalid_url: Ten URL jest nieprawidłowy
   auth:
+    agreement_html: Rejestrując się, oświadczasz, że zapoznałeś się z <a href="%{rules_path}">naszymi zasadami użytkowania</a> i <a href="%{terms_path}">polityką prywatności</a>.
     change_password: Bezpieczeństwo
     delete_account: Usunięcie konta
     delete_account_html: Jeżeli chcesz usunąć konto, <a href="%{path}">przejdź tutaj</a>. Otrzymasz prośbę o potwierdzenie.
@@ -206,7 +219,7 @@ pl:
   authorize_follow:
     error: Niestety, podczas sprawdzania zdalnego konta wystąpił błąd
     follow: Śledź
-    follow_request: 'Wysłano prośbę o pozwolenie na obserwację:'
+    follow_request: 'Wysłano prośbę o pozwolenie na śledzenie:'
     following: 'Pomyślnie! Od teraz śledzisz:'
     post_follow:
       close: Ewentualnie, możesz po prostu zamknąć tą stronę.
@@ -261,7 +274,7 @@ pl:
       one: W trakcie usuwania śledzących z jednej domeny…
       other: W trakcie usuwania śledzących z %{count} domen…
     true_privacy_html: Pamiętaj, że <strong>rzeczywista prywatność może zostać uzyskana wyłącznie dzięki szyfrowaniu end-to-end</strong>.
-    unlocked_warning_html: Każdy może cię śledzić, aby natychmiastowo zobaczyć twoje statusy. %{lock_link} aby móc kontrolować, kto Cię śledzi.
+    unlocked_warning_html: Każdy może Cię śledzić, aby natychmiastowo zobaczyć twoje statusy. %{lock_link} aby móc kontrolować, kto Cię śledzi.
     unlocked_warning_title: Twoje konto nie jest zablokowane
   generic:
     changes_saved_msg: Ustawienia zapisane!
@@ -278,7 +291,7 @@ pl:
       following: Lista śledzonych
       muting: Lista wyciszonych
     upload: Załaduj
-  landing_strip_html: "<strong>%{name}</strong> ma konto na %{link_to_root_path}. Możesz je śledzić i wejść z nim w interakcję jeśli masz konto gdziekolwiek w Fediwersie."
+  landing_strip_html: "<strong>%{name}</strong> ma konto na %{link_to_root_path}. Możesz je śledzić i wejść z nim w interakcję jeśli masz konto gdziekolwiek w Fediwersum."
   landing_strip_signup_html: Jeśli jeszcze go nie masz, możesz <a href="%{sign_up_path}">stworzyć konto</a>.
   media_attachments:
     validations:
@@ -317,6 +330,21 @@ pl:
     next: Następna
     prev: Poprzednia
     truncate: "&hellip;"
+  push_notifications:
+    favourite:
+      title: "%{name} dodał Twój status do ulubionych"
+    follow:
+      title: "%{name} zaczął Cię śledzić"
+    mention:
+      action_boost: 'Podbij'
+      action_expand: 'Pokaż więcej'
+      action_favourite: 'Dodaj do ulubionych'
+      title: "%{name} wspomniał o Tobie"
+    reblog:
+      title: "%{name} podbił Twój status"
+    subscribed:
+      body: "Otrzymujesz teraz powiadomienia push."
+      title: "Zarejestrowano subskrypcję!"
   remote_follow:
     acct: Podaj swój adres (nazwa@domena), z którego chcesz śledzić
     missing_resource: Nie udało się znaleźć adresu przekierowania z Twojej domeny
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 355c20d05..5ba763ae4 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -29,15 +29,6 @@ pt-BR:
     posts: Posts
     remote_follow: Acesso remoto
     unfollow: Unfollow
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} compartilhou uma atividade."
-      create:
-        name: "%{account_name} criou uma nota."
-    outbox:
-      name: "%{account_name}'s Outbox"
-      summary: Uma coleção de atividades do usuário %{account_name}.
   admin:
     accounts:
       are_you_sure: Você tem certeza?
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 40be8a6c5..346fcdda8 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -29,15 +29,6 @@ pt:
     posts: Posts
     remote_follow: Seguir remotamente
     unfollow: Deixar de seguir
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} anunciou uma atividade."
-      create:
-        name: "%{account_name} criou uma nota."
-    outbox:
-      name: "%{account_name}'s Outbox"
-      summary: Uma coleção de atividades do usuário %{account_name}.
   admin:
     accounts:
       are_you_sure: Tens a certeza?
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index fc5ab5ec8..fbaf0ff68 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -12,6 +12,7 @@ en:
         note:
           one: <span class="note-counter">1</span> character left
           other: <span class="note-counter">%{count}</span> characters left
+        setting_noindex: Affects your public profile and status pages
       imports:
         data: CSV file exported from another Mastodon instance
       sessions:
@@ -27,6 +28,7 @@ en:
         data: Data
         display_name: Display name
         email: E-mail address
+        filtered_languages: Filtered languages
         header: Header
         locale: Language
         locked: Lock account
@@ -40,6 +42,7 @@ en:
         setting_default_sensitive: Always mark media as sensitive
         setting_delete_modal: Show confirmation dialog before deleting a toot
         setting_system_font_ui: Use system's default font
+        setting_noindex: Opt-out of search engine indexing
         severity: Severity
         type: Import type
         username: Username
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 263babdd0..17eb96110 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -29,15 +29,6 @@ th:
     posts: โพสต์
     remote_follow: Remote follow
     unfollow: เลิกติดตาม
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} แชร์กิจกรรม."
-      create:
-        name: "%{account_name} สร้างโน๊ต."
-    outbox:
-      name: "%{account_name}'s Outbox"
-      summary: รวมกิจกรรมของผู้ใช้ %{account_name}.
   admin:
     accounts:
       are_you_sure: แน่ใจนะ?
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index e7864cc57..bb83991cd 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -29,15 +29,6 @@ tr:
     posts: Gönderiler
     remote_follow: Uzaktan takip et
     unfollow: Takibi bırak
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} bir aktivite paylaştı."
-      create:
-        name: "%{account_name} bir not oluşturdu."
-    outbox:
-      name: "%{account_name}'in Gönderdikleri"
-      summary: "%{account_name}'den gelen aktiviteler."
   admin:
     accounts:
       are_you_sure: Emin misiniz?
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 650d4bd15..0526ec1ba 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -29,15 +29,6 @@ zh-CN:
     posts: 嘟文
     remote_follow: 跨站关注
     unfollow: 取消关注
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} 分享了一个活动。"
-      create:
-        name: "%{account_name} 创建了一个记事。"
-    outbox:
-      name: "%{account_name} 的集合"
-      summary: "%{account_name} 的活动集合"
   admin:
     accounts:
       are_you_sure: 你确定吗?
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index d2db78be1..06f9ab63d 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -29,15 +29,6 @@ zh-HK:
     posts: 文章
     remote_follow: 跨站關注
     unfollow: 取消關注
-  activitypub:
-    activity:
-      announce:
-        name: "%{account_name} 分享了一項活動。"
-      create:
-        name: "%{account_name} 新增了一篇筆記。"
-    outbox:
-      name: "%{account_name} 的活動"
-      summary: "%{account_name} 分享的活動列表。"
   admin:
     accounts:
       are_you_sure: 你確定嗎?
diff --git a/config/routes.rb b/config/routes.rb
index a63fb3ae6..33077986c 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -26,7 +26,7 @@ Rails.application.routes.draw do
     confirmations:      'auth/confirmations',
   }
 
-  get '/users/:username', to: redirect('/@%{username}'), constraints: { format: :html }
+  get '/users/:username', to: redirect('/@%{username}'), constraints: lambda { |req| req.format.nil? }
 
   resources :accounts, path: 'users', only: [:show], param: :username do
     resources :stream_entries, path: 'updates', only: [:show] do
@@ -38,10 +38,17 @@ Rails.application.routes.draw do
     get :remote_follow,  to: 'remote_follow#new'
     post :remote_follow, to: 'remote_follow#create'
 
+    resources :statuses, only: [:show] do
+      member do
+        get :activity
+      end
+    end
+
     resources :followers, only: [:index], controller: :follower_accounts
     resources :following, only: [:index], controller: :following_accounts
     resource :follow, only: [:create], controller: :account_follow
     resource :unfollow, only: [:create], controller: :account_unfollow
+    resource :outbox, only: [:show], module: :activitypub
   end
 
   get '/@:username', to: 'accounts#show', as: :short_account
@@ -119,13 +126,6 @@ Rails.application.routes.draw do
     # OEmbed
     get '/oembed', to: 'oembed#show', as: :oembed
 
-    # ActivityPub
-    namespace :activitypub do
-      get '/users/:id/outbox', to: 'outbox#show', as: :outbox
-      get '/statuses/:id', to: 'activities#show_status', as: :status
-      resources :notes, only: [:show]
-    end
-
     # JSON / REST API
     namespace :v1 do
       resources :statuses, only: [:create, :show, :destroy] do
@@ -206,6 +206,11 @@ Rails.application.routes.draw do
 
     namespace :web do
       resource :settings, only: [:update]
+      resources :push_subscriptions, only: [:create] do
+        member do
+          put :update
+        end
+      end
     end
   end
 
diff --git a/config/settings.yml b/config/settings.yml
index 32776515c..d677e1f84 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -21,6 +21,7 @@ defaults: &defaults
   auto_play_gif: false
   delete_modal: true
   system_font_ui: false
+  noindex: false
   notification_emails:
     follow: false
     reblog: false
diff --git a/config/webpack/production.js b/config/webpack/production.js
index 303fca81b..4592db89e 100644
--- a/config/webpack/production.js
+++ b/config/webpack/production.js
@@ -5,6 +5,9 @@ const merge = require('webpack-merge');
 const CompressionPlugin = require('compression-webpack-plugin');
 const sharedConfig = require('./shared.js');
 const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
+const OfflinePlugin = require('offline-plugin');
+const { publicPath } = require('./configuration.js');
+const path = require('path');
 
 module.exports = merge(sharedConfig, {
   output: { filename: '[name]-[chunkhash].js' },
@@ -39,5 +42,16 @@ module.exports = merge(sharedConfig, {
       openAnalyzer: false,
       logLevel: 'silent', // do not bother Webpacker, who runs with --json and parses stdout
     }),
+    new OfflinePlugin({
+      publicPath: publicPath, // sw.js must be served from the root to avoid scope issues
+      caches: { }, // do not cache things, we only use it for push notifications for now
+      ServiceWorker: {
+        entry: path.join(__dirname, '../../app/javascript/mastodon/service_worker/entry.js'),
+        cacheName: 'mastodon',
+        output: '../sw.js',
+        publicPath: '/sw.js',
+        minify: true,
+      },
+    }),
   ],
 });