From d0d8be7fe39bd0c88c414ff02aea0e9b1d72ba84 Mon Sep 17 00:00:00 2001
From: crowdin <project2_bot@noreply.code.castopod.org>
Date: Fri, 14 Oct 2022 16:12:14 +0000
Subject: [PATCH] chore: new Crowdin updates

---
 app/Language/it/Comment.php                   |  28 ++---
 app/Language/it/Common.php                    |  26 ++---
 app/Language/it/Episode.php                   |  20 ++--
 app/Language/it/Fediverse.php                 |  32 +++---
 app/Language/it/Home.php                      |  12 +--
 app/Language/it/Page.php                      |   6 +-
 app/Language/it/Podcast.php                   |  32 +++---
 app/Language/it/Post.php                      |  40 +++----
 docs/src/ar/getting-started/docker.md         |  54 +++++-----
 docs/src/ar/getting-started/install.md        |  33 +++++-
 docs/src/ar/index.md                          |   1 +
 docs/src/br/getting-started/docker.md         |  54 +++++-----
 docs/src/br/getting-started/install.md        |  33 +++++-
 docs/src/br/index.md                          |   1 +
 docs/src/ca/getting-started/docker.md         |  64 ++++++-----
 docs/src/ca/getting-started/install.md        |  47 ++++++--
 docs/src/ca/index.md                          |   1 +
 docs/src/de/getting-started/docker.md         |  54 +++++-----
 docs/src/de/getting-started/install.md        |  33 +++++-
 docs/src/de/index.md                          |   1 +
 docs/src/el/getting-started/docker.md         |  54 +++++-----
 docs/src/el/getting-started/install.md        |  33 +++++-
 docs/src/el/index.md                          |   1 +
 docs/src/es/getting-started/docker.md         |  54 +++++-----
 docs/src/es/getting-started/install.md        |  47 ++++++--
 docs/src/es/index.md                          |   1 +
 docs/src/fa/getting-started/docker.md         |  54 +++++-----
 docs/src/fa/getting-started/install.md        |  33 +++++-
 docs/src/fa/index.md                          |   1 +
 docs/src/fr/getting-started/docker.md         |  54 +++++-----
 docs/src/fr/getting-started/install.md        |  47 ++++++--
 docs/src/fr/index.md                          |   1 +
 docs/src/gd/getting-started/docker.md         |  54 +++++-----
 docs/src/gd/getting-started/install.md        |  33 +++++-
 docs/src/gd/index.md                          |   1 +
 docs/src/gl/getting-started/docker.md         |  54 +++++-----
 docs/src/gl/getting-started/install.md        |  33 +++++-
 docs/src/gl/index.md                          |   1 +
 docs/src/id/getting-started/docker.md         |  54 +++++-----
 docs/src/id/getting-started/install.md        |  33 +++++-
 docs/src/id/index.md                          |   1 +
 docs/src/it/getting-started/docker.md         |  54 +++++-----
 docs/src/it/getting-started/install.md        |  33 +++++-
 docs/src/it/index.md                          |   1 +
 docs/src/nl/getting-started/docker.md         |  54 +++++-----
 docs/src/nl/getting-started/install.md        |  33 +++++-
 docs/src/nl/index.md                          |   1 +
 docs/src/nn-NO/getting-started/docker.md      |  54 +++++-----
 docs/src/nn-NO/getting-started/install.md     |  35 +++++-
 docs/src/nn-NO/index.md                       |   1 +
 docs/src/oc/getting-started/docker.md         |  54 +++++-----
 docs/src/oc/getting-started/install.md        |  33 +++++-
 docs/src/oc/index.md                          |   1 +
 docs/src/pl/getting-started/docker.md         |  54 +++++-----
 docs/src/pl/getting-started/install.md        |  33 +++++-
 docs/src/pl/index.md                          |   1 +
 docs/src/pt-BR/getting-started/docker.md      |  54 +++++-----
 docs/src/pt-BR/getting-started/install.md     |  35 +++++-
 docs/src/pt-BR/index.md                       |   1 +
 docs/src/pt/getting-started/docker.md         |  54 +++++-----
 docs/src/pt/getting-started/install.md        |  33 +++++-
 docs/src/pt/index.md                          |   1 +
 docs/src/ru/getting-started/docker.md         |  54 +++++-----
 docs/src/ru/getting-started/install.md        |  33 +++++-
 docs/src/ru/index.md                          |   1 +
 docs/src/sk/getting-started/docker.md         |  54 +++++-----
 docs/src/sk/getting-started/install.md        |  33 +++++-
 docs/src/sk/index.md                          |   1 +
 docs/src/sv/getting-started/docker.md         |  54 +++++-----
 docs/src/sv/getting-started/install.md        |  33 +++++-
 docs/src/sv/index.md                          |   1 +
 docs/src/zh-Hans/getting-started/docker.md    |  54 +++++-----
 docs/src/zh-Hans/getting-started/install.md   |  35 +++++-
 docs/src/zh-Hans/index.md                     |   1 +
 modules/Admin/Language/ar/Breadcrumb.php      |   3 +
 modules/Admin/Language/ar/Episode.php         |  11 ++
 modules/Admin/Language/ar/Podcast.php         |   3 +
 .../Admin/Language/ar/PodcastNavigation.php   |   3 +
 modules/Admin/Language/ar/Settings.php        |   2 +
 modules/Admin/Language/br/Breadcrumb.php      |   3 +
 modules/Admin/Language/br/Episode.php         |  11 ++
 modules/Admin/Language/br/Podcast.php         |   3 +
 .../Admin/Language/br/PodcastNavigation.php   |   3 +
 modules/Admin/Language/br/Settings.php        |   2 +
 modules/Admin/Language/ca/Breadcrumb.php      |   3 +
 modules/Admin/Language/ca/Episode.php         |  11 ++
 modules/Admin/Language/ca/Podcast.php         |   3 +
 .../Admin/Language/ca/PodcastNavigation.php   |   3 +
 modules/Admin/Language/ca/Settings.php        |   2 +
 modules/Admin/Language/de/Breadcrumb.php      |   3 +
 modules/Admin/Language/de/Episode.php         |  11 ++
 modules/Admin/Language/de/Podcast.php         |   3 +
 .../Admin/Language/de/PodcastNavigation.php   |   3 +
 modules/Admin/Language/de/Settings.php        |   2 +
 modules/Admin/Language/el/Breadcrumb.php      |   3 +
 modules/Admin/Language/el/Episode.php         |  11 ++
 modules/Admin/Language/el/Podcast.php         |   3 +
 .../Admin/Language/el/PodcastNavigation.php   |   3 +
 modules/Admin/Language/el/Settings.php        |   2 +
 modules/Admin/Language/es/Breadcrumb.php      |   3 +
 modules/Admin/Language/es/Episode.php         |  11 ++
 modules/Admin/Language/es/Podcast.php         |   3 +
 .../Admin/Language/es/PodcastNavigation.php   |   3 +
 modules/Admin/Language/es/Settings.php        |   2 +
 modules/Admin/Language/fa/Breadcrumb.php      |   3 +
 modules/Admin/Language/fa/Episode.php         |  11 ++
 modules/Admin/Language/fa/Podcast.php         |   3 +
 .../Admin/Language/fa/PodcastNavigation.php   |   3 +
 modules/Admin/Language/fa/Settings.php        |   2 +
 modules/Admin/Language/fr/Breadcrumb.php      |   3 +
 modules/Admin/Language/fr/Episode.php         |  11 ++
 modules/Admin/Language/fr/Podcast.php         |   3 +
 .../Admin/Language/fr/PodcastNavigation.php   |   3 +
 modules/Admin/Language/fr/Settings.php        |   2 +
 modules/Admin/Language/gd/Breadcrumb.php      |   3 +
 modules/Admin/Language/gd/Episode.php         |  11 ++
 modules/Admin/Language/gd/Podcast.php         |   3 +
 .../Admin/Language/gd/PodcastNavigation.php   |   3 +
 modules/Admin/Language/gd/Settings.php        |   2 +
 modules/Admin/Language/gl/Breadcrumb.php      |   3 +
 modules/Admin/Language/gl/Episode.php         |  11 ++
 modules/Admin/Language/gl/Podcast.php         |   3 +
 .../Admin/Language/gl/PodcastNavigation.php   |   3 +
 modules/Admin/Language/gl/Settings.php        |   2 +
 modules/Admin/Language/id/Breadcrumb.php      |   3 +
 modules/Admin/Language/id/Episode.php         |  11 ++
 modules/Admin/Language/id/Podcast.php         |   3 +
 .../Admin/Language/id/PodcastNavigation.php   |   3 +
 modules/Admin/Language/id/Settings.php        |   2 +
 modules/Admin/Language/it/Breadcrumb.php      |  61 ++++++-----
 modules/Admin/Language/it/Charts.php          |   2 +-
 modules/Admin/Language/it/Common.php          |  46 ++++----
 modules/Admin/Language/it/Contributor.php     |  28 ++---
 modules/Admin/Language/it/Countries.php       |  86 +++++++--------
 modules/Admin/Language/it/Episode.php         |  43 +++++---
 modules/Admin/Language/it/Podcast.php         |   3 +
 .../Admin/Language/it/PodcastNavigation.php   |   3 +
 modules/Admin/Language/it/Settings.php        |   2 +
 modules/Admin/Language/nl/Breadcrumb.php      |   3 +
 modules/Admin/Language/nl/Episode.php         |  11 ++
 modules/Admin/Language/nl/Podcast.php         |   3 +
 .../Admin/Language/nl/PodcastNavigation.php   |   3 +
 modules/Admin/Language/nl/Settings.php        |   2 +
 modules/Admin/Language/nn-NO/Breadcrumb.php   |   3 +
 modules/Admin/Language/nn-NO/Episode.php      |  11 ++
 modules/Admin/Language/nn-NO/Podcast.php      |   3 +
 .../Language/nn-NO/PodcastNavigation.php      |   3 +
 modules/Admin/Language/nn-NO/Settings.php     |   2 +
 modules/Admin/Language/oc/Breadcrumb.php      |   3 +
 modules/Admin/Language/oc/Episode.php         |  11 ++
 modules/Admin/Language/oc/Podcast.php         |   3 +
 .../Admin/Language/oc/PodcastNavigation.php   |   3 +
 modules/Admin/Language/oc/Settings.php        |   2 +
 modules/Admin/Language/pl/Breadcrumb.php      |   3 +
 modules/Admin/Language/pl/Episode.php         |  11 ++
 modules/Admin/Language/pl/Podcast.php         |   3 +
 .../Admin/Language/pl/PodcastNavigation.php   |   3 +
 modules/Admin/Language/pl/Settings.php        |   2 +
 modules/Admin/Language/pt-BR/Breadcrumb.php   |   3 +
 modules/Admin/Language/pt-BR/Episode.php      |  11 ++
 modules/Admin/Language/pt-BR/Podcast.php      |   3 +
 .../Language/pt-BR/PodcastNavigation.php      |   3 +
 modules/Admin/Language/pt-BR/Settings.php     |   2 +
 modules/Admin/Language/pt/Breadcrumb.php      |   3 +
 modules/Admin/Language/pt/Episode.php         |  11 ++
 modules/Admin/Language/pt/Podcast.php         |   3 +
 .../Admin/Language/pt/PodcastNavigation.php   |   3 +
 modules/Admin/Language/pt/Settings.php        |   2 +
 modules/Admin/Language/ru/Breadcrumb.php      |   3 +
 modules/Admin/Language/ru/Episode.php         |  11 ++
 modules/Admin/Language/ru/Podcast.php         |   3 +
 .../Admin/Language/ru/PodcastNavigation.php   |   3 +
 modules/Admin/Language/ru/Settings.php        |   2 +
 modules/Admin/Language/sk/Breadcrumb.php      |   3 +
 modules/Admin/Language/sk/Episode.php         |  11 ++
 modules/Admin/Language/sk/Podcast.php         |   3 +
 .../Admin/Language/sk/PodcastNavigation.php   |   3 +
 modules/Admin/Language/sk/Settings.php        |   2 +
 modules/Admin/Language/sv/Breadcrumb.php      |   3 +
 modules/Admin/Language/sv/Episode.php         |  11 ++
 modules/Admin/Language/sv/Podcast.php         |   3 +
 .../Admin/Language/sv/PodcastNavigation.php   |   3 +
 modules/Admin/Language/sv/Settings.php        |   2 +
 modules/Admin/Language/zh-Hans/Breadcrumb.php |   3 +
 modules/Admin/Language/zh-Hans/Episode.php    |  11 ++
 modules/Admin/Language/zh-Hans/Podcast.php    |   3 +
 .../Language/zh-Hans/PodcastNavigation.php    |   3 +
 modules/Admin/Language/zh-Hans/Settings.php   |   2 +
 .../Language/ar/PremiumPodcasts.php           |  34 ++++++
 .../Language/ar/Subscription.php              | 100 ++++++++++++++++++
 .../Language/br/PremiumPodcasts.php           |  34 ++++++
 .../Language/br/Subscription.php              | 100 ++++++++++++++++++
 .../Language/ca/PremiumPodcasts.php           |  34 ++++++
 .../Language/ca/Subscription.php              | 100 ++++++++++++++++++
 .../Language/de/PremiumPodcasts.php           |  34 ++++++
 .../Language/de/Subscription.php              | 100 ++++++++++++++++++
 .../Language/el/PremiumPodcasts.php           |  34 ++++++
 .../Language/el/Subscription.php              | 100 ++++++++++++++++++
 .../Language/es/PremiumPodcasts.php           |  34 ++++++
 .../Language/es/Subscription.php              | 100 ++++++++++++++++++
 .../Language/fa/PremiumPodcasts.php           |  34 ++++++
 .../Language/fa/Subscription.php              | 100 ++++++++++++++++++
 .../Language/fr/PremiumPodcasts.php           |  34 ++++++
 .../Language/fr/Subscription.php              | 100 ++++++++++++++++++
 .../Language/gd/PremiumPodcasts.php           |  34 ++++++
 .../Language/gd/Subscription.php              | 100 ++++++++++++++++++
 .../Language/gl/PremiumPodcasts.php           |  34 ++++++
 .../Language/gl/Subscription.php              | 100 ++++++++++++++++++
 .../Language/id/PremiumPodcasts.php           |  34 ++++++
 .../Language/id/Subscription.php              | 100 ++++++++++++++++++
 .../Language/it/PremiumPodcasts.php           |  34 ++++++
 .../Language/it/Subscription.php              | 100 ++++++++++++++++++
 .../Language/nl/PremiumPodcasts.php           |  34 ++++++
 .../Language/nl/Subscription.php              | 100 ++++++++++++++++++
 .../Language/nn-NO/PremiumPodcasts.php        |  34 ++++++
 .../Language/nn-NO/Subscription.php           | 100 ++++++++++++++++++
 .../Language/oc/PremiumPodcasts.php           |  34 ++++++
 .../Language/oc/Subscription.php              | 100 ++++++++++++++++++
 .../Language/pl/PremiumPodcasts.php           |  34 ++++++
 .../Language/pl/Subscription.php              | 100 ++++++++++++++++++
 .../Language/pt-BR/PremiumPodcasts.php        |  34 ++++++
 .../Language/pt-BR/Subscription.php           | 100 ++++++++++++++++++
 .../Language/pt/PremiumPodcasts.php           |  34 ++++++
 .../Language/pt/Subscription.php              | 100 ++++++++++++++++++
 .../Language/ru/PremiumPodcasts.php           |  34 ++++++
 .../Language/ru/Subscription.php              | 100 ++++++++++++++++++
 .../Language/sk/PremiumPodcasts.php           |  34 ++++++
 .../Language/sk/Subscription.php              | 100 ++++++++++++++++++
 .../Language/sv/PremiumPodcasts.php           |  34 ++++++
 .../Language/sv/Subscription.php              | 100 ++++++++++++++++++
 .../Language/zh-Hans/PremiumPodcasts.php      |  34 ++++++
 .../Language/zh-Hans/Subscription.php         | 100 ++++++++++++++++++
 232 files changed, 5048 insertions(+), 826 deletions(-)
 create mode 100644 modules/PremiumPodcasts/Language/ar/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/ar/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/br/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/br/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/ca/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/ca/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/de/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/de/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/el/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/el/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/es/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/es/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/fa/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/fa/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/fr/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/gd/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/gd/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/gl/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/gl/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/id/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/id/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/it/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/it/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/nl/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/nn-NO/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/oc/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/oc/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/pl/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/pt-BR/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/pt/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/pt/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/ru/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/ru/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/sk/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/sk/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/sv/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/sv/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/zh-Hans/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/zh-Hans/Subscription.php

diff --git a/app/Language/it/Comment.php b/app/Language/it/Comment.php
index 1dd8f5eadc..11ef4c50c7 100644
--- a/app/Language/it/Comment.php
+++ b/app/Language/it/Comment.php
@@ -9,26 +9,26 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => "{actorDisplayName}'s comment for {episodeTitle}",
-    'back_to_comments' => 'Back to comments',
+    'title' => "Commento di {actorDisplayName} su {episodeTitle}",
+    'back_to_comments' => 'Torna ai commenti',
     'form' => [
-        'episode_message_placeholder' => 'Write a comment…',
-        'reply_to_placeholder' => 'Reply to @{actorUsername}',
-        'submit' => 'Send',
-        'submit_reply' => 'Reply',
+        'episode_message_placeholder' => 'Scrivi un commento…',
+        'reply_to_placeholder' => 'Rispondi a @{actorUsername}',
+        'submit' => 'Invia',
+        'submit_reply' => 'Rispondi',
     ],
     'likes' => '{numberOfLikes, plural,
         one {# like}
         other {# likes}
     }',
     'replies' => '{numberOfReplies, plural,
-        one {# reply}
-        other {# replies}
+        one {# like}
+        other {# likes}
     }',
-    'like' => 'Like',
-    'reply' => 'Reply',
-    'view_replies' => 'View replies ({numberOfReplies})',
-    'block_actor' => 'Block user @{actorUsername}',
-    'block_domain' => 'Block domain @{actorDomain}',
-    'delete' => 'Delete comment',
+    'like' => 'Mi piace',
+    'reply' => 'Rispondi',
+    'view_replies' => 'Visualizza ({numberOfReplies}) risposte',
+    'block_actor' => 'Blocca utente @{actorUsername}',
+    'block_domain' => 'Blocca dominio @{actorDomain}',
+    'delete' => 'Cancella commento',
 ];
diff --git a/app/Language/it/Common.php b/app/Language/it/Common.php
index 1258afcc19..249364d3b1 100644
--- a/app/Language/it/Common.php
+++ b/app/Language/it/Common.php
@@ -9,22 +9,22 @@ declare(strict_types=1);
  */
 
 return [
-    'yes' => 'Yes',
+    'yes' => 'Si',
     'no' => 'No',
-    'cancel' => 'Cancel',
-    'optional' => 'Optional',
-    'close' => 'Close',
+    'cancel' => 'Annulla',
+    'optional' => 'Facoltativo',
+    'close' => 'Chiudi',
     'home' => 'Home',
-    'explicit' => 'Explicit',
+    'explicit' => 'Esplicito',
     'powered_by' => 'Powered by {castopod}',
-    'go_back' => 'Go back',
+    'go_back' => 'Torna indietro',
     'play_episode_button' => [
-        'play' => 'Play',
-        'playing' => 'Playing',
+        'play' => 'Riproduci',
+        'playing' => 'In riproduzione',
     ],
-    'read_more' => 'Read more',
-    'read_less' => 'Read less',
-    'see_more' => 'See more',
-    'see_less' => 'See less',
-    'legal_notice' => 'Legal notice',
+    'read_more' => 'Continua a leggere',
+    'read_less' => 'Leggere meno',
+    'see_more' => 'Mostra altro',
+    'see_less' => 'Mostra meno',
+    'legal_notice' => 'Note legali',
 ];
diff --git a/app/Language/it/Episode.php b/app/Language/it/Episode.php
index ebe39336fc..c9e964451e 100644
--- a/app/Language/it/Episode.php
+++ b/app/Language/it/Episode.php
@@ -9,25 +9,25 @@ declare(strict_types=1);
  */
 
 return [
-    'season' => 'Season {seasonNumber}',
+    'season' => 'Stagione {seasonNumber}',
     'season_abbr' => 'S{seasonNumber}',
-    'number' => 'Episode {episodeNumber}',
+    'number' => 'Episodio {episodeNumber}',
     'number_abbr' => 'Ep. {episodeNumber}',
-    'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
+    'season_episode' => 'Stagione {seasonNumber} episodio {episodeNumber}',
     'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
     'persons' => '{personsCount, plural,
         one {# person}
         other {# persons}
     }',
-    'persons_list' => 'Persons',
-    'back_to_episodes' => 'Back to episodes of {podcast}',
-    'comments' => 'Comments',
-    'activity' => 'Activity',
-    'description' => 'Episode description',
+    'persons_list' => 'Persone',
+    'back_to_episodes' => 'Torna agli episodi di {podcast}',
+    'comments' => 'Commenti',
+    'activity' => 'Attività',
+    'description' => 'Descrizione dell\'episodio',
     'number_of_comments' => '{numberOfComments, plural,
         one {# comment}
         other {# comments}
     }',
-    'all_podcast_episodes' => 'All podcast episodes',
-    'back_to_podcast' => 'Go back to podcast',
+    'all_podcast_episodes' => 'Tutti gli episodi del podcast',
+    'back_to_podcast' => 'Torna a podcast',
 ];
diff --git a/app/Language/it/Fediverse.php b/app/Language/it/Fediverse.php
index 32f54c074f..0ede22c09c 100644
--- a/app/Language/it/Fediverse.php
+++ b/app/Language/it/Fediverse.php
@@ -10,28 +10,28 @@ declare(strict_types=1);
 
 return [
     'your_handle' => 'Your handle',
-    'your_handle_hint' => 'Enter the @username@domain you want to act from.',
+    'your_handle_hint' => 'Inserisci @username@domain da cui vuoi interagire.',
     'follow' => [
-        'label' => 'Follow',
-        'title' => 'Follow {actorDisplayName}',
-        'subtitle' => 'You are going to follow:',
-        'accountNotFound' => 'The account could not be found.',
-        'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
-        'submit' => 'Proceed to follow',
+        'label' => 'Segui',
+        'title' => 'Segui {actorDisplayName}',
+        'subtitle' => 'Stai per seguire:',
+        'accountNotFound' => 'Impossibile trovare l\'account.',
+        'remoteFollowNotAllowed' => 'Sembra che il server del account non permetta il segui da remoto…',
+        'submit' => 'Procedi a seguire',
     ],
     'favourite' => [
-        'title' => "Favourite {actorDisplayName}'s post",
-        'subtitle' => 'You are going to favourite:',
-        'submit' => 'Proceed to favourite',
+        'title' => "Post preferito di {actorDisplayName}",
+        'subtitle' => 'Stai per aggiungere ai preferiti:',
+        'submit' => 'Procedi ad aggiungere ai preferiti',
     ],
     'reblog' => [
-        'title' => "Share {actorDisplayName}'s post",
-        'subtitle' => 'You are going to share:',
-        'submit' => 'Proceed to share',
+        'title' => "Condividi il post di {actorDisplayName}",
+        'subtitle' => 'Stai per condividere:',
+        'submit' => 'Procedere alla condivisione',
     ],
     'reply' => [
-        'title' => "Reply to {actorDisplayName}'s post",
-        'subtitle' => 'You are going to reply to:',
-        'submit' => 'Proceed to reply',
+        'title' => "Rispondi al post di {actorDisplayName}",
+        'subtitle' => 'Stai per rispondere a:',
+        'submit' => 'Procedi a rispondere',
     ],
 ];
diff --git a/app/Language/it/Home.php b/app/Language/it/Home.php
index 1518239bd9..7b2569bede 100644
--- a/app/Language/it/Home.php
+++ b/app/Language/it/Home.php
@@ -9,12 +9,12 @@ declare(strict_types=1);
  */
 
 return [
-    'all_podcasts' => 'All podcasts',
-    'sort_by' => 'Sort by',
+    'all_podcasts' => 'Tutti i podcast',
+    'sort_by' => 'Ordina per',
     'sort_options' => [
-        'activity' => 'Recent activity',
-        'created_desc' => 'Newest first',
-        'created_asc' => 'Oldest first',
+        'activity' => 'Attività recenti',
+        'created_desc' => 'Più recente prima',
+        'created_asc' => 'Più vecchio prima',
     ],
-    'no_podcast' => 'No podcast found',
+    'no_podcast' => 'Nessun podcast trovato',
 ];
diff --git a/app/Language/it/Page.php b/app/Language/it/Page.php
index 7cd606694e..a0109c856c 100644
--- a/app/Language/it/Page.php
+++ b/app/Language/it/Page.php
@@ -9,9 +9,9 @@ declare(strict_types=1);
  */
 
 return [
-    'back_to_home' => 'Back to home',
+    'back_to_home' => 'Torna alla home',
     'map' => [
-        'title' => 'Map',
-        'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.',
+        'title' => 'Mappa',
+        'description' => 'Scopri gli episodi di podcast su {siteName} che si trovano su una mappa! Viaggia attraverso la mappa e ascolta episodi che parlano di luoghi specifici.',
     ],
 ];
diff --git a/app/Language/it/Podcast.php b/app/Language/it/Podcast.php
index 9b1e749aa1..eafcec6e48 100644
--- a/app/Language/it/Podcast.php
+++ b/app/Language/it/Podcast.php
@@ -9,14 +9,14 @@ declare(strict_types=1);
  */
 
 return [
-    'feed' => 'RSS Podcast feed',
-    'season' => 'Season {seasonNumber}',
-    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'feed' => 'Feed RSS del podcast',
+    'season' => 'Stagione {seasonNumber}',
+    'list_of_episodes_year' => '{year} episodi ({episodeCount})',
     'list_of_episodes_season' =>
-        'Season {seasonNumber} episodes ({episodeCount})',
-    'no_episode' => 'No episode found!',
-    'follow' => 'Follow',
-    'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
+        'Stagione {seasonNumber} episodi ({episodeCount})',
+    'no_episode' => 'Nessun episodio trovato!',
+    'follow' => 'Segui',
+    'followTitle' => 'Segui {actorDisplayName} sul fediverso!',
     'followers' => '{numberOfFollowers, plural,
         one {# follower}
         other {# followers}
@@ -25,10 +25,10 @@ return [
         one {# post}
         other {# posts}
     }',
-    'activity' => 'Activity',
-    'episodes' => 'Episodes',
-    'episodes_title' => 'Episodes of {podcastTitle}',
-    'about' => 'About',
+    'activity' => 'Attività',
+    'episodes' => 'Episodi',
+    'episodes_title' => 'Episodi di {podcastTitle}',
+    'about' => 'Informazioni',
     'stats' => [
         'title' => 'Stats',
         'number_of_seasons' => '{0, plural,
@@ -39,15 +39,15 @@ return [
             one {# episode}
             other {# episodes}
         }',
-        'first_published_at' => 'First episode published on {0, date, medium}',
+        'first_published_at' => 'Primo episodio pubblicato il {0, date, medium}',
     ],
     'sponsor' => 'Sponsor',
-    'funding_links' => 'Funding links for {podcastTitle}',
-    'find_on' => 'Find {podcastTitle} on',
-    'listen_on' => 'Listen on',
+    'funding_links' => 'Link di finanziamento per {podcastTitle}',
+    'find_on' => 'Trova {podcastTitle} su',
+    'listen_on' => 'Ascolta su',
     'persons' => '{personsCount, plural,
         one {# person}
         other {# persons}
     }',
-    'persons_list' => 'Persons',
+    'persons_list' => 'Persone',
 ];
diff --git a/app/Language/it/Post.php b/app/Language/it/Post.php
index 58d1cf8002..cb9a6b6203 100644
--- a/app/Language/it/Post.php
+++ b/app/Language/it/Post.php
@@ -9,32 +9,32 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => "{actorDisplayName}'s post",
-    'back_to_actor_posts' => 'Back to {actor} posts',
-    'actor_shared' => '{actor} shared',
-    'reply_to' => 'Reply to @{actorUsername}',
+    'title' => "Post di {actorDisplayName}",
+    'back_to_actor_posts' => 'Torna ai post di {actor}',
+    'actor_shared' => '{actor} ha condiviso',
+    'reply_to' => 'Rispondi a @{actorUsername}',
     'form' => [
-        'message_placeholder' => 'Write a message…',
-        'episode_message_placeholder' => 'Write a message for the episode…',
-        'episode_url_placeholder' => 'Episode URL',
-        'reply_to_placeholder' => 'Reply to @{actorUsername}',
-        'submit' => 'Send',
-        'submit_reply' => 'Reply',
+        'message_placeholder' => 'Scrivi un messaggio…',
+        'episode_message_placeholder' => 'Scrivi un messaggio per l\'episodio…',
+        'episode_url_placeholder' => 'Url dell\'episodio',
+        'reply_to_placeholder' => 'Rispondi a @{actorUsername}',
+        'submit' => 'Invia',
+        'submit_reply' => 'Rispondi',
     ],
     'favourites' => '{numberOfFavourites, plural,
-        one {# favourite}
-        other {# favourites}
+        one {# preferito}
+        other {# preferiti}
     }',
     'reblogs' => '{numberOfReblogs, plural,
-        one {# share}
-        other {# shares}
+        one {# condivisione}
+        other {# condivisioni}
     }',
     'replies' => '{numberOfReplies, plural,
-        one {# reply}
-        other {# replies}
+        one {# risposta}
+        other {# risposte}
     }',
-    'expand' => 'Expand post',
-    'block_actor' => 'Block user @{actorUsername}',
-    'block_domain' => 'Block domain @{actorDomain}',
-    'delete' => 'Delete post',
+    'expand' => 'Espandi post',
+    'block_actor' => 'Blocca utente @{actorUsername}',
+    'block_domain' => 'Blocca dominio @{actorDomain}',
+    'delete' => 'Cancella post',
 ];
diff --git a/docs/src/ar/getting-started/docker.md b/docs/src/ar/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/ar/getting-started/docker.md
+++ b/docs/src/ar/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/ar/getting-started/install.md b/docs/src/ar/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/ar/getting-started/install.md
+++ b/docs/src/ar/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/ar/index.md b/docs/src/ar/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/ar/index.md
+++ b/docs/src/ar/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/br/getting-started/docker.md b/docs/src/br/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/br/getting-started/docker.md
+++ b/docs/src/br/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/br/getting-started/install.md b/docs/src/br/getting-started/install.md
index 916751722d..dac8517e91 100644
--- a/docs/src/br/getting-started/install.md
+++ b/docs/src/br/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/br/index.md b/docs/src/br/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/br/index.md
+++ b/docs/src/br/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/ca/getting-started/docker.md b/docs/src/ca/getting-started/docker.md
index eb31d5d43f..7b967d92a0 100644
--- a/docs/src/ca/getting-started/docker.md
+++ b/docs/src/ca/getting-started/docker.md
@@ -19,8 +19,8 @@ una base de dades Redis com a gestor de memòria cau.
 ## Etiquetes compatibles
 
 - `develop` [no-estable], darrera versió de la branca de desenvolupament
-
-// més etiquetes per venir!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Exemple d'ús
 
@@ -33,16 +33,16 @@ una base de dades Redis com a gestor de memòria cau.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
         environment:
           MYSQL_DATABASE: castopod
           MYSQL_USER: castopod
-          MYSQL_PASSWORD: canvieu-me
-          CP_BASEURL: "http://castopod.exemple.com"
-          CP_ANALYTICS_SALT: canvieu-me
+          MYSQL_PASSWORD: changeme
+          CP_BASEURL: "http://castopod.example.com"
+          CP_ANALYTICS_SALT: changeme
           CP_CACHE_HANDLER: redis
           CP_REDIS_HOST: redis
         networks:
@@ -51,7 +51,7 @@ una base de dades Redis com a gestor de memòria cau.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -69,10 +69,10 @@ una base de dades Redis com a gestor de memòria cau.
         volumes:
           - castopod-db:/var/lib/mysql
         environment:
-          MYSQL_ROOT_PASSWORD: canvieu-me
+          MYSQL_ROOT_PASSWORD: changeme
           MYSQL_DATABASE: castopod
           MYSQL_USER: castopod
-          MYSQL_PASSWORD: canvieu-me
+          MYSQL_PASSWORD: changeme
         restart: unless-stopped
 
       redis:
@@ -119,26 +119,32 @@ una base de dades Redis com a gestor de memòria cau.
 
 - **castopod/app**
 
-  | Nom de la variable         | Tipus (`default`)                  |
-  | -------------------------- | ---------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)               |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(buit)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)             |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)              |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)               |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)              |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)          |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)              |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)          |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                  |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` o `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)            |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                   |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                   |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                      |
+  | Nom de la variable           | Tipus (`default`)       | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Nom de la variable    | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Nom de la variable    | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/ca/getting-started/install.md b/docs/src/ca/getting-started/install.md
index f888627ccc..86a47cfd5c 100644
--- a/docs/src/ca/getting-started/install.md
+++ b/docs/src/ca/getting-started/install.md
@@ -130,22 +130,51 @@ o superior. Cal instal·lar les següents extensions:
 
 ::: info Nota
 
-L'script d'instal·lació escriu un fitxer `.env` a l'arrel del paquet. Si no
-podeu fer còrrer l'assistent web d'instal·lació, podeu
-[crear i actualitzar el fitxer `.env` manualment](#alternative-manual-configuration).
+L'script d'instal·lació escriu un fitxer `.env` a l'arrel del paquet. If you
+cannot go through the install wizard, you can create and edit the `.env` file
+manually based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Paquets de la comunitat
 
-Si no us voleu molestar amb la instal·lació manual de Castopod, podeu utilitzar
-un dels paquets creats i mantinguts per la comunitat de codi obert.
+If you don't want to bother with installing Castopod manually, you may use one
+of the packages created and maintained by the open-source community.
 
-### Instal·lar amb YunoHost
+### Install with YunoHost
 
-[YunoHost](https://yunohost.org/) és una distribució basada en Debian GNU/Linux
-formada per paquets de programari lliure i de codi obert. Gestiona les
-dificultats de l'auto-allotjament per tu.
+[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
+made up of free and open-source software packages. It manages the hardships of
+self-hosting for you.
 
 <div class="flex flex-wrap items-center gap-4">
 
diff --git a/docs/src/ca/index.md b/docs/src/ca/index.md
index d9f4880791..a2df1fd639 100644
--- a/docs/src/ca/index.md
+++ b/docs/src/ca/index.md
@@ -51,6 +51,7 @@ l'utilitzen els podcasters d'arreu del món!
   - 🔗 &nbsp;Enllaços de finançament
   - 📲 &nbsp;Anuncis per escoltar-fent-clic
   - 🤝 &nbsp;Integració amb value4value i WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publiqueu els vostres episodis a tot arreu amb RSS:
   - 📱 &nbsp;A tots els directoris i aplicacions: Podcast Index, Apple Podcasts,
     Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/de/getting-started/docker.md b/docs/src/de/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/de/getting-started/docker.md
+++ b/docs/src/de/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/de/getting-started/install.md b/docs/src/de/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/de/getting-started/install.md
+++ b/docs/src/de/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/de/index.md b/docs/src/de/index.md
index d9f94b6f46..122978841e 100644
--- a/docs/src/de/index.md
+++ b/docs/src/de/index.md
@@ -49,6 +49,7 @@ Podcastenden auf &nbsp;der&nbsp; ganzen Welt verwendet!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/el/getting-started/docker.md b/docs/src/el/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/el/getting-started/docker.md
+++ b/docs/src/el/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/el/getting-started/install.md b/docs/src/el/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/el/getting-started/install.md
+++ b/docs/src/el/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/el/index.md b/docs/src/el/index.md
index bde5278c66..e18571fef8 100644
--- a/docs/src/el/index.md
+++ b/docs/src/el/index.md
@@ -50,6 +50,7 @@ sidebarDepth: 2
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/es/getting-started/docker.md b/docs/src/es/getting-started/docker.md
index f1e75bcc33..2fb21b1bb7 100644
--- a/docs/src/es/getting-started/docker.md
+++ b/docs/src/es/getting-started/docker.md
@@ -19,8 +19,8 @@ También se puede añadir una base de datos Redis como gestor de caché.
 ## Etiquetas admitidas
 
 - `develop` [unstable], última rama de desarrollo construida
-
-// más etiquetas por venir!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Ejemplo de uso
 
@@ -33,7 +33,7 @@ También se puede añadir una base de datos Redis como gestor de caché.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ También se puede añadir una base de datos Redis como gestor de caché.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -119,26 +119,32 @@ También se puede añadir una base de datos Redis como gestor de caché.
 
 - **castopod/app**
 
-  | Nombre de la Variable      | Tipo (`predeterminado`)            |
-  | -------------------------- | ---------------------------------- |
-  | **`CP_URLBASE`**           | string (`undefined`)               |
-  | **`CP_MEDIA_URLBASE`**     | ?string (`(vacío)`)                |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)             |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)              |
-  | **`CP_ANALYTICS_SALT`**    | string (`indefinido`)              |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)              |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)          |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)              |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)          |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                  |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` o `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)            |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                   |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                   |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                      |
+  | Nombre de la Variable        | Tipo (`predeterminado`) | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_URLBASE`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_URLBASE`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Nombre de la variable | Tipo (`predeterminado`) |
-  | --------------------- | ----------------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`)       |
+  | Nombre de la variable | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/es/getting-started/install.md b/docs/src/es/getting-started/install.md
index bbce96436b..d3fd3b03c5 100644
--- a/docs/src/es/getting-started/install.md
+++ b/docs/src/es/getting-started/install.md
@@ -133,22 +133,51 @@ extensiones:
 
 ::: info Nota
 
-El script de instalación crea un archivo `.env` en la raíz de castopod. Si no
-puedes usar el asistente web de instalación, puedes
-[crear y configurar manualmente el archivo `.env`](#alternative-manual-configuration).
+El script de instalación crea un archivo `.env` en la raíz de castopod. If you
+cannot go through the install wizard, you can create and edit the `.env` file
+manually based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Paquetes de la comunidad
 
-Si no quieres molestarte en instalar Castopod manualmente, puedes utilizar uno
-de los paquetes creados y mantenidos por la comunidad de código abierto.
+If you don't want to bother with installing Castopod manually, you may use one
+of the packages created and maintained by the open-source community.
 
-### Instalar con YunoHost
+### Install with YunoHost
 
-[YunoHost](https://yunohost.org/) es una distribución GNU/Linux basada en Debian
-compuesta por paquetes de software libre y de código abierto. Te ayuda a
-gestionar las partes difíciles de autoalojamiento.
+[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
+made up of free and open-source software packages. It manages the hardships of
+self-hosting for you.
 
 <div class="flex flex-wrap items-center gap-4">
 
diff --git a/docs/src/es/index.md b/docs/src/es/index.md
index b077ddb79a..7475549bb4 100644
--- a/docs/src/es/index.md
+++ b/docs/src/es/index.md
@@ -54,6 +54,7 @@ utilizado por podcasters alrededor del mundo.
   - 📲 &nbsp;Anuncios publicitarios del tipo click-para-escuchar
   - 🤝 &nbsp;value4value / WebMonetization (criptomonedas para creadores de
     contenido).
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publica tus episodios en todas partes con RSS:
   - 📱 &nbsp;En todos los directorios y aplicaciones: Podcast Index, Apple
     Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/fa/getting-started/docker.md b/docs/src/fa/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/fa/getting-started/docker.md
+++ b/docs/src/fa/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/fa/getting-started/install.md b/docs/src/fa/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/fa/getting-started/install.md
+++ b/docs/src/fa/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/fa/index.md b/docs/src/fa/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/fa/index.md
+++ b/docs/src/fa/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/fr/getting-started/docker.md b/docs/src/fr/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/fr/getting-started/docker.md
+++ b/docs/src/fr/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/fr/getting-started/install.md b/docs/src/fr/getting-started/install.md
index d9f59c091e..f3e19c3e71 100644
--- a/docs/src/fr/getting-started/install.md
+++ b/docs/src/fr/getting-started/install.md
@@ -132,22 +132,51 @@ installées :
 
 ::: info Note
 
-Le script d'installation crée un fichier `.env` à la racine du paquet. Si vous
-ne pouvez pas passer par l'assistant d'installation, vous pouvez
-[créer et mettre à jour le fichier `.env` manuellement](#alternative-manual-configuration).
+Le script d'installation crée un fichier `.env` à la racine du paquet. If you
+cannot go through the install wizard, you can create and edit the `.env` file
+manually based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Paquets fournis par la communauté
 
-Si vous ne voulez pas vous soucier d'installer Castopod manuellement, vous
-pouvez utiliser un des paquets créés et maintenus par la communauté open-source.
+If you don't want to bother with installing Castopod manually, you may use one
+of the packages created and maintained by the open-source community.
 
-### Installer avec YunoHost
+### Install with YunoHost
 
-[YunoHost](https://yunohost.org/) est une distribution basée sur Debian
-GNU/Linux composée de paquets logiciels libres et open-source. Il gère les
-difficultés de l'auto-hébergement pour vous.
+[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
+made up of free and open-source software packages. It manages the hardships of
+self-hosting for you.
 
 <div class="flex flex-wrap items-center gap-4">
 
diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md
index a596d878d1..73e2a1ae0e 100644
--- a/docs/src/fr/index.md
+++ b/docs/src/fr/index.md
@@ -51,6 +51,7 @@ et est utilisé par des podcasters autour partout dans le monde&nbsp;!
   - 🔗 &nbsp;Liens de financement
   - 📲 &nbsp;publicité “listen-to-click”
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡&nbsp;Publiez vos épisodes partout avec RSS :
   - 📱 &nbsp;Sur tous les index et toutes les applications : Podcast Index,
     Podcasts Apple, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend…
diff --git a/docs/src/gd/getting-started/docker.md b/docs/src/gd/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/gd/getting-started/docker.md
+++ b/docs/src/gd/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/gd/getting-started/install.md b/docs/src/gd/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/gd/getting-started/install.md
+++ b/docs/src/gd/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/gd/index.md
+++ b/docs/src/gd/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/gl/getting-started/docker.md b/docs/src/gl/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/gl/getting-started/docker.md
+++ b/docs/src/gl/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/gl/getting-started/install.md b/docs/src/gl/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/gl/getting-started/install.md
+++ b/docs/src/gl/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/gl/index.md b/docs/src/gl/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/gl/index.md
+++ b/docs/src/gl/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/id/getting-started/docker.md b/docs/src/id/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/id/getting-started/docker.md
+++ b/docs/src/id/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/id/getting-started/install.md b/docs/src/id/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/id/getting-started/install.md
+++ b/docs/src/id/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/id/index.md b/docs/src/id/index.md
index c78d9b253e..234e051f14 100644
--- a/docs/src/id/index.md
+++ b/docs/src/id/index.md
@@ -50,6 +50,7 @@ digunakan oleh pembuat siniar di seluruh dunia!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Terbitkan episode-episode Anda dimana pun dengan RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/it/getting-started/docker.md b/docs/src/it/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/it/getting-started/docker.md
+++ b/docs/src/it/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/it/getting-started/install.md b/docs/src/it/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/it/getting-started/install.md
+++ b/docs/src/it/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/it/index.md b/docs/src/it/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/it/index.md
+++ b/docs/src/it/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/nl/getting-started/docker.md b/docs/src/nl/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/nl/getting-started/docker.md
+++ b/docs/src/nl/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/nl/getting-started/install.md
+++ b/docs/src/nl/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/nl/index.md b/docs/src/nl/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/nl/index.md
+++ b/docs/src/nl/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/nn-NO/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/nn-NO/getting-started/docker.md
+++ b/docs/src/nn-NO/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md
index fc838a24a7..fe65ac104f 100644
--- a/docs/src/nn-NO/getting-started/install.md
+++ b/docs/src/nn-NO/getting-started/install.md
@@ -126,17 +126,46 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Pakker frå brukarsamfunnet
 
 If you don't want to bother with installing Castopod manually, you may use one
 of the packages created and maintained by the open-source community.
 
-### Installer med Yunohost
+### Install with YunoHost
 
 [YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
 made up of free and open-source software packages. It manages the hardships of
diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md
index de7ace6ecd..38881ecd4b 100644
--- a/docs/src/nn-NO/index.md
+++ b/docs/src/nn-NO/index.md
@@ -52,6 +52,7 @@ over heile verda&nbsp;bruker&nbsp;det!
   - 🔗 &nbsp;Donasjonslenker
   - 📲 &nbsp;lytt-for-å-klikka-annonsar
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Kringkast episodane dine kvar som helst med RSS:
   - 📱 &nbsp;På alle indeksar og appar: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/oc/getting-started/docker.md b/docs/src/oc/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/oc/getting-started/docker.md
+++ b/docs/src/oc/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/oc/getting-started/install.md
+++ b/docs/src/oc/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/oc/index.md b/docs/src/oc/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/oc/index.md
+++ b/docs/src/oc/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/pl/getting-started/docker.md b/docs/src/pl/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/pl/getting-started/docker.md
+++ b/docs/src/pl/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/pl/getting-started/install.md
+++ b/docs/src/pl/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/pl/index.md b/docs/src/pl/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/pl/index.md
+++ b/docs/src/pl/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/pt-BR/getting-started/docker.md b/docs/src/pt-BR/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/pt-BR/getting-started/docker.md
+++ b/docs/src/pt-BR/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md
index 117a78e4ce..41c0a4a289 100644
--- a/docs/src/pt-BR/getting-started/install.md
+++ b/docs/src/pt-BR/getting-started/install.md
@@ -128,17 +128,46 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Pacotes comunitários
 
 If you don't want to bother with installing Castopod manually, you may use one
 of the packages created and maintained by the open-source community.
 
-### Instalar com YunoHost
+### Install with YunoHost
 
 [YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
 made up of free and open-source software packages. It manages the hardships of
diff --git a/docs/src/pt-BR/index.md b/docs/src/pt-BR/index.md
index 2b2b0a1f3a..6152ea6919 100644
--- a/docs/src/pt-BR/index.md
+++ b/docs/src/pt-BR/index.md
@@ -50,6 +50,7 @@ podcasters em todo o mundo!
   - 🔗 &nbsp;Links de financiamento
   - 📲 &nbsp;anúncios clique-para-ouvir
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publique seus episódios em qualquer lugar com RSS:
   - 📱 &nbsp;Em todos os agregadores e aplicativos: Podcast Index, Apple
     Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/pt/getting-started/docker.md b/docs/src/pt/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/pt/getting-started/docker.md
+++ b/docs/src/pt/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/pt/getting-started/install.md
+++ b/docs/src/pt/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/pt/index.md b/docs/src/pt/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/pt/index.md
+++ b/docs/src/pt/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/ru/getting-started/docker.md b/docs/src/ru/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/ru/getting-started/docker.md
+++ b/docs/src/ru/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/ru/getting-started/install.md
+++ b/docs/src/ru/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/ru/index.md b/docs/src/ru/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/ru/index.md
+++ b/docs/src/ru/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/sk/getting-started/docker.md b/docs/src/sk/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/sk/getting-started/docker.md
+++ b/docs/src/sk/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/sk/getting-started/install.md
+++ b/docs/src/sk/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/sk/index.md b/docs/src/sk/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/sk/index.md
+++ b/docs/src/sk/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/sv/getting-started/docker.md b/docs/src/sv/getting-started/docker.md
index 2a35a8bb2b..ededc58251 100644
--- a/docs/src/sv/getting-started/docker.md
+++ b/docs/src/sv/getting-started/docker.md
@@ -19,8 +19,8 @@ can be added as a cache handler.
 ## Supported tags
 
 - `develop` [unstable], latest development branch build
-
-// more tags to come!
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
 
 ## Example usage
 
@@ -33,7 +33,7 @@ can be added as a cache handler.
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -51,7 +51,7 @@ can be added as a cache handler.
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -117,26 +117,32 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name              | Type (`default`)                    |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | Variable name                | Type (`default`)        | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` or `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` or `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | Variable name         | Type (`default`)  |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | Variable name         | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md
index 1a366f4e01..3d73187d08 100644
--- a/docs/src/sv/getting-started/install.md
+++ b/docs/src/sv/getting-started/install.md
@@ -126,11 +126,40 @@ want to generate Video Clips. The following extensions must be installed:
 ::: info Note
 
 The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can
-[create and update the `.env` file manually](#alternative-manual-configuration).
+through the install wizard, you can create and edit the `.env` file manually
+based on the `.env.example` file.
 
 :::
 
+### Email/SMTP setup
+
+Email configuration is required for some features to work properly (eg.
+retrieving your forgotten password, sending instructions to premium subscribers,
+…)
+
+You may add your email configuration in your instance's `.env` like so:
+
+```ini
+# […]
+
+email.fromEmail="your_email_address"
+email.SMTPHost="your_smtp_host"
+email.SMTPUser="your_smtp_user"
+email.SMTPPass="your_smtp_password"
+```
+
+#### Email config options
+
+| Variable name    | Type                 | Default      |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/sv/index.md b/docs/src/sv/index.md
index 86670d19ee..d89daccba1 100644
--- a/docs/src/sv/index.md
+++ b/docs/src/sv/index.md
@@ -49,6 +49,7 @@ podcasters around&nbsp;the&nbsp;world!
   - 🔗 &nbsp;Funding links
   - 📲 &nbsp;listen-to-click ads
   - 🤝 &nbsp;value4value / WebMonetization
+  - 💎 &nbsp;Premium podcasts
 - 📡 &nbsp;Publish your episodes everywhere with RSS:
   - 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
     Google Podcasts, Deezer, Podcast Addict, Podfriend, …
diff --git a/docs/src/zh-Hans/getting-started/docker.md b/docs/src/zh-Hans/getting-started/docker.md
index 962401a49b..9e9135a7fc 100644
--- a/docs/src/zh-Hans/getting-started/docker.md
+++ b/docs/src/zh-Hans/getting-started/docker.md
@@ -18,8 +18,8 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
 ## 目前支持的标签
 
 - `develop` [unstable], 最新开发分支版本
-
-更多标签即将到来!
+- `beta` [stable],最新的 beta 版本构建
+- `1.0.0-beta.x` [stable],特定 beta 版本构建 (自 `1.0.0-beta.22` 起)
 
 ## 用法示例:
 
@@ -32,7 +32,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
 
     services:
       app:
-        image: castopod/app:develop
+        image: castopod/app:beta
         container_name: "castopod-app"
         volumes:
           - castopod-media:/opt/castopod/public/media
@@ -50,7 +50,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
         restart: unless-stopped
 
       web-server:
-        image: castopod/web-server:develop
+        image: castopod/web-server:beta
         container_name: "castopod-web-server"
         volumes:
           - castopod-media:/var/www/html/media
@@ -116,26 +116,32 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
 
 - **castopod/app**
 
-  | 变量名称                   | 类型 (`默认值`)                     |
-  | -------------------------- | ----------------------------------- |
-  | **`CP_BASEURL`**           | string (`undefined`)                |
-  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
-  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
-  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
-  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
-  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
-  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
-  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
-  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
-  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
-  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
-  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
-  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
-  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
-  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+  | 变量名称                     | 类型 (`默认值`)         | Default          |
+  | ---------------------------- | ----------------------- | ---------------- |
+  | **`CP_BASEURL`**             | string                  | `undefined`      |
+  | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
+  | **`CP_ADMIN_GATEWAY`**       | ?string                 | `"cp-admin"`     |
+  | **`CP_AUTH_GATEWAY`**        | ?string                 | `"cp-auth"`      |
+  | **`CP_ANALYTICS_SALT`**      | string                  | `undefined`      |
+  | **`CP_DATABASE_HOSTNAME`**   | ?string                 | `"mariadb"`      |
+  | **`CP_DATABASE_NAME`**       | ?string                 | `MYSQL_DATABASE` |
+  | **`CP_DATABASE_USERNAME`**   | ?string                 | `MYSQL_USER`     |
+  | **`CP_DATABASE_PASSWORD`**   | ?string                 | `MYSQL_PASSWORD` |
+  | **`CP_DATABASE_PREFIX`**     | ?string                 | `"cp_"`          |
+  | **`CP_CACHE_HANDLER`**       | [`"file"` 或 `"redis"`] | `"file"`         |
+  | **`CP_REDIS_HOST`**          | ?string                 | `"localhost"`    |
+  | **`CP_REDIS_PASSWORD`**      | ?string                 | `null`           |
+  | **`CP_REDIS_PORT`**          | ?number                 | `6379`           |
+  | **`CP_REDIS_DATABASE`**      | ?number                 | `0`              |
+  | **`CP_EMAIL_SMTP_HOST`**     | ?string                 | `undefined`      |
+  | **`CP_EMAIL_FROM`**          | ?string                 | `undefined`      |
+  | **`CP_EMAIL_SMTP_USERNAME`** | ?string                 | `"localhost"`    |
+  | **`CP_EMAIL_SMTP_PASSWORD`** | ?string                 | `null`           |
+  | **`CP_EMAIL_SMTP_PORT`**     | ?number                 | `25`             |
+  | **`CP_EMAIL_SMTP_CRYPTO`**   | [`"tls"` 或 `"ssl"`]    | `"tls"`          |
 
 - **castopod/web-server**
 
-  | 变量名称              | 类型 (`默认值`)   |
-  | --------------------- | ----------------- |
-  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
+  | 变量名称              | Type    | Default |
+  | --------------------- | ------- | ------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md
index 6c94a84db2..9a4ead833e 100644
--- a/docs/src/zh-Hans/getting-started/install.md
+++ b/docs/src/zh-Hans/getting-started/install.md
@@ -118,18 +118,45 @@ Castopod 仅适用于受支持的 MySQL 5.7 或更高版本的兼容数据库。
 
 ::: 注意
 
-安装脚本将会在根目录中创建一个 `.env` 文件并写入数据。 如果无法执行安装向导,可
-以 [手动创建并更新 `.env` 文件](#alternative-manual-configuration)。
+安装脚本将会在根目录中创建一个 `.env` 文件并写入数据。 如果你不能执行安装向导,
+那么可以基于 `.env.example` 文件手动创建和编辑 `.env` 文件。
 
 :::
 
+### 邮箱/SMTP 设置
+
+某些功能需要电子邮件配置才能正常工作(例如: 找回密码,向高级订阅者发送说明, …)
+
+你可以在实例的 `.env` 中添加你的电子邮件配置,如下所示:
+
+```ini
+# […]
+
+email.fromEmail="你的邮件地址"
+email.SMTPHost="你的邮件主机"
+email.SMTPUser="你的邮件用户名"
+email.SMTPPass="你的邮件密码"
+```
+
+#### 电子邮件配置选项
+
+| 变量名称         | 类型                 | 默认         |
+| ---------------- | -------------------- | ------------ |
+| **`fromEmail`**  | string               | `undefined`  |
+| **`fromName`**   | string               | `"Castopod"` |
+| **`SMTPHost`**   | string               | `undefined`  |
+| **`SMTPUser`**   | string               | `undefined`  |
+| **`SMTPPass`**   | string               | `undefined`  |
+| **`SMTPPort`**   | number               | `25`         |
+| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
+
 ## 社区套餐
 
-如果你不想手动安装 Castopod,可以使用开源社区创建和维护的软件包。
+如果你不想手动安装 Castopod,可以使用一个 由开源社区创建和维护的软件包。
 
 ### 使用 YunoHost 安装
 
-[Yunohost](https://yunohost.org/) 是一个基于 Debian GNU/Linux 的发行版,由自由和
+[YunoHost](https://yunohost.org/) 是一个基于 Debian GNU/Linux 的发行版,由免费和
 开源软件包组成。 它可以为你解决自托管的困难。
 
 <div class="flex flex-wrap items-center gap-4">
diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md
index 4dc24090b6..20a0b1a058 100644
--- a/docs/src/zh-Hans/index.md
+++ b/docs/src/zh-Hans/index.md
@@ -46,6 +46,7 @@ Castopod 虽然目前处于 **测试阶段** ,但相当稳定,已经被世
   - 🔗 &nbsp;资金链接
   - 📲 &nbsp;点击收听广告
   - 🤝 &nbsp;value4value / 网络货币化
+  - 💎 &nbsp;高级版播客
 - 📡 &nbsp;使用 RSS 将你的剧集发布到任何地方
   - 📱 &nbsp;支持众多索引和应用程序:Podcast Index,Apple
     Podcasts,Spotify,Google Podcasts,Deezer,Podcast Addict,Podfriend...
diff --git a/modules/Admin/Language/ar/Breadcrumb.php b/modules/Admin/Language/ar/Breadcrumb.php
index 10bde7d70f..0156d94397 100644
--- a/modules/Admin/Language/ar/Breadcrumb.php
+++ b/modules/Admin/Language/ar/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'الرئيسية',
     'podcasts' => 'بودكاستات',
     'episodes' => 'حلقات',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'مساهمون',
     'pages' => 'صفحات',
     'settings' => 'الإعدادات',
@@ -24,6 +25,7 @@ return [
     'persons' => 'أشخاص',
     'publish' => 'نشر',
     'publish-edit' => 'تعديل المنشور',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'unpublish',
     'delete' => 'احذف',
     'fediverse' => 'الفديفرس',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
     'notifications' => 'الإشعارات',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/ar/Episode.php b/modules/Admin/Language/ar/Episode.php
index 01124e7ecb..99eed5ba82 100644
--- a/modules/Admin/Language/ar/Episode.php
+++ b/modules/Admin/Language/ar/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'تعديل',
     'publish' => 'نشر',
     'publish_edit' => 'تعديل المنشور',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'إلغاء النشر',
     'publish_error' => 'Episode is already published.',
     'publish_edit_error' => 'Episode is already published.',
     'publish_cancel_error' => 'Episode is already published.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'الحلقة غير منشورة.',
     'delete' => 'احذف',
     'go_to_page' => 'الانتقال إلى الصفحة',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/ar/Podcast.php b/modules/Admin/Language/ar/Podcast.php
index 644f3a03c2..bcd6f9dd07 100644
--- a/modules/Admin/Language/ar/Podcast.php
+++ b/modules/Admin/Language/ar/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/ar/PodcastNavigation.php b/modules/Admin/Language/ar/PodcastNavigation.php
index 04ee9a93d2..ad114d1021 100644
--- a/modules/Admin/Language/ar/PodcastNavigation.php
+++ b/modules/Admin/Language/ar/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'المساهمون',
     'contributor-list' => 'كل المساهمين',
     'contributor-add' => 'إضافة مساهم',
diff --git a/modules/Admin/Language/ar/Settings.php b/modules/Admin/Language/ar/Settings.php
index 6cce90a181..6cd61799ca 100644
--- a/modules/Admin/Language/ar/Settings.php
+++ b/modules/Admin/Language/ar/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php
index 8702d4ce9d..c2eb298af4 100644
--- a/modules/Admin/Language/br/Breadcrumb.php
+++ b/modules/Admin/Language/br/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Degemer',
     'podcasts' => 'podkastoù',
     'episodes' => 'rannoù',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'perzhidi, perzhiadezed',
     'pages' => 'pajennoù',
     'settings' => 'arventennoù',
@@ -24,6 +25,7 @@ return [
     'persons' => 'emellerien·ezed',
     'publish' => 'embann',
     'publish-edit' => 'kemmañ an embannadur',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'diembannañ',
     'delete' => 'dilemel',
     'fediverse' => 'kevrebed',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'tennadoù video',
     'embed' => 'lenner enkorfet',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php
index 800e645983..56e1c93dc0 100644
--- a/modules/Admin/Language/br/Episode.php
+++ b/modules/Admin/Language/br/Episode.php
@@ -25,10 +25,14 @@ return [
     'edit' => 'Kemmañ',
     'publish' => 'Embann',
     'publish_edit' => 'Kemmañ an embannadur',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Diembannañ',
     'publish_error' => 'Embannet eo bet ar rann dija.',
     'publish_edit_error' => 'Embannet eo bet ar rann dija.',
     'publish_cancel_error' => 'Embannet eo bet ar rann dija.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'N\'eo ket bet embannet ar rann.',
     'delete' => 'Dilemel',
     'go_to_page' => 'Gwelet ar bajenn',
@@ -111,6 +115,8 @@ return [
             'bonus' => 'Bonuz',
             'bonus_hint' => 'Danvez ouzhpenn ar podkast (da skouer, titouroù diwar-benn kostezioù pe atersadennoù gant an aktourien·ezed), pe bruderezh kroaziet evit ur podkast all',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Kemenn evit ar gerent',
             'hint' => 'Hag ar rann-mañ a zo danvez ha ne zlefe ket gwelet gant bugale?',
@@ -178,6 +184,11 @@ return [
         'message_warning_hint' => 'Ouzhpennañ ur gemennadenn a lakay muioc\'h a dud er jeu, ha diwar se e vo gwelet muioc\'h ho rann.',
         'message_warning_submit' => 'Embann memestra',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Diembann ar rann a zilamo an holl gemennadennoù liammet outi ha skarzhet e vo eus lanv RSS ar podkast.",
diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php
index 0de9f71b84..0ecaa7fb10 100644
--- a/modules/Admin/Language/br/Podcast.php
+++ b/modules/Admin/Language/br/Podcast.php
@@ -110,6 +110,9 @@ return [
         'monetization_section_title' => 'Moneisaat',
         'monetization_section_subtitle' =>
             'Dastum arc\'hant a-drugarez d\'ho selaouerien·ezed.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Chomlec\'h paeañ (Payment Poienter) evit Web Monetization',
         'payment_pointer_hint' =>
             'Ar chomlec\'h ma vo dastumet an arc\'hant ganeoc\'h a-drugarez da Web Monetization',
diff --git a/modules/Admin/Language/br/PodcastNavigation.php b/modules/Admin/Language/br/PodcastNavigation.php
index 56c575789d..5c3842caa6 100644
--- a/modules/Admin/Language/br/PodcastNavigation.php
+++ b/modules/Admin/Language/br/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Lennerioù',
     'podcast-analytics-listening-time' => 'Padelezh ar selaou',
     'podcast-analytics-time-periods' => 'Mareoù ar selaou',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Perzhidi, perzhiadezed',
     'contributor-list' => 'An holl berzhidi ha perzhiadezed',
     'contributor-add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez',
diff --git a/modules/Admin/Language/br/Settings.php b/modules/Admin/Language/br/Settings.php
index 10c855bf48..4929034f68 100644
--- a/modules/Admin/Language/br/Settings.php
+++ b/modules/Admin/Language/br/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/ca/Breadcrumb.php b/modules/Admin/Language/ca/Breadcrumb.php
index 797e181798..9fa7362a6d 100644
--- a/modules/Admin/Language/ca/Breadcrumb.php
+++ b/modules/Admin/Language/ca/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Inici',
     'podcasts' => 'podcasts',
     'episodes' => 'episodis',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'col·laboradors',
     'pages' => 'pàgines',
     'settings' => 'preferències',
@@ -24,6 +25,7 @@ return [
     'persons' => 'persones',
     'publish' => 'publicar',
     'publish-edit' => 'editar la publicació',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'desfer la publicació',
     'delete' => 'eliminar',
     'fediverse' => 'Fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'vídeoclips',
     'embed' => 'reproductor incrustable',
     'notifications' => 'notificacions',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/ca/Episode.php b/modules/Admin/Language/ca/Episode.php
index 5be116ab12..ed05a8d74a 100644
--- a/modules/Admin/Language/ca/Episode.php
+++ b/modules/Admin/Language/ca/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Editar',
     'publish' => 'Publicar',
     'publish_edit' => 'Editar la publicació',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Desfer la publicació',
     'publish_error' => 'L\'episodi ja està publicat.',
     'publish_edit_error' => 'L\'episodi ja està publicat.',
     'publish_cancel_error' => 'L\'episodi ja està publicat.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'L\'episodi no està publicat.',
     'delete' => 'Eliminar',
     'go_to_page' => 'Anar a la pàgina ',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonificació',
             'bonus_hint' => 'Contingut addicional per al programa (per exemple, informació entre bastidors o entrevistes amb el repartiment) o contingut promocional creuat per a un altre programa',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Avís parental',
             'hint' => 'L\'episodi conté contingut explícit?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Tenir un missatge augmenta la implicació social, donant lloc a una millor visibilitat del vostre episodi.',
         'message_warning_submit' => 'Publicar de totes maneres',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Si desfeu la publicació de l'episodi, se suprimiran tots els comentaris i publicacions associades amb ell i s'eliminarà del fil RSS del podcast.",
diff --git a/modules/Admin/Language/ca/Podcast.php b/modules/Admin/Language/ca/Podcast.php
index df8a8e3f92..717725108a 100644
--- a/modules/Admin/Language/ca/Podcast.php
+++ b/modules/Admin/Language/ca/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetització',
         'monetization_section_subtitle' =>
             'Guanyeu diners gràcies al vostre públic.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => '`Payment Pointer` per a `Web Monetization`',
         'payment_pointer_hint' =>
             'Aquí és on rebreu diners gràcies al servei `Web Monetization`',
diff --git a/modules/Admin/Language/ca/PodcastNavigation.php b/modules/Admin/Language/ca/PodcastNavigation.php
index 39bf30ad0a..e2e57dfbd1 100644
--- a/modules/Admin/Language/ca/PodcastNavigation.php
+++ b/modules/Admin/Language/ca/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Reproductors',
     'podcast-analytics-listening-time' => 'Temps d\'escolta',
     'podcast-analytics-time-periods' => 'Períodes de temps',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Col·laboradors',
     'contributor-list' => 'Tots els col·laboradors',
     'contributor-add' => 'Afegir un col·laborador',
diff --git a/modules/Admin/Language/ca/Settings.php b/modules/Admin/Language/ca/Settings.php
index 9ce4f305aa..a0ba0476bf 100644
--- a/modules/Admin/Language/ca/Settings.php
+++ b/modules/Admin/Language/ca/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'Aquesta opció tornarà a calcular i restablir tots els recomptes de dades (nombre de seguidors, publicacions, comentaris, …).',
         'rewrite_media' => 'Reescriure les metadades multimèdia',
         'rewrite_media_helper' => 'Aquesta opció suprimirà tots els fitxers multimèdia superflus i els recrearà (imatges, fitxers d\'àudio, transcripcions, capítols, ...)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Esborrar tota la memòria cau',
         'clear_cache_helper' => 'Aquesta opció esborrarà la memòria cau redis o els fitxers de memòria cau.',
         'run' => 'Executar la neteja',
diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php
index f8368649ad..2bf0fc70dd 100644
--- a/modules/Admin/Language/de/Breadcrumb.php
+++ b/modules/Admin/Language/de/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Startseite',
     'podcasts' => 'Podcasts',
     'episodes' => 'Folgen',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'Administratoren',
     'pages' => 'Seiten',
     'settings' => 'Einstellungen',
@@ -24,6 +25,7 @@ return [
     'persons' => 'Mitwirkende',
     'publish' => 'veröffentlichen',
     'publish-edit' => 'Veröffentlichung bearbeiten',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'Veröffentlichung aufheben',
     'delete' => 'löschen',
     'fediverse' => 'Fediversum',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'Videoclips',
     'embed' => 'einbettbarer Spieler',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php
index eaa881fd38..d20fd7162d 100644
--- a/modules/Admin/Language/de/Episode.php
+++ b/modules/Admin/Language/de/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Bearbeiten',
     'publish' => 'Veröffentllichen',
     'publish_edit' => 'Veröffentlichung bearbeiten',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Veröffentlichung zurücknehmen',
     'publish_error' => 'Folge ist bereits veröffentlicht.',
     'publish_edit_error' => 'Folge ist bereits veröffentlicht.',
     'publish_cancel_error' => 'Folge ist bereits veröffentlicht.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Folge ist nicht veröffentlicht.',
     'delete' => 'Löschen',
     'go_to_page' => 'Gehe zu Seite',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Zusätzliche Inhalte für die Sendung (zum Beispiel hinter den Kulissen, Informationen oder Interviews mit dem Team) oder übergreifende Promotionsinhalte für eine andere Show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Elternberatung',
             'hint' => 'Enthält die Folge anstößige Inhalte?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Eine Nachricht zu haben erhöht das soziale Engagement, was zu einer besseren Sichtbarkeit für Ihre Episode führt.',
         'message_warning_submit' => 'Trotzdem veröffentlichen',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php
index cbc1e10985..8cff53a15f 100644
--- a/modules/Admin/Language/de/Podcast.php
+++ b/modules/Admin/Language/de/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetarisierung',
         'monetization_section_subtitle' =>
             'Geld dank der Zuhöhrer verdienen.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Zahlungsadresse (Payment Pointer) für Web-Monetarisierung',
         'payment_pointer_hint' =>
             'Hier erhalten Sie dank Monetarisierung Geld',
diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php
index ba35a47d1a..088887f3b8 100644
--- a/modules/Admin/Language/de/PodcastNavigation.php
+++ b/modules/Admin/Language/de/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Podcast-Player',
     'podcast-analytics-listening-time' => 'Hörzeit',
     'podcast-analytics-time-periods' => 'Zeiträume',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Administratoren',
     'contributor-list' => 'Alle Unterstützer',
     'contributor-add' => 'Administrator hinzufügen',
diff --git a/modules/Admin/Language/de/Settings.php b/modules/Admin/Language/de/Settings.php
index f08af7a621..9484c30e17 100644
--- a/modules/Admin/Language/de/Settings.php
+++ b/modules/Admin/Language/de/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'Diese Option wird alle Datenzähler neu berechnen und zurücksetzen (Anzahl der Follower, Beiträge, Kommentare, …).',
         'rewrite_media' => 'Medien-Metadaten neu schreiben',
         'rewrite_media_helper' => 'Diese Option wird alle überflüssigen Mediendateien löschen und neu erstellen (Bilder, Audiodateien, Transkripte, Kapitel …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Alle Caches löschen',
         'clear_cache_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/cache-Dateien.',
         'run' => 'Systempflege starten',
diff --git a/modules/Admin/Language/el/Breadcrumb.php b/modules/Admin/Language/el/Breadcrumb.php
index cad9d1b4c1..38b8ec9272 100644
--- a/modules/Admin/Language/el/Breadcrumb.php
+++ b/modules/Admin/Language/el/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Αρχική σελίδα',
     'podcasts' => 'podcasts',
     'episodes' => 'επεισόδια',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'συντελεστές',
     'pages' => 'σελίδες',
     'settings' => 'ρυθμίσεις',
@@ -24,6 +25,7 @@ return [
     'persons' => 'άτομα',
     'publish' => 'δημοσίευση',
     'publish-edit' => 'επεξεργασία δημοσίευσης',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'αναίρεση δημοσίευσης',
     'delete' => 'διαγραφή',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'βίντεο κλιπς',
     'embed' => 'ενσωματώσιμος αναπαραγωγέας',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/el/Episode.php b/modules/Admin/Language/el/Episode.php
index 8dee5476aa..53c6ea413b 100644
--- a/modules/Admin/Language/el/Episode.php
+++ b/modules/Admin/Language/el/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Επεξεργασία',
     'publish' => 'Δημοσίευση',
     'publish_edit' => 'Επεξεργασία δημοσίευσης',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Αναίρεση δημοσίευσης',
     'publish_error' => 'Το επεισόδιο έχει ήδη δημοσιευθεί.',
     'publish_edit_error' => 'Το επεισόδιο έχει ήδη δημοσιευθεί.',
     'publish_cancel_error' => 'Το επεισόδιο έχει ήδη δημοσιευθεί.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Το επεισόδιο δεν έχει δημοσιευθεί.',
     'delete' => 'Διαγραφή',
     'go_to_page' => 'Μετάβαση στη σελίδα',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Μπόνους',
             'bonus_hint' => 'Επιπλέον περιεχόμενο για την παράσταση (για παράδειγμα, πίσω από τις σκηνές πληροφορίες ή συνεντεύξεις με τη cast) ή δια-διαφημιστικό περιεχόμενο για μια άλλη παράσταση',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Γονικός σύμβουλος',
             'hint' => 'Μήπως το επεισόδιο περιέχει ακατάλληλο περιεχόμενο;',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Έχοντας ένα μήνυμα αυξάνει την κοινωνική δέσμευση, με αποτέλεσμα μια καλύτερη προβολή για το επεισόδιο σας.',
         'message_warning_submit' => 'Δημοσίευση ούτως ή άλλως',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/el/Podcast.php b/modules/Admin/Language/el/Podcast.php
index f851435b44..a0f061b49e 100644
--- a/modules/Admin/Language/el/Podcast.php
+++ b/modules/Admin/Language/el/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/el/PodcastNavigation.php b/modules/Admin/Language/el/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/el/PodcastNavigation.php
+++ b/modules/Admin/Language/el/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/el/Settings.php b/modules/Admin/Language/el/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/el/Settings.php
+++ b/modules/Admin/Language/el/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/es/Breadcrumb.php b/modules/Admin/Language/es/Breadcrumb.php
index fe47d6e83f..621ca94ed3 100644
--- a/modules/Admin/Language/es/Breadcrumb.php
+++ b/modules/Admin/Language/es/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Inicio',
     'podcasts' => 'podcasts',
     'episodes' => 'episodios',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'colaboradores',
     'pages' => 'páginas',
     'settings' => 'configuración',
@@ -24,6 +25,7 @@ return [
     'persons' => 'personas',
     'publish' => 'publicar',
     'publish-edit' => 'editar publicación',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'anular publicación',
     'delete' => 'borrar',
     'fediverse' => 'fediverso',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'clips de vídeo',
     'embed' => 'reproductor embebido',
     'notifications' => 'notificaciones',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/es/Episode.php b/modules/Admin/Language/es/Episode.php
index 4804039570..4cb492e833 100644
--- a/modules/Admin/Language/es/Episode.php
+++ b/modules/Admin/Language/es/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Editar',
     'publish' => 'Publicar',
     'publish_edit' => 'Editar publicación',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Anular publicación',
     'publish_error' => 'El episodio ya está publicado.',
     'publish_edit_error' => 'El episodio ya está publicado.',
     'publish_cancel_error' => 'El episodio ya está publicado.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'El episodio no está publicado.',
     'delete' => 'Borrar',
     'go_to_page' => 'Ir a la página',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Extra',
             'bonus_hint' => 'Contenido extra para la serie (por ejemplo, detrás de escenas o entrevistas con el elenco) o contenido promocional para otra serie',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Aviso parental',
             'hint' => '¿El episodio contiene contenido explícito?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Tener un mensaje aumenta el alcance social, resultando en una mejor visibilidad para tu episodio.',
         'message_warning_submit' => 'Publicar de todos modos',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Al anular la publicación del episodio se eliminarán todos los comentarios y mensajes asociados a él y el episodio será eliminado del feed RSS del podcast.",
diff --git a/modules/Admin/Language/es/Podcast.php b/modules/Admin/Language/es/Podcast.php
index 33abd9b6b4..c10b23745a 100644
--- a/modules/Admin/Language/es/Podcast.php
+++ b/modules/Admin/Language/es/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetización',
         'monetization_section_subtitle' =>
             'Gana dinero gracias a tu audiencia.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Puntero de pago para Monetización web',
         'payment_pointer_hint' =>
             'Aquí es donde usted recibirá dinero gracias a la Monetización Web',
diff --git a/modules/Admin/Language/es/PodcastNavigation.php b/modules/Admin/Language/es/PodcastNavigation.php
index 6e1a409109..8bbe173375 100644
--- a/modules/Admin/Language/es/PodcastNavigation.php
+++ b/modules/Admin/Language/es/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Reproductores',
     'podcast-analytics-listening-time' => 'Tiempo de escucha',
     'podcast-analytics-time-periods' => 'Periodos de tiempo',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Colaboradores',
     'contributor-list' => 'Todos los colaboradores',
     'contributor-add' => 'Añadir colaborador',
diff --git a/modules/Admin/Language/es/Settings.php b/modules/Admin/Language/es/Settings.php
index 0094dada0a..245ee615fd 100644
--- a/modules/Admin/Language/es/Settings.php
+++ b/modules/Admin/Language/es/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'Esta opción recalculará y restablecerá todos los conteos de datos (número de seguidores, publicaciones, comentarios, …).',
         'rewrite_media' => 'Reescribir metadatos de medios',
         'rewrite_media_helper' => 'Esta opción eliminará todos los archivos multimedia superfluos y los volverá a crear (imágenes, archivos de audio, transcripciones, capítulos, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Borrar toda la caché',
         'clear_cache_helper' => 'Esta opción eliminará la caché de redis o archivos de escritura/caché.',
         'run' => 'Ejecutar tareas de mantenimiento',
diff --git a/modules/Admin/Language/fa/Breadcrumb.php b/modules/Admin/Language/fa/Breadcrumb.php
index 24bece0140..f3269bfa4e 100644
--- a/modules/Admin/Language/fa/Breadcrumb.php
+++ b/modules/Admin/Language/fa/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contributors',
     'pages' => 'pages',
     'settings' => 'settings',
@@ -24,6 +25,7 @@ return [
     'persons' => 'persons',
     'publish' => 'publish',
     'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'unpublish',
     'delete' => 'delete',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/fa/Episode.php b/modules/Admin/Language/fa/Episode.php
index ba0922f519..91313a7c5a 100644
--- a/modules/Admin/Language/fa/Episode.php
+++ b/modules/Admin/Language/fa/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Edit',
     'publish' => 'Publish',
     'publish_edit' => 'Edit publication',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Unpublish',
     'publish_error' => 'Episode is already published.',
     'publish_edit_error' => 'Episode is already published.',
     'publish_cancel_error' => 'Episode is already published.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Episode is not published.',
     'delete' => 'Delete',
     'go_to_page' => 'Go to page',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/fa/Podcast.php b/modules/Admin/Language/fa/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/fa/Podcast.php
+++ b/modules/Admin/Language/fa/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/fa/PodcastNavigation.php b/modules/Admin/Language/fa/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/fa/PodcastNavigation.php
+++ b/modules/Admin/Language/fa/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/fa/Settings.php b/modules/Admin/Language/fa/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/fa/Settings.php
+++ b/modules/Admin/Language/fa/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php
index 126727275c..375caa16d0 100644
--- a/modules/Admin/Language/fr/Breadcrumb.php
+++ b/modules/Admin/Language/fr/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Accueil',
     'podcasts' => 'podcasts',
     'episodes' => 'épisodes',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contributeurs',
     'pages' => 'pages',
     'settings' => 'paramètres',
@@ -24,6 +25,7 @@ return [
     'persons' => 'intervenants',
     'publish' => 'publier',
     'publish-edit' => 'modifier la publication',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'dépublier',
     'delete' => 'supprimer',
     'fediverse' => 'fédiverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'extraits vidéo',
     'embed' => 'lecteur intégré',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/fr/Episode.php b/modules/Admin/Language/fr/Episode.php
index 238c868b1d..dbdf875c8a 100644
--- a/modules/Admin/Language/fr/Episode.php
+++ b/modules/Admin/Language/fr/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Modifier',
     'publish' => 'Publier',
     'publish_edit' => 'Modifier la publication',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Dépublier',
     'publish_error' => 'L’épisode est déjà publié.',
     'publish_edit_error' => 'L’épisode est déjà publié.',
     'publish_cancel_error' => 'L’épisode est déjà publié.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'L’épisode n’est pas publié.',
     'delete' => 'Supprimer',
     'go_to_page' => 'Voir',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Contenu supplémentaire pour le podcast (par exemple des informations sur les coulisses ou des interviews avec les acteurs) ou du contenu promotionnel croisé pour un autre podcast',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Avertissement parental',
             'hint' => 'L’épisode contient-il un contenu explicite ?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Ajouter un message augmente l’engagement social, menant à une meilleure visibilité pour votre épisode.',
         'message_warning_submit' => 'Publier quand même',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php
index 73ac9e866d..41255ff237 100644
--- a/modules/Admin/Language/fr/Podcast.php
+++ b/modules/Admin/Language/fr/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monétisation',
         'monetization_section_subtitle' =>
             'Gagnez de l’argent grâce à votre audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Adresse de paiement (Payment Pointer) pour Web Monetization',
         'payment_pointer_hint' =>
             'L’adresse où vous recevrez de l’argent grâce à Web Monetization',
diff --git a/modules/Admin/Language/fr/PodcastNavigation.php b/modules/Admin/Language/fr/PodcastNavigation.php
index ddce3a3147..86a1bf52f8 100644
--- a/modules/Admin/Language/fr/PodcastNavigation.php
+++ b/modules/Admin/Language/fr/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Lecteurs',
     'podcast-analytics-listening-time' => 'Durée d’écoute',
     'podcast-analytics-time-periods' => 'Périodes',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributeurs',
     'contributor-list' => 'Tous les contributeurs',
     'contributor-add' => 'Ajouter un contributeur',
diff --git a/modules/Admin/Language/fr/Settings.php b/modules/Admin/Language/fr/Settings.php
index dfc917a830..e6b0f54732 100644
--- a/modules/Admin/Language/fr/Settings.php
+++ b/modules/Admin/Language/fr/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'Cette option recalcule et réinitialise les compteurs de données (nombre d’abonné·e·s, de publications, de commentaires, …).',
         'rewrite_media' => 'Réécrire les métadonnées des fichiers média',
         'rewrite_media_helper' => 'Cette option supprimera tous les fichiers média superflus et les recréera (images, fichiers audio, transcripts, chapitrages, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Supprimer tout le cache',
         'clear_cache_helper' => 'Cette option supprimera l’intégralité du cache redis ou des fichiers cache du dossier writable/cache.',
         'run' => 'Faire le ménage',
diff --git a/modules/Admin/Language/gd/Breadcrumb.php b/modules/Admin/Language/gd/Breadcrumb.php
index 24bece0140..f3269bfa4e 100644
--- a/modules/Admin/Language/gd/Breadcrumb.php
+++ b/modules/Admin/Language/gd/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contributors',
     'pages' => 'pages',
     'settings' => 'settings',
@@ -24,6 +25,7 @@ return [
     'persons' => 'persons',
     'publish' => 'publish',
     'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'unpublish',
     'delete' => 'delete',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/gd/Episode.php b/modules/Admin/Language/gd/Episode.php
index ba0922f519..91313a7c5a 100644
--- a/modules/Admin/Language/gd/Episode.php
+++ b/modules/Admin/Language/gd/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Edit',
     'publish' => 'Publish',
     'publish_edit' => 'Edit publication',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Unpublish',
     'publish_error' => 'Episode is already published.',
     'publish_edit_error' => 'Episode is already published.',
     'publish_cancel_error' => 'Episode is already published.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Episode is not published.',
     'delete' => 'Delete',
     'go_to_page' => 'Go to page',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/gd/Podcast.php b/modules/Admin/Language/gd/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/gd/Podcast.php
+++ b/modules/Admin/Language/gd/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/gd/PodcastNavigation.php b/modules/Admin/Language/gd/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/gd/PodcastNavigation.php
+++ b/modules/Admin/Language/gd/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/gd/Settings.php b/modules/Admin/Language/gd/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/gd/Settings.php
+++ b/modules/Admin/Language/gd/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php
index 60f9326f1b..7aa07fba53 100644
--- a/modules/Admin/Language/gl/Breadcrumb.php
+++ b/modules/Admin/Language/gl/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Inicio',
     'podcasts' => 'podcasts',
     'episodes' => 'episodios',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contribúen',
     'pages' => 'páxinas',
     'settings' => 'axustes',
@@ -24,6 +25,7 @@ return [
     'persons' => 'persoas',
     'publish' => 'publicar',
     'publish-edit' => 'editar publicación',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'retirar publicación',
     'delete' => 'eliminar',
     'fediverse' => 'fediverso',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'clips de vídeo',
     'embed' => 'reprodutor para incluír',
     'notifications' => 'notificacións',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/gl/Episode.php b/modules/Admin/Language/gl/Episode.php
index 71c87d0460..9e2da4b4a4 100644
--- a/modules/Admin/Language/gl/Episode.php
+++ b/modules/Admin/Language/gl/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Editar',
     'publish' => 'Publicar',
     'publish_edit' => 'Editar publicación',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Retirar publicación',
     'publish_error' => 'O episodio xa está publicado.',
     'publish_edit_error' => 'O episodio xa está publicado.',
     'publish_cancel_error' => 'O episodio xa está publicado.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'O episodio non foi publicado.',
     'delete' => 'Eliminar',
     'go_to_page' => 'Ir á páxina',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Extra',
             'bonus_hint' => 'Contido extra para o programa (por exemplo, info sobre a elaboración ou conversa casual cos participantes) ou contido promocional de outras creadoras',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Aviso sobre o contido',
             'hint' => 'Contén o episodio elementos explícitos?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Ao escribir unha mensaxe aumentas o alcance social, resultando en maior visibilidade para o teu episodio.',
         'message_warning_submit' => 'Publicar igualmente',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Retirando o episodio eliminarás tódolos comentarios e publicacións asociadas con el e tamén o eliminarás da fonte RSS do podcast.",
diff --git a/modules/Admin/Language/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php
index fa9d797ddd..80e9d97190 100644
--- a/modules/Admin/Language/gl/Podcast.php
+++ b/modules/Admin/Language/gl/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/gl/PodcastNavigation.php b/modules/Admin/Language/gl/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/gl/PodcastNavigation.php
+++ b/modules/Admin/Language/gl/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/gl/Settings.php b/modules/Admin/Language/gl/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/gl/Settings.php
+++ b/modules/Admin/Language/gl/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/id/Breadcrumb.php b/modules/Admin/Language/id/Breadcrumb.php
index 02b2107267..676e47b75f 100644
--- a/modules/Admin/Language/id/Breadcrumb.php
+++ b/modules/Admin/Language/id/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contributors',
     'pages' => 'pages',
     'settings' => 'settings',
@@ -24,6 +25,7 @@ return [
     'persons' => 'persons',
     'publish' => 'publish',
     'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'unpublish',
     'delete' => 'delete',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/id/Episode.php b/modules/Admin/Language/id/Episode.php
index ba0922f519..91313a7c5a 100644
--- a/modules/Admin/Language/id/Episode.php
+++ b/modules/Admin/Language/id/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Edit',
     'publish' => 'Publish',
     'publish_edit' => 'Edit publication',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Unpublish',
     'publish_error' => 'Episode is already published.',
     'publish_edit_error' => 'Episode is already published.',
     'publish_cancel_error' => 'Episode is already published.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Episode is not published.',
     'delete' => 'Delete',
     'go_to_page' => 'Go to page',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/id/Podcast.php b/modules/Admin/Language/id/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/id/Podcast.php
+++ b/modules/Admin/Language/id/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/id/PodcastNavigation.php b/modules/Admin/Language/id/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/id/PodcastNavigation.php
+++ b/modules/Admin/Language/id/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/id/Settings.php b/modules/Admin/Language/id/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/id/Settings.php
+++ b/modules/Admin/Language/id/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/it/Breadcrumb.php b/modules/Admin/Language/it/Breadcrumb.php
index 24bece0140..9876ee9b22 100644
--- a/modules/Admin/Language/it/Breadcrumb.php
+++ b/modules/Admin/Language/it/Breadcrumb.php
@@ -13,37 +13,40 @@ return [
     config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
-    'episodes' => 'episodes',
-    'contributors' => 'contributors',
-    'pages' => 'pages',
-    'settings' => 'settings',
-    'theme' => 'theme',
-    'add' => 'add',
-    'new' => 'new',
-    'edit' => 'edit',
-    'persons' => 'persons',
-    'publish' => 'publish',
-    'publish-edit' => 'edit publication',
-    'unpublish' => 'unpublish',
-    'delete' => 'delete',
-    'fediverse' => 'fediverse',
-    'block-lists' => 'block lists',
-    'users' => 'users',
-    'my-account' => 'my account',
-    'change-password' => 'change password',
-    'import' => 'feed import',
-    'platforms' => 'platforms',
+    'episodes' => 'episodi',
+    'subscriptions' => 'sottoscrizioni',
+    'contributors' => 'collaboratori',
+    'pages' => 'pagine',
+    'settings' => 'impostazioni',
+    'theme' => 'tema',
+    'add' => 'aggiungi',
+    'new' => 'nuovo',
+    'edit' => 'modifica',
+    'persons' => 'persone',
+    'publish' => 'pubblica',
+    'publish-edit' => 'modifica pubblicazione',
+    'publish-date-edit' => 'edit publication date',
+    'unpublish' => 'annulla pubblicazione',
+    'delete' => 'elimina',
+    'fediverse' => 'fediverso',
+    'block-lists' => 'elenco bloccati',
+    'users' => 'utenti',
+    'my-account' => 'il mio profilo',
+    'change-password' => 'cambia la password',
+    'import' => 'importazione feed',
+    'platforms' => 'piattaforme',
     'social' => 'social networks',
-    'funding' => 'funding',
+    'funding' => 'finanziamento',
     'analytics' => 'analytics',
-    'locations' => 'locations',
-    'webpages' => 'web pages',
-    'unique-listeners' => 'unique listeners',
-    'players' => 'players',
-    'listening-time' => 'listening time',
-    'time-periods' => 'time periods',
+    'locations' => 'posizioni',
+    'webpages' => 'pagine web',
+    'unique-listeners' => 'ascoltatori unici',
+    'players' => 'partecipanti',
+    'listening-time' => 'tempo di ascolto',
+    'time-periods' => 'periodo di tempo',
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
-    'embed' => 'embeddable player',
-    'notifications' => 'notifications',
+    'embed' => 'player incorporabile',
+    'notifications' => 'notifiche',
+    'suspend' => 'sospendi',
 ];
diff --git a/modules/Admin/Language/it/Charts.php b/modules/Admin/Language/it/Charts.php
index 4b33530ef0..383d7bf8e9 100644
--- a/modules/Admin/Language/it/Charts.php
+++ b/modules/Admin/Language/it/Charts.php
@@ -9,7 +9,7 @@ declare(strict_types=1);
  */
 
 return [
-    'by_service_weekly' => 'Episode downloads by service (for the past week)',
+    'by_service_weekly' => 'Episodi scaricati per servizio (settimana passata)',
     'by_player_weekly' => 'Episode downloads by player (for the past week)',
     'by_player_yearly' => 'Episode downloads by player (for the past year)',
     'by_device_weekly' => 'Episode downloads by device (for the past week)',
diff --git a/modules/Admin/Language/it/Common.php b/modules/Admin/Language/it/Common.php
index 596c8bcdec..bff79dffe9 100644
--- a/modules/Admin/Language/it/Common.php
+++ b/modules/Admin/Language/it/Common.php
@@ -9,43 +9,43 @@ declare(strict_types=1);
  */
 
 return [
-    'yes' => 'Yes',
+    'yes' => 'Si',
     'no' => 'No',
     'cancel' => 'Cancel',
     'optional' => 'Optional',
     'more' => 'More',
-    'no_data' => 'No data found!',
-    'close' => 'Close',
-    'edit' => 'Edit',
-    'copy' => 'Copy',
-    'copied' => 'Copied!',
+    'no_data' => 'Nessun dato trovato!',
+    'close' => 'Chiudi',
+    'edit' => 'Modifica',
+    'copy' => 'Copia',
+    'copied' => 'Copiato!',
     'home' => 'Home',
-    'explicit' => 'Explicit',
-    'powered_by' => 'Powered by {castopod}',
-    'actions' => 'Actions',
-    'pageInfo' => 'Page {currentPage} out of {pageCount}',
-    'go_back' => 'Go back',
+    'explicit' => 'Esplicito',
+    'powered_by' => 'Fornito da {castopod}',
+    'actions' => 'Azioni',
+    'pageInfo' => 'Pagina {currentPage} di {pageCount}',
+    'go_back' => 'Torna indietro',
     'forms' => [
         'editor' => [
-            'write' => 'Write',
-            'preview' => 'Preview',
+            'write' => 'Scrivi',
+            'preview' => 'Anteprima',
             'help' => 'Powered by markdown',
         ],
         'multiSelect' => [
-            'selectText' => 'Press to select',
-            'loadingText' => 'Loading…',
-            'noResultsText' => 'No results found',
+            'selectText' => 'Premi per selezionare',
+            'loadingText' => 'Caricamento…',
+            'noResultsText' => 'Nessun risultato trovato',
             'noChoicesText' => 'No choices to choose from',
-            'maxItemText' => 'Cannot add more items',
+            'maxItemText' => 'Impossibile aggiungere ulteriori elementi',
         ],
-        'upload_file' => 'Upload a file',
-        'remote_url' => 'Remote URL',
+        'upload_file' => 'Carica un file',
+        'remote_url' => 'URL remoto',
     ],
     'play_episode_button' => [
-        'play' => 'Play',
-        'playing' => 'Playing',
+        'play' => 'Riproduci',
+        'playing' => 'In riproduzione',
     ],
     'size_limit' => 'Size limit: {0}.',
-    'choose_interact' => 'Choose how to interact',
-    'view' => 'View',
+    'choose_interact' => 'Scegli come interagire',
+    'view' => 'Visualizza',
 ];
diff --git a/modules/Admin/Language/it/Contributor.php b/modules/Admin/Language/it/Contributor.php
index d0f3b93d9f..ab685c041a 100644
--- a/modules/Admin/Language/it/Contributor.php
+++ b/modules/Admin/Language/it/Contributor.php
@@ -9,33 +9,33 @@ declare(strict_types=1);
  */
 
 return [
-    'podcast_contributors' => 'Podcast contributors',
+    'podcast_contributors' => 'Collaboratori del podcast',
     'view' => "{username}'s contribution to {podcastTitle}",
-    'add' => 'Add contributor',
+    'add' => 'Aggiungi collaboratore',
     'add_contributor' => 'Add a contributor for {0}',
     'edit_role' => 'Update role for {0}',
-    'edit' => 'Edit',
-    'remove' => 'Remove',
+    'edit' => 'Modifica',
+    'remove' => 'Rimuovi',
     'list' => [
-        'username' => 'Username',
+        'username' => 'Nome Utente',
         'role' => 'Role',
     ],
     'form' => [
         'user' => 'User',
-        'user_placeholder' => 'Select a user…',
-        'role' => 'Role',
-        'role_placeholder' => 'Select its role…',
-        'submit_add' => 'Add contributor',
-        'submit_edit' => 'Update role',
+        'user_placeholder' => 'Seleziona un utente…',
+        'role' => 'Ruolo',
+        'role_placeholder' => 'Seleziona il suo ruolo…',
+        'submit_add' => 'Aggiungi collaboratore',
+        'submit_edit' => 'Aggiorna Ruolo',
     ],
     'roles' => [
-        'podcast_admin' => 'Podcast admin',
+        'podcast_admin' => 'Amministratore del podcast',
     ],
     'messages' => [
-        'removeOwnerError' => "You can't remove the podcast owner!",
+        'removeOwnerError' => "Non puoi rimuovere il proprietario del podcast!",
         'removeSuccess' =>
-            'You have successfully removed {username} from {podcastTitle}',
+            'Hai rimosso con successo {username} da {podcastTitle}',
         'alreadyAddedError' =>
-            "The contributor you're trying to add has already been added!",
+            "Il collaboratore che stai cercando di aggiungere è già stato aggiunto!",
     ],
 ];
diff --git a/modules/Admin/Language/it/Countries.php b/modules/Admin/Language/it/Countries.php
index 4cd5d9c857..185d3c376c 100644
--- a/modules/Admin/Language/it/Countries.php
+++ b/modules/Admin/Language/it/Countries.php
@@ -12,25 +12,25 @@ declare(strict_types=1);
 
 return [
     'AD' => 'Andorra',
-    'AE' => 'United Arab Emirates',
+    'AE' => 'Emirati Arabi Uniti',
     'AF' => 'Afghanistan',
-    'AG' => 'Antigua and Barbuda',
+    'AG' => 'Antigua e Barbuda',
     'AI' => 'Anguilla',
     'AL' => 'Albania',
     'AM' => 'Armenia',
     'AO' => 'Angola',
-    'AQ' => 'Antarctica',
+    'AQ' => 'Antartide',
     'AR' => 'Argentina',
     'AS' => 'American Samoa',
     'AT' => 'Austria',
     'AU' => 'Australia',
     'AW' => 'Aruba',
-    'AX' => 'Ã…land Islands',
-    'AZ' => 'Azerbaijan',
-    'BA' => 'Bosnia and Herzegovina',
+    'AX' => 'Isole Ã…land',
+    'AZ' => 'Azerbaigian',
+    'BA' => 'Bosnia-Erzegovina',
     'BB' => 'Barbados',
     'BD' => 'Bangladesh',
-    'BE' => 'Belgium',
+    'BE' => 'Belgio',
     'BF' => 'Burkina Faso',
     'BG' => 'Bulgaria',
     'BH' => 'Bahrain',
@@ -38,63 +38,63 @@ return [
     'BJ' => 'Benin',
     'BL' => 'Saint Barthélemy',
     'BM' => 'Bermuda',
-    'BN' => 'Brunei Darussalam',
-    'BO' => 'Bolivia, Plurinational State of',
+    'BN' => 'Sultanato del Brunei',
+    'BO' => 'Bolivia, Stato Plurinazionale di',
     'BQ' => 'Bonaire, Sint Eustatius and Saba',
-    'BR' => 'Brazil',
+    'BR' => 'Brasile',
     'BS' => 'Bahamas',
     'BT' => 'Bhutan',
     'BV' => 'Bouvet Island',
     'BW' => 'Botswana',
-    'BY' => 'Belarus',
+    'BY' => 'Bielorussia',
     'BZ' => 'Belize',
     'CA' => 'Canada',
-    'CC' => 'Cocos (Keeling) Islands',
-    'CD' => 'Congo, the Democratic Republic of the',
+    'CC' => 'Isole Cocos (Keeling)',
+    'CD' => 'Repubblica Democratica del Congo',
     'CF' => 'Central African Republic',
     'CG' => 'Congo',
-    'CH' => 'Switzerland',
-    'CI' => "Côte d'Ivoire",
+    'CH' => 'Svizzera',
+    'CI' => "Costa d'Avorio",
     'CK' => 'Cook Islands',
-    'CL' => 'Chile',
-    'CM' => 'Cameroon',
-    'CN' => 'China',
+    'CL' => 'Cile',
+    'CM' => 'Camerun',
+    'CN' => 'Cina',
     'CO' => 'Colombia',
     'CR' => 'Costa Rica',
     'CU' => 'Cuba',
-    'CV' => 'Cape Verde',
+    'CV' => 'Capo Verde',
     'CW' => 'Curaçao',
     'CX' => 'Christmas Island',
-    'CY' => 'Cyprus',
-    'CZ' => 'Czech Republic',
-    'DE' => 'Germany',
+    'CY' => 'Cipro',
+    'CZ' => 'Repubblica Ceca',
+    'DE' => 'Germania',
     'DJ' => 'Djibouti',
-    'DK' => 'Denmark',
+    'DK' => 'Danimarca',
     'DM' => 'Dominica',
-    'DO' => 'Dominican Republic',
+    'DO' => 'Repubblica Domenicana',
     'DZ' => 'Algeria',
     'EC' => 'Ecuador',
     'EE' => 'Estonia',
-    'EG' => 'Egypt',
-    'EH' => 'Western Sahara',
+    'EG' => 'Egitto',
+    'EH' => 'Sahara occidentale',
     'ER' => 'Eritrea',
-    'ES' => 'Spain',
-    'ET' => 'Ethiopia',
-    'FI' => 'Finland',
+    'ES' => 'Spagna',
+    'ET' => 'Etiopia',
+    'FI' => 'Finlandia',
     'FJ' => 'Fiji',
     'FK' => 'Falkland Islands (Malvinas)',
     'FM' => 'Micronesia, Federated States of',
     'FO' => 'Faroe Islands',
-    'FR' => 'France',
+    'FR' => 'Francia',
     'GA' => 'Gabon',
-    'GB' => 'United Kingdom',
-    'GD' => 'Grenada',
+    'GB' => 'Regno Unito',
+    'GD' => 'Granada',
     'GE' => 'Georgia',
     'GF' => 'French Guiana',
     'GG' => 'Guernsey',
     'GH' => 'Ghana',
     'GI' => 'Gibraltar',
-    'GL' => 'Greenland',
+    'GL' => 'Groenlandia',
     'GM' => 'Gambia',
     'GN' => 'Guinea',
     'GP' => 'Guadeloupe',
@@ -132,22 +132,22 @@ return [
     'KM' => 'Comoros',
     'KN' => 'Saint Kitts and Nevis',
     'KP' => "Korea, Democratic People's Republic of",
-    'KR' => 'Korea, Republic of',
+    'KR' => 'Corea del Sud (Repubblica di Corea)',
     'KW' => 'Kuwait',
     'KY' => 'Cayman Islands',
-    'KZ' => 'Kazakhstan',
+    'KZ' => 'Kazakistan',
     'LA' => "Lao People's Democratic Republic",
-    'LB' => 'Lebanon',
+    'LB' => 'Libano',
     'LC' => 'Saint Lucia',
     'LI' => 'Liechtenstein',
     'LK' => 'Sri Lanka',
     'LR' => 'Liberia',
     'LS' => 'Lesotho',
-    'LT' => 'Lithuania',
+    'LT' => 'Lituania',
     'LU' => 'Luxembourg',
-    'LV' => 'Latvia',
+    'LV' => 'Lettonia',
     'LY' => 'Libya',
-    'MA' => 'Morocco',
+    'MA' => 'Marocco',
     'MC' => 'Monaco',
     'MD' => 'Moldova, Republic of',
     'ME' => 'Montenegro',
@@ -177,8 +177,8 @@ return [
     'NF' => 'Norfolk Island',
     'NG' => 'Nigeria',
     'NI' => 'Nicaragua',
-    'NL' => 'Netherlands',
-    'NO' => 'Norway',
+    'NL' => 'Paesi Bassi',
+    'NO' => 'Norvegia',
     'NP' => 'Nepal',
     'NR' => 'Nauru',
     'NU' => 'Niue',
@@ -195,7 +195,7 @@ return [
     'PN' => 'Pitcairn',
     'PR' => 'Puerto Rico',
     'PS' => 'Palestine, State of',
-    'PT' => 'Portugal',
+    'PT' => 'Portogallo',
     'PW' => 'Palau',
     'PY' => 'Paraguay',
     'QA' => 'Qatar',
@@ -244,7 +244,7 @@ return [
     'UA' => 'Ukraine',
     'UG' => 'Uganda',
     'UM' => 'United States Minor Outlying Islands',
-    'US' => 'United States',
+    'US' => 'Stati Uniti d\'America',
     'UY' => 'Uruguay',
     'UZ' => 'Uzbekistan',
     'VA' => 'Holy See (Vatican City State)',
diff --git a/modules/Admin/Language/it/Episode.php b/modules/Admin/Language/it/Episode.php
index ba0922f519..6cb572a333 100644
--- a/modules/Admin/Language/it/Episode.php
+++ b/modules/Admin/Language/it/Episode.php
@@ -19,22 +19,26 @@ return [
         one {# comment}
         other {# comments}
     }',
-    'all_podcast_episodes' => 'All podcast episodes',
-    'back_to_podcast' => 'Go back to podcast',
-    'edit' => 'Edit',
-    'publish' => 'Publish',
-    'publish_edit' => 'Edit publication',
-    'unpublish' => 'Unpublish',
-    'publish_error' => 'Episode is already published.',
-    'publish_edit_error' => 'Episode is already published.',
-    'publish_cancel_error' => 'Episode is already published.',
-    'unpublish_error' => 'Episode is not published.',
-    'delete' => 'Delete',
-    'go_to_page' => 'Go to page',
-    'create' => 'Add an episode',
+    'all_podcast_episodes' => 'Tutti gli episodi del podcast',
+    'back_to_podcast' => 'Torna a podcast',
+    'edit' => 'Modifica',
+    'publish' => 'Pubblica',
+    'publish_edit' => 'Modifica pubblicazione',
+    'publish_date_edit' => 'Edit publication date',
+    'unpublish' => 'Annulla pubblicazione',
+    'publish_error' => 'L\'episodio è già stato pubblicato.',
+    'publish_edit_error' => 'L\'episodio è già stato pubblicato.',
+    'publish_cancel_error' => 'L\'episodio è già stato pubblicato.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
+    'unpublish_error' => 'Episodio non pubblicato.',
+    'delete' => 'Elimina',
+    'go_to_page' => 'Vai alla pagina',
+    'create' => 'Aggiungi un episodio',
     'publication_status' => [
-        'published' => 'Published',
-        'with_podcast' => 'Published',
+        'published' => 'Pubblicato',
+        'with_podcast' => 'Pubblicato',
         'scheduled' => 'Scheduled',
         'not_published' => 'Not published',
     ],
@@ -43,7 +47,7 @@ return [
         'search' => [
             'placeholder' => 'Search for an episode',
             'clear' => 'Clear search',
-            'submit' => 'Search',
+            'submit' => 'Cerca',
         ],
         'number_of_episodes' => '{numberOfEpisodes, plural,
             one {# episode}
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/it/Podcast.php b/modules/Admin/Language/it/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/it/Podcast.php
+++ b/modules/Admin/Language/it/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/it/PodcastNavigation.php b/modules/Admin/Language/it/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/it/PodcastNavigation.php
+++ b/modules/Admin/Language/it/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/it/Settings.php b/modules/Admin/Language/it/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/it/Settings.php
+++ b/modules/Admin/Language/it/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php
index a7183ac1b5..a5c08f435d 100644
--- a/modules/Admin/Language/nl/Breadcrumb.php
+++ b/modules/Admin/Language/nl/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Hoofdpagina',
     'podcasts' => 'podcasts',
     'episodes' => 'afleveringen',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'bijdragers',
     'pages' => 'paginas',
     'settings' => 'instellingen',
@@ -24,6 +25,7 @@ return [
     'persons' => 'personen',
     'publish' => 'publiceren',
     'publish-edit' => 'publicatie aanpassen',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'publicatie ongedaan maken',
     'delete' => 'verwijder',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video clips',
     'embed' => 'integreerbare speler',
     'notifications' => 'meldingen',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/nl/Episode.php b/modules/Admin/Language/nl/Episode.php
index 2fa67126c4..6084574466 100644
--- a/modules/Admin/Language/nl/Episode.php
+++ b/modules/Admin/Language/nl/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Bewerken',
     'publish' => 'Publiceren',
     'publish_edit' => 'Publicatie bewerken',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Publicatie ongedaan maken',
     'publish_error' => 'Aflevering is reeds gepubliceerd.',
     'publish_edit_error' => 'Aflevering is reeds gepubliceerd.',
     'publish_cancel_error' => 'Aflevering is reeds gepubliceerd.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Aflevering is niet gepubliceerd.',
     'delete' => 'Verwijder',
     'go_to_page' => 'Ga naar pagina',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/nl/Podcast.php b/modules/Admin/Language/nl/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/nl/Podcast.php
+++ b/modules/Admin/Language/nl/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/nl/PodcastNavigation.php b/modules/Admin/Language/nl/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/nl/PodcastNavigation.php
+++ b/modules/Admin/Language/nl/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/nl/Settings.php b/modules/Admin/Language/nl/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/nl/Settings.php
+++ b/modules/Admin/Language/nl/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php
index aed6277aaf..d59e34efed 100644
--- a/modules/Admin/Language/nn-NO/Breadcrumb.php
+++ b/modules/Admin/Language/nn-NO/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Heim',
     'podcasts' => 'podkastar',
     'episodes' => 'episodar',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'bidragsytarar',
     'pages' => 'sider',
     'settings' => 'innstillingar',
@@ -24,6 +25,7 @@ return [
     'persons' => 'personar',
     'publish' => 'legg ut',
     'publish-edit' => 'rediger publiseringa',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'avpubliser',
     'delete' => 'slett',
     'fediverse' => 'fødiverset',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'videoklypp',
     'embed' => 'innbyggbar spelar',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/nn-NO/Episode.php b/modules/Admin/Language/nn-NO/Episode.php
index c98495f0f8..12a3672ad6 100644
--- a/modules/Admin/Language/nn-NO/Episode.php
+++ b/modules/Admin/Language/nn-NO/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Rediger',
     'publish' => 'Legg ut',
     'publish_edit' => 'Rediger publiseringa',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Avpubliser',
     'publish_error' => 'Episoden er allereie publisert.',
     'publish_edit_error' => 'Episoden er allereie publisert.',
     'publish_cancel_error' => 'Episoden er allereie publisert.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Episoden er ikkje publisert.',
     'delete' => 'Slett',
     'go_to_page' => 'GÃ¥ til side',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Ekstra innhald (til dømes bakominfo eller intervju med skodespelarane) eller innhald for å framheva ein annan serie',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'RÃ¥d til foreldre',
             'hint' => 'Inneheld episoden grov prat?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Viss du skriv ei melding, kan det gje meir sosialt engasjement og syta for at episoden din blir meir synleg.',
         'message_warning_submit' => 'Legg ut likevel',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/nn-NO/Podcast.php b/modules/Admin/Language/nn-NO/Podcast.php
index 803a56e69e..f18cefc28a 100644
--- a/modules/Admin/Language/nn-NO/Podcast.php
+++ b/modules/Admin/Language/nn-NO/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Kommersialisering',
         'monetization_section_subtitle' =>
             'Ten pengar med hjelp frå publikummet ditt.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Betalingspunkt for nettkommersialisering',
         'payment_pointer_hint' =>
             'Det er her du vil få inn pengar frå nettkommersialiseringa',
diff --git a/modules/Admin/Language/nn-NO/PodcastNavigation.php b/modules/Admin/Language/nn-NO/PodcastNavigation.php
index cf628d0ea2..d62080aeda 100644
--- a/modules/Admin/Language/nn-NO/PodcastNavigation.php
+++ b/modules/Admin/Language/nn-NO/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Spelarar',
     'podcast-analytics-listening-time' => 'Lyttetid',
     'podcast-analytics-time-periods' => 'Tidsperiodar',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Bidragsytarar',
     'contributor-list' => 'Alle bidragsytarane',
     'contributor-add' => 'Legg til bidragsytar',
diff --git a/modules/Admin/Language/nn-NO/Settings.php b/modules/Admin/Language/nn-NO/Settings.php
index 2ef7b6c92a..6d9f6641f4 100644
--- a/modules/Admin/Language/nn-NO/Settings.php
+++ b/modules/Admin/Language/nn-NO/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'Dette nullstiller alle datateljarar (tal på fylgjarar, innlegg, kommentarar…).',
         'rewrite_media' => 'Overskriv metadata for medium',
         'rewrite_media_helper' => 'Dette vil sletta alle overflødige mediafiler og laga dei på nytt (bilete, lydfiler, transkriberingar, kapittel, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Slett bufferinnhald',
         'clear_cache_helper' => 'Dette tømmer redis-mellomlageret eller skrivbare/mellomlagra filer.',
         'run' => 'Gjer reinhald',
diff --git a/modules/Admin/Language/oc/Breadcrumb.php b/modules/Admin/Language/oc/Breadcrumb.php
index 24bece0140..f3269bfa4e 100644
--- a/modules/Admin/Language/oc/Breadcrumb.php
+++ b/modules/Admin/Language/oc/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contributors',
     'pages' => 'pages',
     'settings' => 'settings',
@@ -24,6 +25,7 @@ return [
     'persons' => 'persons',
     'publish' => 'publish',
     'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'unpublish',
     'delete' => 'delete',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/oc/Episode.php b/modules/Admin/Language/oc/Episode.php
index ba0922f519..91313a7c5a 100644
--- a/modules/Admin/Language/oc/Episode.php
+++ b/modules/Admin/Language/oc/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Edit',
     'publish' => 'Publish',
     'publish_edit' => 'Edit publication',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Unpublish',
     'publish_error' => 'Episode is already published.',
     'publish_edit_error' => 'Episode is already published.',
     'publish_cancel_error' => 'Episode is already published.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Episode is not published.',
     'delete' => 'Delete',
     'go_to_page' => 'Go to page',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/oc/Podcast.php b/modules/Admin/Language/oc/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/oc/Podcast.php
+++ b/modules/Admin/Language/oc/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/oc/PodcastNavigation.php b/modules/Admin/Language/oc/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/oc/PodcastNavigation.php
+++ b/modules/Admin/Language/oc/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/oc/Settings.php b/modules/Admin/Language/oc/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/oc/Settings.php
+++ b/modules/Admin/Language/oc/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php
index 0030fb6058..d472ef1063 100644
--- a/modules/Admin/Language/pl/Breadcrumb.php
+++ b/modules/Admin/Language/pl/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'PoczÄ…tek',
     'podcasts' => 'podcasty',
     'episodes' => 'odcinki',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'kontrybutorzy',
     'pages' => 'strony',
     'settings' => 'ustawienia',
@@ -24,6 +25,7 @@ return [
     'persons' => 'osoby',
     'publish' => 'publikuj',
     'publish-edit' => 'edytuj publikacjÄ™',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'cofnij publikacjÄ™',
     'delete' => 'usuń',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'klipy wideo',
     'embed' => 'odtwarzacz do osadzenia',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/pl/Episode.php b/modules/Admin/Language/pl/Episode.php
index f82ccfdab8..ee45c80531 100644
--- a/modules/Admin/Language/pl/Episode.php
+++ b/modules/Admin/Language/pl/Episode.php
@@ -25,10 +25,14 @@ return [
     'edit' => 'Edytuj',
     'publish' => 'Publikuj',
     'publish_edit' => 'Edytuj publikacjÄ™',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Cofnij publikacjÄ™',
     'publish_error' => 'Odcinek jest już opublikowany.',
     'publish_edit_error' => 'Odcinek jest już opublikowany.',
     'publish_cancel_error' => 'Odcinek jest już opublikowany.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Odcinek nie jest opublikowany.',
     'delete' => 'Usuń',
     'go_to_page' => 'Przejdź do strony',
@@ -110,6 +114,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Dodatkowa treść do programu (np. informacje zza kulis lub wywiady z obsadą) albo treści promujące inne programy',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Kontrola rodzicielska',
             'hint' => 'Czy odcinek zawiera treści dla dorosłych?',
@@ -177,6 +183,11 @@ return [
         'message_warning_hint' => 'Posiadanie wiadomości zwiększa zaangażowanie społeczne, co skutkuje lepszą widocznością Twojego odcinka.',
         'message_warning_submit' => 'Opublikuj mimo to',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/pl/Podcast.php b/modules/Admin/Language/pl/Podcast.php
index 2b6ed3f57f..5aa92ff81c 100644
--- a/modules/Admin/Language/pl/Podcast.php
+++ b/modules/Admin/Language/pl/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetyzacja',
         'monetization_section_subtitle' =>
             'Zarabiaj dzięki swoim odbiorcom.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Wskaźnik płatności do zarabiania w sieci',
         'payment_pointer_hint' =>
             'To tutaj otrzymasz pieniądze dzięki Monetyzacji Internetowej',
diff --git a/modules/Admin/Language/pl/PodcastNavigation.php b/modules/Admin/Language/pl/PodcastNavigation.php
index 38b73ffbe1..7f3327f157 100644
--- a/modules/Admin/Language/pl/PodcastNavigation.php
+++ b/modules/Admin/Language/pl/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Odtwarzacze',
     'podcast-analytics-listening-time' => 'Czas odsłuchu',
     'podcast-analytics-time-periods' => 'Okresy czasu',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Kontrybutorzy',
     'contributor-list' => 'Wszyscy kontrybutorzy',
     'contributor-add' => 'Dodaj kontrybutora',
diff --git a/modules/Admin/Language/pl/Settings.php b/modules/Admin/Language/pl/Settings.php
index 308012aea7..09bcfde0c4 100644
--- a/modules/Admin/Language/pl/Settings.php
+++ b/modules/Admin/Language/pl/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'Ta opcja zresetuje i ponownie obliczy wszystkie liczniki danych (liczbę obserwujących, wpisów, komentarzy, …).',
         'rewrite_media' => 'Przepisz metadane multimediów',
         'rewrite_media_helper' => 'Ta opcja usunie wszystkie zbędne pliki multimedialne i odtworzy je (obrazy, pliki audio, transkrypcje, rozdziały, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Wyczyść całą pamięć podręczną',
         'clear_cache_helper' => 'Ta opcja opróżni pamięć podręczną (cache) redis lub zapisywalne/buforowane pliki.',
         'run' => 'Przeprowadź porządkowanie',
diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-BR/Breadcrumb.php
index 42c5e23c1c..028fb11cd7 100644
--- a/modules/Admin/Language/pt-BR/Breadcrumb.php
+++ b/modules/Admin/Language/pt-BR/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Início',
     'podcasts' => 'podcasts',
     'episodes' => 'episódios',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contribuidores',
     'pages' => 'páginas',
     'settings' => 'configurações',
@@ -24,6 +25,7 @@ return [
     'persons' => 'pessoas',
     'publish' => 'publicar',
     'publish-edit' => 'editar publicação',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'despublicar',
     'delete' => 'excluir',
     'fediverse' => 'fediverso',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'clipes de vídeo',
     'embed' => 'player incorporável',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-BR/Episode.php
index cd15c64b3d..b89d440147 100644
--- a/modules/Admin/Language/pt-BR/Episode.php
+++ b/modules/Admin/Language/pt-BR/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Editar',
     'publish' => 'Publicar',
     'publish_edit' => 'Editar publicação',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Despublicar',
     'publish_error' => 'O episódio já está publicado.',
     'publish_edit_error' => 'O episódio já está publicado.',
     'publish_cancel_error' => 'O episódio já está publicado.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'O episódio não está publicado.',
     'delete' => 'Excluir',
     'go_to_page' => 'Ir para a página',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bônus',
             'bonus_hint' => 'Conteúdo extra para o podcast (por exemplo, informações nos bastidores ou entrevistas com o elenco) ou conteúdo promocional com outro podcast',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Aviso aos pais',
             'hint' => 'O episódio contém conteúdo explícito?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Ter uma mensagem aumenta o engajamento social, resultando em uma melhor visibilidade do seu episódio.',
         'message_warning_submit' => 'Publicar mesmo assim',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/pt-BR/Podcast.php b/modules/Admin/Language/pt-BR/Podcast.php
index e0815d508e..c7e30aa38e 100644
--- a/modules/Admin/Language/pt-BR/Podcast.php
+++ b/modules/Admin/Language/pt-BR/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetização',
         'monetization_section_subtitle' =>
             'Ganhe dinheiro graças à sua audiência.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Endereço de pagamento (Payment Pointer) para web monetização',
         'payment_pointer_hint' =>
             'Este é o seu lugar onde você receberá dinheiro graças à web monetização',
diff --git a/modules/Admin/Language/pt-BR/PodcastNavigation.php b/modules/Admin/Language/pt-BR/PodcastNavigation.php
index 2214743c57..91e416557d 100644
--- a/modules/Admin/Language/pt-BR/PodcastNavigation.php
+++ b/modules/Admin/Language/pt-BR/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Tempo de escuta',
     'podcast-analytics-time-periods' => 'Períodos de tempo',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contribuidores',
     'contributor-list' => 'Todos os contribuidores',
     'contributor-add' => 'Adicionar contribuidor',
diff --git a/modules/Admin/Language/pt-BR/Settings.php b/modules/Admin/Language/pt-BR/Settings.php
index 23147fee5e..841460019c 100644
--- a/modules/Admin/Language/pt-BR/Settings.php
+++ b/modules/Admin/Language/pt-BR/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'Esta opção irá recalcular e redefinir todas as contagens de dados (número de seguidores, publicações, comentários, …).',
         'rewrite_media' => 'Reescrever metadados de mídia',
         'rewrite_media_helper' => 'Esta opção apagará todos os arquivos de mídia desnecessários e os recriará (imagens, arquivos de áudio, transcrições, capítulos, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Limpar todo o cache',
         'clear_cache_helper' => 'Esta opção irá liberar o cache do redis ou arquivos graváveis/cache.',
         'run' => 'Executar manutenção',
diff --git a/modules/Admin/Language/pt/Breadcrumb.php b/modules/Admin/Language/pt/Breadcrumb.php
index 24bece0140..f3269bfa4e 100644
--- a/modules/Admin/Language/pt/Breadcrumb.php
+++ b/modules/Admin/Language/pt/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contributors',
     'pages' => 'pages',
     'settings' => 'settings',
@@ -24,6 +25,7 @@ return [
     'persons' => 'persons',
     'publish' => 'publish',
     'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'unpublish',
     'delete' => 'delete',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/pt/Episode.php b/modules/Admin/Language/pt/Episode.php
index ba0922f519..91313a7c5a 100644
--- a/modules/Admin/Language/pt/Episode.php
+++ b/modules/Admin/Language/pt/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Edit',
     'publish' => 'Publish',
     'publish_edit' => 'Edit publication',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Unpublish',
     'publish_error' => 'Episode is already published.',
     'publish_edit_error' => 'Episode is already published.',
     'publish_cancel_error' => 'Episode is already published.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Episode is not published.',
     'delete' => 'Delete',
     'go_to_page' => 'Go to page',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/pt/Podcast.php b/modules/Admin/Language/pt/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/pt/Podcast.php
+++ b/modules/Admin/Language/pt/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/pt/PodcastNavigation.php b/modules/Admin/Language/pt/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/pt/PodcastNavigation.php
+++ b/modules/Admin/Language/pt/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/pt/Settings.php b/modules/Admin/Language/pt/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/pt/Settings.php
+++ b/modules/Admin/Language/pt/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/ru/Breadcrumb.php b/modules/Admin/Language/ru/Breadcrumb.php
index d0ad26ac4d..33432cfdd5 100644
--- a/modules/Admin/Language/ru/Breadcrumb.php
+++ b/modules/Admin/Language/ru/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Главная',
     'podcasts' => 'подкасты',
     'episodes' => 'выпуски',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'участников',
     'pages' => 'страниц',
     'settings' => 'настройки',
@@ -24,6 +25,7 @@ return [
     'persons' => 'лица',
     'publish' => 'публикация',
     'publish-edit' => 'редактировать публикацию',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'снять с публикации',
     'delete' => 'удалить',
     'fediverse' => 'Федивёрс',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'видео клипы',
     'embed' => 'встроенный плеер',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/ru/Episode.php b/modules/Admin/Language/ru/Episode.php
index ba0922f519..91313a7c5a 100644
--- a/modules/Admin/Language/ru/Episode.php
+++ b/modules/Admin/Language/ru/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Edit',
     'publish' => 'Publish',
     'publish_edit' => 'Edit publication',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Unpublish',
     'publish_error' => 'Episode is already published.',
     'publish_edit_error' => 'Episode is already published.',
     'publish_cancel_error' => 'Episode is already published.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Episode is not published.',
     'delete' => 'Delete',
     'go_to_page' => 'Go to page',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/ru/Podcast.php b/modules/Admin/Language/ru/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/ru/Podcast.php
+++ b/modules/Admin/Language/ru/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/ru/PodcastNavigation.php b/modules/Admin/Language/ru/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/ru/PodcastNavigation.php
+++ b/modules/Admin/Language/ru/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/ru/Settings.php b/modules/Admin/Language/ru/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/ru/Settings.php
+++ b/modules/Admin/Language/ru/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php
index 34a69e4a45..3c7422811e 100644
--- a/modules/Admin/Language/sk/Breadcrumb.php
+++ b/modules/Admin/Language/sk/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Úvod',
     'podcasts' => 'podcasty',
     'episodes' => 'časti',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'prispievatelia',
     'pages' => 'stránky',
     'settings' => 'nastavenia',
@@ -24,6 +25,7 @@ return [
     'persons' => 'osobnosti',
     'publish' => 'zverejniť',
     'publish-edit' => 'upraviť zverejnené',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'zrušiť zverejnenie',
     'delete' => 'vymazať',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video klipy',
     'embed' => 'vnorený',
     'notifications' => 'oboznámenia',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php
index 93730ec0c9..a731c0e24d 100644
--- a/modules/Admin/Language/sk/Episode.php
+++ b/modules/Admin/Language/sk/Episode.php
@@ -26,10 +26,14 @@ return [
     'edit' => 'Upraviť',
     'publish' => 'Zverejniť',
     'publish_edit' => 'Upraviť zverejnenie',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Zrušiť zverejnenie',
     'publish_error' => 'Epizóda je už zverejnená.',
     'publish_edit_error' => 'Epizóda je už zverejnená.',
     'publish_cancel_error' => 'Epizóda je už zverejnená.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Epizóda nie je zverejnená.',
     'delete' => 'Vymazať',
     'go_to_page' => 'Prejsť na stránku',
@@ -113,6 +117,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -180,6 +186,11 @@ return [
         'message_warning_hint' => 'Odoslaním uvádzacieho príspevku zlepšujete sociálnu účasť, čím môžete ešte viac zviditeľniť váš podcast.',
         'message_warning_submit' => 'Napriek tomu zverejniť',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php
index 5585a766eb..5e65da720b 100644
--- a/modules/Admin/Language/sk/Podcast.php
+++ b/modules/Admin/Language/sk/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/sk/PodcastNavigation.php b/modules/Admin/Language/sk/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/sk/PodcastNavigation.php
+++ b/modules/Admin/Language/sk/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/sk/Settings.php b/modules/Admin/Language/sk/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/sk/Settings.php
+++ b/modules/Admin/Language/sk/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/sv/Breadcrumb.php b/modules/Admin/Language/sv/Breadcrumb.php
index 24bece0140..f3269bfa4e 100644
--- a/modules/Admin/Language/sv/Breadcrumb.php
+++ b/modules/Admin/Language/sv/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
     'contributors' => 'contributors',
     'pages' => 'pages',
     'settings' => 'settings',
@@ -24,6 +25,7 @@ return [
     'persons' => 'persons',
     'publish' => 'publish',
     'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => 'unpublish',
     'delete' => 'delete',
     'fediverse' => 'fediverse',
@@ -46,4 +48,5 @@ return [
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
     'notifications' => 'notifications',
+    'suspend' => 'suspend',
 ];
diff --git a/modules/Admin/Language/sv/Episode.php b/modules/Admin/Language/sv/Episode.php
index ba0922f519..91313a7c5a 100644
--- a/modules/Admin/Language/sv/Episode.php
+++ b/modules/Admin/Language/sv/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => 'Edit',
     'publish' => 'Publish',
     'publish_edit' => 'Edit publication',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => 'Unpublish',
     'publish_error' => 'Episode is already published.',
     'publish_edit_error' => 'Episode is already published.',
     'publish_cancel_error' => 'Episode is already published.',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => 'Episode is not published.',
     'delete' => 'Delete',
     'go_to_page' => 'Go to page',
@@ -109,6 +113,8 @@ return [
             'bonus' => 'Bonus',
             'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
         ],
+        'premium_title' => 'Premium',
+        'premium' => 'Episode must be accessible to premium subscribers only',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
         'message_warning_submit' => 'Publish anyways',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
diff --git a/modules/Admin/Language/sv/Podcast.php b/modules/Admin/Language/sv/Podcast.php
index 19a022b563..426b763b8b 100644
--- a/modules/Admin/Language/sv/Podcast.php
+++ b/modules/Admin/Language/sv/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => 'Monetization',
         'monetization_section_subtitle' =>
             'Earn money thanks to your audience.',
+        'premium' => 'Premium',
+        'premium_by_default' => 'Episodes must be set as premium by default',
+        'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.',
         'payment_pointer' => 'Payment Pointer for Web Monetization',
         'payment_pointer_hint' =>
             'This is your where you will receive money thanks to Web Monetization',
diff --git a/modules/Admin/Language/sv/PodcastNavigation.php b/modules/Admin/Language/sv/PodcastNavigation.php
index b619573154..b4d7ddc089 100644
--- a/modules/Admin/Language/sv/PodcastNavigation.php
+++ b/modules/Admin/Language/sv/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => 'Players',
     'podcast-analytics-listening-time' => 'Listening time',
     'podcast-analytics-time-periods' => 'Time periods',
+    'premium' => 'Premium',
+    'subscription-list' => 'All subscriptions',
+    'subscription-add' => 'Add subscription',
     'contributors' => 'Contributors',
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
diff --git a/modules/Admin/Language/sv/Settings.php b/modules/Admin/Language/sv/Settings.php
index 345976be7f..4a70dcbaa0 100644
--- a/modules/Admin/Language/sv/Settings.php
+++ b/modules/Admin/Language/sv/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).',
         'rewrite_media' => 'Rewrite media metadata',
         'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)',
+        'rename_episodes_files' => 'Rename episode audio files',
+        'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.',
         'clear_cache' => 'Clear all cache',
         'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.',
         'run' => 'Run housekeeping',
diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-Hans/Breadcrumb.php
index b41de54fbe..80105ec375 100644
--- a/modules/Admin/Language/zh-Hans/Breadcrumb.php
+++ b/modules/Admin/Language/zh-Hans/Breadcrumb.php
@@ -14,6 +14,7 @@ return [
         ->gateway => '主页',
     'podcasts' => '播客',
     'episodes' => '剧集',
+    'subscriptions' => '订阅',
     'contributors' => '贡献者',
     'pages' => '页',
     'settings' => '设置',
@@ -24,6 +25,7 @@ return [
     'persons' => '人',
     'publish' => '发布',
     'publish-edit' => '编辑发布',
+    'publish-date-edit' => 'edit publication date',
     'unpublish' => '取消发布',
     'delete' => '删除',
     'fediverse' => '联邦宇宙',
@@ -46,4 +48,5 @@ return [
     'video-clips' => '视频素材',
     'embed' => '嵌入式播放器',
     'notifications' => '通知',
+    'suspend' => '暂停',
 ];
diff --git a/modules/Admin/Language/zh-Hans/Episode.php b/modules/Admin/Language/zh-Hans/Episode.php
index c6a3f2d0ce..7a8f335a2a 100644
--- a/modules/Admin/Language/zh-Hans/Episode.php
+++ b/modules/Admin/Language/zh-Hans/Episode.php
@@ -24,10 +24,14 @@ return [
     'edit' => '编辑',
     'publish' => '发布',
     'publish_edit' => '编辑发布',
+    'publish_date_edit' => 'Edit publication date',
     'unpublish' => '取消发布',
     'publish_error' => '剧集已被发布。',
     'publish_edit_error' => '剧集已被发布。',
     'publish_cancel_error' => '剧集已被发布。',
+    'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.',
+    'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.',
+    'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!',
     'unpublish_error' => '剧集尚未发布。',
     'delete' => '删除',
     'go_to_page' => '转到页面',
@@ -109,6 +113,8 @@ return [
             'bonus' => '奖金',
             'bonus_hint' => '剧集趣闻(例如,幕后信息与对演员的采访)或另一个剧集的推荐',
         ],
+        'premium_title' => '高级版',
+        'premium' => '剧集仅允许高级订阅者访问',
         'parental_advisory' => [
             'label' => '警告标记',
             'hint' => '剧集是否包含限制级内容?',
@@ -176,6 +182,11 @@ return [
         'message_warning_hint' => '有消息发送可以增加社交参与度,从而提高你的剧集曝光度。',
         'message_warning_submit' => '仍然发布',
     ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'New publication date',
+        'new_publication_date_hint' => 'Must be set to a past date.',
+        'submit' => 'Edit publication date',
+    ],
     'unpublish_form' => [
         'disclaimer' =>
             "取消发布该剧集将删除相关的所有评论和播文,并将其从播客的订阅源中删除。",
diff --git a/modules/Admin/Language/zh-Hans/Podcast.php b/modules/Admin/Language/zh-Hans/Podcast.php
index 7e231b81e0..1a145c204f 100644
--- a/modules/Admin/Language/zh-Hans/Podcast.php
+++ b/modules/Admin/Language/zh-Hans/Podcast.php
@@ -107,6 +107,9 @@ return [
         'monetization_section_title' => '货币化',
         'monetization_section_subtitle' =>
             '感谢你的听众支持。',
+        'premium' => '高级版',
+        'premium_by_default' => '剧集必须默认设置为付费会员订阅。',
+        'premium_by_default_hint' => '默认情况下,播客剧集将被标记为高级。 你仍然可以选择将某些剧集、预告片等设置为公开。',
         'payment_pointer' => '网络货币化支付指南',
         'payment_pointer_hint' =>
             '借助网络货币化,你可以在此收款',
diff --git a/modules/Admin/Language/zh-Hans/PodcastNavigation.php b/modules/Admin/Language/zh-Hans/PodcastNavigation.php
index ba11a317a2..75564b1326 100644
--- a/modules/Admin/Language/zh-Hans/PodcastNavigation.php
+++ b/modules/Admin/Language/zh-Hans/PodcastNavigation.php
@@ -25,6 +25,9 @@ return [
     'podcast-analytics-players' => '播放',
     'podcast-analytics-listening-time' => '收听时间',
     'podcast-analytics-time-periods' => '时间段',
+    'premium' => '高级版',
+    'subscription-list' => '所有订阅',
+    'subscription-add' => '添加订阅',
     'contributors' => '贡献者',
     'contributor-list' => '所有贡献者',
     'contributor-add' => '添加贡献者',
diff --git a/modules/Admin/Language/zh-Hans/Settings.php b/modules/Admin/Language/zh-Hans/Settings.php
index 8c7768cedb..10875b1edf 100644
--- a/modules/Admin/Language/zh-Hans/Settings.php
+++ b/modules/Admin/Language/zh-Hans/Settings.php
@@ -35,6 +35,8 @@ return [
         'reset_counts_helper' => '此选项将重新计算并重置所有数据统计(关注者数目、帖子、评论、 …)。',
         'rewrite_media' => '重写媒体元数据',
         'rewrite_media_helper' => '此选项将删除所有多余的媒体文件并重新创建(图像、音频、字幕、章节、 …)',
+        'rename_episodes_files' => '重命名剧集音频文件',
+        'rename_episodes_files_hint' => '此选项会将所有剧集音频文件重命名为随机字符串。 如果你的私人剧集链接被泄露,使用此选项可以隐藏。',
         'clear_cache' => '清除所有缓存',
         'clear_cache_helper' => '此选项将从可写/缓存文件夹中删除整个 redis 缓存或缓存文件。',
         'run' => '运行维护任务',
diff --git a/modules/PremiumPodcasts/Language/ar/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/ar/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/ar/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/ar/Subscription.php b/modules/PremiumPodcasts/Language/ar/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/ar/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/br/Subscription.php b/modules/PremiumPodcasts/Language/br/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/br/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/ca/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/ca/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/ca/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/ca/Subscription.php b/modules/PremiumPodcasts/Language/ca/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/ca/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/de/Subscription.php b/modules/PremiumPodcasts/Language/de/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/de/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/el/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/el/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/el/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/el/Subscription.php b/modules/PremiumPodcasts/Language/el/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/el/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/es/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/es/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/es/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/es/Subscription.php b/modules/PremiumPodcasts/Language/es/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/es/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/fa/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fa/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/fa/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/fa/Subscription.php b/modules/PremiumPodcasts/Language/fa/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/fa/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/fr/Subscription.php b/modules/PremiumPodcasts/Language/fr/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/fr/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/gd/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/gd/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/gd/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/gd/Subscription.php b/modules/PremiumPodcasts/Language/gd/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/gd/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/gl/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/gl/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/gl/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/gl/Subscription.php b/modules/PremiumPodcasts/Language/gl/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/gl/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/id/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/id/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/id/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/id/Subscription.php b/modules/PremiumPodcasts/Language/id/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/id/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/it/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/it/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/it/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/it/Subscription.php b/modules/PremiumPodcasts/Language/it/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/it/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/nl/Subscription.php b/modules/PremiumPodcasts/Language/nl/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/nl/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/oc/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/oc/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/oc/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/oc/Subscription.php b/modules/PremiumPodcasts/Language/oc/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/oc/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/pl/Subscription.php b/modules/PremiumPodcasts/Language/pl/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/pl/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/pt-BR/Subscription.php b/modules/PremiumPodcasts/Language/pt-BR/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/pt-BR/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/pt/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/pt/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/pt/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/pt/Subscription.php b/modules/PremiumPodcasts/Language/pt/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/pt/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/ru/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/ru/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/ru/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/ru/Subscription.php b/modules/PremiumPodcasts/Language/ru/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/ru/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/sk/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/sk/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/sk/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/sk/Subscription.php b/modules/PremiumPodcasts/Language/sk/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/sk/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/sv/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/sv/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/sv/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => 'Podcast contains premium episodes',
+    'episode_is_premium' => 'Episode is premium, only available to premium subscribers',
+    'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!',
+    'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.',
+    'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!',
+    'subscribe' => 'Subscribe',
+    'lock' => 'Lock',
+    'unlock' => 'Unlock',
+    'unlock_form' => [
+        'title' => 'Premium content',
+        'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?',
+        'token' => 'Enter your key',
+        'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.',
+        'submit' => 'Unlock all episodes!',
+        'call_to_action' => 'Unlock all episodes of {podcastTitle}:',
+        'subscribe_cta' => 'Subscribe now!',
+    ],
+    'messages' => [
+        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
+        'unlockBadAttempt' => 'Your key does not seem to be working…',
+        'lockSuccess' => 'Podcast was successfully locked!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/sv/Subscription.php b/modules/PremiumPodcasts/Language/sv/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/sv/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => 'New subscription',
+    'view' => 'View subscription',
+    'edit' => 'Edit subscription',
+    'regenerate_token' => 'Regenerate token',
+    'suspend' => 'Suspend subscription',
+    'resume' => 'Resume subscription',
+    'delete' => 'Delete subscription',
+    'status' => [
+        'active' => 'Active',
+        'suspended' => 'Suspended',
+        'expired' => 'Expired',
+    ],
+    'list' => [
+        'number' => 'Number',
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'unlimited' => 'Unlimited',
+        'downloads' => 'Downloads',
+        'status' => 'Status',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'expiration_date' => 'Expiration date',
+        'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.',
+        'submit_add' => 'Add subscription',
+        'submit_edit' => 'Edit subscription',
+    ],
+    'form_link_add' => [
+        'link' => 'Subscription page link',
+        'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.',
+        'submit' => 'Save link',
+    ],
+    'suspend_form' => [
+        'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.',
+        'reason' => 'Reason',
+        'reason_placeholder' => 'Why are you suspending the subscription?',
+        "submit" => 'Suspend subscription',
+    ],
+    'delete_form' => [
+        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'understand' => 'I understand, remove the subscription permanently',
+        'submit' => 'Remove subscription',
+    ],
+    'messages' => [
+        'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.',
+        'addError' => 'Subscription could not be added.',
+        'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.',
+        'editError' => 'Subscription could not be edited.',
+        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenError' => 'Token could not be regenerated.',
+        'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.',
+        'deleteError' => 'Subscription could not be removed.',
+        'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.',
+        'suspendError' => 'Subscription could not be suspended.',
+        'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.',
+        'resumeError' => 'Subscription could not be resumed.',
+        'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!',
+        'linkRemoveSuccess' => 'Subscription link was removed successfully!',
+    ],
+    'emails' => [
+        'greeting' => 'Hey,',
+        'token' => 'Your token: {0}',
+        'unique_feed_link' => 'Your unique feed link: {0}',
+        'how_to_use' => 'How to use?',
+        'two_ways' => 'You have two ways of unlocking the premium episodes:',
+        'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).',
+        'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.',
+        'welcome_subject' => 'Welcome to {podcastTitle}',
+        'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!',
+        'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:',
+        'welcome_expires' => 'Your subscription was set to expire on {0}.',
+        'welcome_never_expires' => 'Your subscription was set to never expire.',
+        'reset_subject' => 'Your token was reset!',
+        'reset_token' => 'Your access to {podcastTitle} has been reset!',
+        'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:',
+        'edited_subject' => 'Your subscription has been updated!',
+        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
+        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'suspended_subject' => 'Your subscription has been suspended!',
+        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended_reason' => 'That is for the following reason: {0}',
+        'resumed_subject' => 'Your subscription has been resumed!',
+        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'deleted_subject' => 'Your subscription has been removed!',
+        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'footer' => '{castopod} hosted on {host}',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/zh-Hans/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/zh-Hans/PremiumPodcasts.php
new file mode 100644
index 0000000000..8723a61170
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/zh-Hans/PremiumPodcasts.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_is_premium' => '播客包含优质剧集',
+    'episode_is_premium' => '剧集是高级内容,仅适用于高级订阅者',
+    'unlock_episode' => '本集仅适用于高级订阅者。 点击解锁!',
+    'banner_unlock' => '此播客包含高级剧集,仅供高级订阅者使用。',
+    'banner_lock' => '播客已解锁,享受优质剧集!',
+    'subscribe' => '订阅',
+    'lock' => '锁定',
+    'unlock' => '解锁',
+    'unlock_form' => [
+        'title' => '高级内容',
+        'subtitle' => '此播客包含锁定的高级剧集! 你有解锁它们的秘钥吗?',
+        'token' => '输入你的密钥',
+        'token_hint' => '如果你订阅了 {podcastTitle},可以复制通过电子邮件发送给你的密钥并将其粘贴到此处。',
+        'submit' => '解锁所有剧集!',
+        'call_to_action' => '解锁 {podcastTitle} 的所有剧集:',
+        'subscribe_cta' => '现在订阅 !',
+    ],
+    'messages' => [
+        'unlockSuccess' => '播客已成功解锁! 享受优质剧集!',
+        'unlockBadAttempt' => '你的密钥似乎不起作用...',
+        'lockSuccess' => '播客已成功锁定!',
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php b/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php
new file mode 100644
index 0000000000..ceaeb7dfcc
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2022 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_subscriptions' => 'Podcast subscriptions',
+    'add' => '新订阅',
+    'view' => '查看订阅',
+    'edit' => '编辑订阅',
+    'regenerate_token' => '重新生成令牌',
+    'suspend' => '停止订阅',
+    'resume' => '恢复订阅',
+    'delete' => '删除订阅',
+    'status' => [
+        'active' => '活动',
+        'suspended' => '已暂停',
+        'expired' => '已过期',
+    ],
+    'list' => [
+        'number' => '编号',
+        'email' => '邮箱',
+        'expiration_date' => '到期日',
+        'unlimited' => '无限制',
+        'downloads' => '下载',
+        'status' => '状态',
+    ],
+    'form' => [
+        'email' => '邮箱',
+        'expiration_date' => '到期日',
+        'expiration_date_hint' => '订阅到期的日期和时间。 留空时没有订阅限制。',
+        'submit_add' => '添加订阅',
+        'submit_edit' => '编辑订阅',
+    ],
+    'form_link_add' => [
+        'link' => '订阅页面链接',
+        'link_hint' => '在网站中添加号召性用语,邀请听众订阅播客。',
+        'submit' => '保存链接',
+    ],
+    'suspend_form' => [
+        'disclaimer' => '暂停订阅将限制订阅者访问高级内容。你仍然可以在之后取消暂停。',
+        'reason' => '原因',
+        'reason_placeholder' => '您为什么要暂停订阅?',
+        "submit" => '暂停订阅',
+    ],
+    'delete_form' => [
+        'disclaimer' => '删除 {subscriber} 的订阅将删除所有相关的分析数据。',
+        'understand' => '我明白,永久删除订阅',
+        'submit' => '移除订阅',
+    ],
+    'messages' => [
+        'addSuccess' => '添加了新订阅! 欢迎电子邮件已发送给 {subscriber}。',
+        'addError' => '无法添加订阅。',
+        'editSuccess' => '订阅到期日期已更新! 一封电子邮件已发送给 {subscriber}。',
+        'editError' => '无法添加订阅。',
+        'regenerateTokenSuccess' => '重新生成令牌! 一封带有新令牌的电子邮件已发送给 {subscriber}。',
+        'regenerateTokenError' => '无法重新生成令牌。',
+        'deleteSuccess' => '订阅已删除! 一封电子邮件已发送给 {subscriber}。',
+        'deleteError' => '无法删除订阅。',
+        'suspendSuccess' => '订阅已暂停! 一封电子邮件已发送给 {subscriber}。',
+        'suspendError' => '无法暂停订阅。',
+        'resumeSuccess' => '订阅已恢复! 一封电子邮件已发送给 {subscriber}。',
+        'resumeError' => '无法恢复订阅。',
+        'linkSaveSuccess' => '订阅链接保存成功! 它将作为号召性用语出现在网站上!',
+        'linkRemoveSuccess' => '订阅链接已成功删除!',
+    ],
+    'emails' => [
+        'greeting' => '嘿,',
+        'token' => '你的令牌: {0}',
+        'unique_feed_link' => '你唯一的源链接:{0}',
+        'how_to_use' => '如何使用?',
+        'two_ways' => '你有两种解锁高级剧集的方法:',
+        'import_into_app' => '在你最喜欢的播客应用程序中复制你唯一的源 URL(将其作为私人源导入以防止暴露你的凭据)。',
+        'go_to_website' => '访问 {podcastWebsite} 的网站并使用你的令牌解锁播客。',
+        'welcome_subject' => '欢迎来到 {podcastTitle}',
+        'welcome' => '你已订阅 {podcastTitle},谢谢,欢迎加入!',
+        'welcome_token_title' => '这是你解锁播客高级剧集的凭据:',
+        'welcome_expires' => '你的订阅已设置为在 {0} 到期。',
+        'welcome_never_expires' => '你的订阅设置为永不过期。',
+        'reset_subject' => '你的令牌已重置!',
+        'reset_token' => '你对 {podcastTitle} 的访问权限已重置!',
+        'reset_token_title' => '已为你生成解锁播客高级剧集的新凭据:',
+        'edited_subject' => '你的订阅已更新!',
+        'edited_expires' => '你对 {podcastTitle} 的订阅已设置为在 {expiresAt} 到期。',
+        'edited_never_expires' => '你对 {podcastTitle} 的订阅设置为永不过期!',
+        'suspended_subject' => '你的订阅已被暂停!',
+        'suspended' => '你的 {podcastTitle} 订阅已暂停! 你已无法再访问播客的高级剧集。',
+        'suspended_reason' => '原因如下:{0}',
+        'resumed_subject' => '你的订阅已恢复!',
+        'resumed' => '你对 {podcastTitle} 的订阅已恢复! 你可以再次访问播客的高级剧集。',
+        'deleted_subject' => '你的订阅已被删除!',
+        'deleted' => '你对 {podcastTitle} 的订阅已被删除! 你无法再访问播客的高级剧集。',
+        'footer' => '{castopod} 托管在 {host}',
+    ],
+];
-- 
GitLab