From d2151b74bda8e4287664e77324a01da859361706 Mon Sep 17 00:00:00 2001
From: crowdin <project2_bot@noreply.code.castopod.org>
Date: Thu, 16 Mar 2023 16:45:41 +0000
Subject: [PATCH] chore(i18n): new Crowdin updates

---
 app/Language/de/Comment.php                   |  14 +-
 app/Language/de/Common.php                    |   6 +-
 app/Language/de/Episode.php                   |  12 +-
 app/Language/de/Fediverse.php                 |  12 +-
 app/Language/de/Podcast.php                   |   2 +-
 app/Language/de/Post.php                      |   8 +-
 app/Language/fr2/Comment.php                  |  34 ++
 app/Language/fr2/Common.php                   |  30 ++
 app/Language/fr2/Episode.php                  |  33 ++
 app/Language/fr2/Fediverse.php                |  37 ++
 app/Language/fr2/Home.php                     |  20 +
 app/Language/fr2/Page.php                     |  17 +
 app/Language/fr2/Podcast.php                  |  53 +++
 app/Language/fr2/Post.php                     |  40 ++
 app/Language/fr_CA/Comment.php                |  34 ++
 app/Language/fr_CA/Common.php                 |  30 ++
 app/Language/fr_CA/Episode.php                |  33 ++
 app/Language/fr_CA/Fediverse.php              |  37 ++
 app/Language/fr_CA/Home.php                   |  20 +
 app/Language/fr_CA/Page.php                   |  17 +
 app/Language/fr_CA/Podcast.php                |  53 +++
 app/Language/fr_CA/Post.php                   |  40 ++
 app/Language/fr_trad/Comment.php              |  34 ++
 app/Language/fr_trad/Common.php               |  30 ++
 app/Language/fr_trad/Episode.php              |  33 ++
 app/Language/fr_trad/Fediverse.php            |  37 ++
 app/Language/fr_trad/Home.php                 |  20 +
 app/Language/fr_trad/Page.php                 |  17 +
 app/Language/fr_trad/Podcast.php              |  53 +++
 app/Language/fr_trad/Post.php                 |  40 ++
 app/Language/pl/Common.php                    |   2 +-
 app/Language/pl/Fediverse.php                 |   2 +-
 app/Language/pl/Podcast.php                   |  26 +-
 app/Language/sr_Latn/Comment.php              |   8 +-
 app/Language/sr_Latn/Episode.php              |  10 +-
 app/Language/sr_Latn/Fediverse.php            |   2 +-
 app/Language/sr_Latn/Podcast.php              |  28 +-
 app/Language/sr_Latn/Post.php                 |  12 +-
 app/Language/uk/Comment.php                   |  34 ++
 app/Language/uk/Common.php                    |  30 ++
 app/Language/uk/Episode.php                   |  33 ++
 app/Language/uk/Fediverse.php                 |  37 ++
 app/Language/uk/Home.php                      |  20 +
 app/Language/uk/Page.php                      |  17 +
 app/Language/uk/Podcast.php                   |  53 +++
 app/Language/uk/Post.php                      |  40 ++
 docs/src/ar/getting-started/install.md        |  31 ++
 docs/src/br/getting-started/install.md        |  31 ++
 docs/src/ca/getting-started/auth.md           |  86 ++--
 docs/src/ca/getting-started/install.md        |  31 ++
 docs/src/de/getting-started/auth.md           |  89 ++--
 docs/src/de/getting-started/install.md        |  43 +-
 docs/src/de/getting-started/security.md       |  28 +-
 docs/src/el/getting-started/install.md        |  31 ++
 docs/src/es/getting-started/install.md        |  43 +-
 docs/src/fa/getting-started/install.md        |  31 ++
 docs/src/fr/getting-started/auth.md           | 111 ++---
 docs/src/fr/getting-started/docker.md         |  51 +--
 docs/src/fr/getting-started/install.md        |  41 +-
 docs/src/fr/getting-started/update.md         |  55 +--
 docs/src/fr/index.md                          |  12 +-
 docs/src/fr2/getting-started/auth.md          |  87 ++++
 docs/src/fr2/getting-started/install.md       | 216 ++++++++++
 docs/src/fr_CA/getting-started/auth.md        |  87 ++++
 docs/src/fr_CA/getting-started/docker.md      | 177 ++++++++
 docs/src/fr_CA/getting-started/install.md     | 216 ++++++++++
 docs/src/fr_CA/getting-started/security.md    |  26 ++
 docs/src/fr_CA/getting-started/update.md      | 109 +++++
 docs/src/fr_CA/index.md                       | 303 ++++++++++++++
 docs/src/fr_trad/getting-started/auth.md      |  87 ++++
 docs/src/fr_trad/getting-started/docker.md    | 177 ++++++++
 docs/src/fr_trad/getting-started/install.md   | 185 ++++++++
 docs/src/fr_trad/getting-started/security.md  |  26 ++
 docs/src/fr_trad/getting-started/update.md    | 109 +++++
 docs/src/fr_trad/index.md                     | 303 ++++++++++++++
 docs/src/gd/getting-started/install.md        |  31 ++
 docs/src/gl/getting-started/install.md        |  31 ++
 docs/src/id/getting-started/install.md        |  31 ++
 docs/src/it/getting-started/install.md        |  31 ++
 docs/src/ko/getting-started/install.md        |  31 ++
 docs/src/nl/getting-started/auth.md           |  64 +--
 docs/src/nl/getting-started/install.md        |  31 ++
 docs/src/nn-NO/getting-started/install.md     |  31 ++
 docs/src/oc/getting-started/install.md        |  31 ++
 docs/src/pl/getting-started/auth.md           |   2 +-
 docs/src/pl/getting-started/install.md        |  31 ++
 docs/src/pt-BR/getting-started/install.md     |  66 ++-
 docs/src/pt/getting-started/install.md        |  31 ++
 docs/src/ro/getting-started/install.md        |  31 ++
 docs/src/ru/getting-started/install.md        |  31 ++
 docs/src/sk/getting-started/install.md        |  31 ++
 docs/src/sr_Latn/getting-started/install.md   |  31 ++
 docs/src/sv/getting-started/install.md        |  43 +-
 docs/src/uk/getting-started/auth.md           |  87 ++++
 docs/src/uk/getting-started/docker.md         | 177 ++++++++
 docs/src/uk/getting-started/install.md        | 216 ++++++++++
 docs/src/uk/getting-started/security.md       |  26 ++
 docs/src/uk/getting-started/update.md         | 109 +++++
 docs/src/uk/index.md                          | 303 ++++++++++++++
 docs/src/zh-Hans/getting-started/install.md   |  41 +-
 modules/Admin/Language/ar/Charts.php          |   1 +
 modules/Admin/Language/ar/Episode.php         |   1 +
 modules/Admin/Language/br/Charts.php          |   1 +
 modules/Admin/Language/br/Episode.php         |   1 +
 modules/Admin/Language/ca/AboutCastopod.php   |  16 +-
 modules/Admin/Language/ca/Breadcrumb.php      |  14 +-
 modules/Admin/Language/ca/Charts.php          |   1 +
 modules/Admin/Language/ca/Episode.php         |  19 +-
 modules/Admin/Language/ca/Notifications.php   |   2 +-
 modules/Admin/Language/ca/Podcast.php         |  14 +-
 .../Admin/Language/ca/PodcastNavigation.php   |   6 +-
 modules/Admin/Language/de/Breadcrumb.php      |  10 +-
 modules/Admin/Language/de/Charts.php          |   5 +-
 modules/Admin/Language/de/Common.php          |   2 +-
 modules/Admin/Language/de/Dashboard.php       |   2 +-
 modules/Admin/Language/de/Episode.php         |   9 +-
 modules/Admin/Language/de/Fediverse.php       |   2 +-
 modules/Admin/Language/de/Install.php         |  10 +-
 modules/Admin/Language/de/Page.php            |   2 +-
 modules/Admin/Language/de/Pager.php           |   8 +-
 modules/Admin/Language/de/Person.php          |   6 +-
 modules/Admin/Language/de/Podcast.php         |  28 +-
 modules/Admin/Language/de/PodcastImport.php   |   6 +-
 .../Admin/Language/de/PodcastNavigation.php   |   6 +-
 modules/Admin/Language/de/Settings.php        |   4 +-
 modules/Admin/Language/de/Soundbite.php       |  20 +-
 modules/Admin/Language/de/VideoClip.php       |  10 +-
 modules/Admin/Language/el/Charts.php          |   1 +
 modules/Admin/Language/el/Episode.php         |   1 +
 modules/Admin/Language/es/Charts.php          |   1 +
 modules/Admin/Language/es/Episode.php         |   1 +
 modules/Admin/Language/fa/Charts.php          |   1 +
 modules/Admin/Language/fa/Episode.php         |   1 +
 modules/Admin/Language/fr/AboutCastopod.php   |  16 +-
 modules/Admin/Language/fr/Breadcrumb.php      |   4 +-
 modules/Admin/Language/fr/Charts.php          |   1 +
 modules/Admin/Language/fr/Dashboard.php       |  18 +-
 modules/Admin/Language/fr/Episode.php         |   1 +
 modules/Admin/Language/fr/Notifications.php   |   8 +-
 modules/Admin/Language/fr/Podcast.php         |  50 +--
 .../Admin/Language/fr/PodcastNavigation.php   |   4 +-
 modules/Admin/Language/fr/Settings.php        |   4 +-
 modules/Admin/Language/fr2/Breadcrumb.php     |  55 +++
 modules/Admin/Language/fr2/Charts.php         |  41 ++
 modules/Admin/Language/fr2/Common.php         |  51 +++
 modules/Admin/Language/fr2/Countries.php      | 264 ++++++++++++
 modules/Admin/Language/fr2/Episode.php        | 214 ++++++++++
 .../Admin/Language/fr2/EpisodeNavigation.php  |  23 +
 modules/Admin/Language/fr2/Fediverse.php      |  32 ++
 modules/Admin/Language/fr2/Home.php           |  14 +
 modules/Admin/Language/fr2/Install.php        |  61 +++
 .../Admin/Language/fr_CA/AboutCastopod.php    |  22 +
 modules/Admin/Language/fr_CA/Breadcrumb.php   |  55 +++
 modules/Admin/Language/fr_CA/Charts.php       |  41 ++
 modules/Admin/Language/fr_CA/Common.php       |  51 +++
 modules/Admin/Language/fr_CA/Countries.php    | 264 ++++++++++++
 modules/Admin/Language/fr_CA/Dashboard.php    |  28 ++
 modules/Admin/Language/fr_CA/Episode.php      | 214 ++++++++++
 .../Language/fr_CA/EpisodeNavigation.php      |  23 +
 modules/Admin/Language/fr_CA/Fediverse.php    |  32 ++
 modules/Admin/Language/fr_CA/Home.php         |  14 +
 modules/Admin/Language/fr_CA/Install.php      |  61 +++
 modules/Admin/Language/fr_CA/Navigation.php   |  42 ++
 .../Admin/Language/fr_CA/Notifications.php    |  19 +
 modules/Admin/Language/fr_CA/Page.php         |  30 ++
 modules/Admin/Language/fr_CA/Pager.php        |  21 +
 modules/Admin/Language/fr_CA/Person.php       |  65 +++
 modules/Admin/Language/fr_CA/Platforms.php    |  30 ++
 modules/Admin/Language/fr_CA/Podcast.php      | 314 ++++++++++++++
 .../Admin/Language/fr_CA/PodcastImport.php    |  37 ++
 .../Language/fr_CA/PodcastNavigation.php      |  38 ++
 modules/Admin/Language/fr_CA/Settings.php     |  58 +++
 modules/Admin/Language/fr_CA/Soundbite.php    |  31 ++
 modules/Admin/Language/fr_CA/Validation.php   |  16 +
 modules/Admin/Language/fr_CA/VideoClip.php    |  72 ++++
 .../Admin/Language/fr_trad/AboutCastopod.php  |  22 +
 modules/Admin/Language/fr_trad/Breadcrumb.php |  55 +++
 modules/Admin/Language/fr_trad/Charts.php     |  41 ++
 modules/Admin/Language/fr_trad/Common.php     |  51 +++
 modules/Admin/Language/fr_trad/Countries.php  | 264 ++++++++++++
 modules/Admin/Language/fr_trad/Dashboard.php  |  28 ++
 modules/Admin/Language/fr_trad/Episode.php    | 213 ++++++++++
 .../Language/fr_trad/EpisodeNavigation.php    |  23 +
 modules/Admin/Language/fr_trad/Fediverse.php  |  32 ++
 modules/Admin/Language/fr_trad/Home.php       |  14 +
 modules/Admin/Language/fr_trad/Install.php    |  61 +++
 modules/Admin/Language/fr_trad/Navigation.php |  42 ++
 .../Admin/Language/fr_trad/Notifications.php  |  19 +
 modules/Admin/Language/fr_trad/Page.php       |  30 ++
 modules/Admin/Language/fr_trad/Pager.php      |  21 +
 modules/Admin/Language/fr_trad/Person.php     |  65 +++
 modules/Admin/Language/fr_trad/Platforms.php  |  30 ++
 modules/Admin/Language/fr_trad/Podcast.php    | 314 ++++++++++++++
 .../Admin/Language/fr_trad/PodcastImport.php  |  37 ++
 .../Language/fr_trad/PodcastNavigation.php    |  38 ++
 modules/Admin/Language/fr_trad/Settings.php   |  58 +++
 modules/Admin/Language/fr_trad/Soundbite.php  |  31 ++
 modules/Admin/Language/fr_trad/Validation.php |  16 +
 modules/Admin/Language/fr_trad/VideoClip.php  |  72 ++++
 modules/Admin/Language/gd/Charts.php          |   1 +
 modules/Admin/Language/gd/Episode.php         |   1 +
 modules/Admin/Language/gl/Charts.php          |   1 +
 modules/Admin/Language/gl/Countries.php       |  16 +-
 modules/Admin/Language/gl/Episode.php         |   1 +
 modules/Admin/Language/gl/Podcast.php         |  54 +--
 modules/Admin/Language/id/Charts.php          |   1 +
 modules/Admin/Language/id/Episode.php         |   1 +
 modules/Admin/Language/it/Charts.php          |   1 +
 modules/Admin/Language/it/Episode.php         |   1 +
 modules/Admin/Language/ko/Charts.php          |   1 +
 modules/Admin/Language/ko/Episode.php         |   1 +
 modules/Admin/Language/nl/Charts.php          |   1 +
 modules/Admin/Language/nl/Episode.php         |   1 +
 modules/Admin/Language/nn-NO/Breadcrumb.php   |   6 +-
 modules/Admin/Language/nn-NO/Charts.php       |   1 +
 modules/Admin/Language/nn-NO/Episode.php      |   1 +
 modules/Admin/Language/oc/Charts.php          |   1 +
 modules/Admin/Language/oc/Episode.php         |   1 +
 modules/Admin/Language/pl/AboutCastopod.php   |  16 +-
 modules/Admin/Language/pl/Breadcrumb.php      |  16 +-
 modules/Admin/Language/pl/Charts.php          |   5 +-
 modules/Admin/Language/pl/Common.php          |   4 +-
 modules/Admin/Language/pl/Countries.php       |  12 +-
 modules/Admin/Language/pl/Dashboard.php       |  20 +-
 modules/Admin/Language/pl/Episode.php         |  92 ++--
 modules/Admin/Language/pl/Fediverse.php       |   2 +-
 modules/Admin/Language/pl/Navigation.php      |   2 +-
 modules/Admin/Language/pl/Person.php          |   2 +-
 modules/Admin/Language/pl/Podcast.php         |  36 +-
 modules/Admin/Language/pl/PodcastImport.php   |   2 +-
 .../Admin/Language/pl/PodcastNavigation.php   |   4 +-
 modules/Admin/Language/pl/Settings.php        |   6 +-
 modules/Admin/Language/pl/VideoClip.php       |   2 +-
 modules/Admin/Language/pt-BR/Charts.php       |   1 +
 modules/Admin/Language/pt-BR/Episode.php      |   1 +
 .../Language/pt-BR/PodcastNavigation.php      |   4 +-
 modules/Admin/Language/pt-BR/Settings.php     |   4 +-
 modules/Admin/Language/pt/Charts.php          |   1 +
 modules/Admin/Language/pt/Episode.php         |   1 +
 modules/Admin/Language/ro/Charts.php          |   1 +
 modules/Admin/Language/ro/Episode.php         |   1 +
 modules/Admin/Language/ru/Charts.php          |   1 +
 modules/Admin/Language/ru/Episode.php         |   1 +
 modules/Admin/Language/sk/Breadcrumb.php      |   4 +-
 modules/Admin/Language/sk/Charts.php          |   1 +
 modules/Admin/Language/sk/Countries.php       |  58 +--
 modules/Admin/Language/sk/Episode.php         |   1 +
 .../Admin/Language/sk/EpisodeNavigation.php   |   4 +-
 modules/Admin/Language/sk/Fediverse.php       |  14 +-
 modules/Admin/Language/sk/Install.php         |  16 +-
 modules/Admin/Language/sk/Navigation.php      |   2 +-
 modules/Admin/Language/sk/Page.php            |  12 +-
 modules/Admin/Language/sk/Pager.php           |  12 +-
 modules/Admin/Language/sk/Person.php          |  40 +-
 modules/Admin/Language/sk/Platforms.php       |   2 +-
 modules/Admin/Language/sk/Podcast.php         |  98 ++---
 modules/Admin/Language/sr_Latn/Breadcrumb.php |  82 ++--
 modules/Admin/Language/sr_Latn/Charts.php     |  55 +--
 modules/Admin/Language/sr_Latn/Common.php     |  62 +--
 modules/Admin/Language/sr_Latn/Countries.php  | 346 +++++++--------
 modules/Admin/Language/sr_Latn/Episode.php    | 297 ++++++-------
 .../Language/sr_Latn/EpisodeNavigation.php    |  22 +-
 modules/Admin/Language/sr_Latn/Fediverse.php  |   4 +-
 modules/Admin/Language/sr_Latn/Navigation.php |  56 +--
 modules/Admin/Language/sr_Latn/Page.php       |  28 +-
 modules/Admin/Language/sr_Latn/Pager.php      |  14 +-
 modules/Admin/Language/sr_Latn/Person.php     |  76 ++--
 modules/Admin/Language/sr_Latn/Platforms.php  |  26 +-
 modules/Admin/Language/sr_Latn/Podcast.php    | 396 +++++++++---------
 .../Language/sr_Latn/PodcastNavigation.php    |   6 +-
 modules/Admin/Language/sr_Latn/Settings.php   |   6 +-
 modules/Admin/Language/sv/Charts.php          |   1 +
 modules/Admin/Language/sv/Episode.php         |   1 +
 modules/Admin/Language/uk/AboutCastopod.php   |  22 +
 modules/Admin/Language/uk/Breadcrumb.php      |  55 +++
 modules/Admin/Language/uk/Charts.php          |  41 ++
 modules/Admin/Language/uk/Common.php          |  51 +++
 modules/Admin/Language/uk/Countries.php       | 264 ++++++++++++
 modules/Admin/Language/uk/Dashboard.php       |  28 ++
 modules/Admin/Language/uk/Episode.php         | 214 ++++++++++
 .../Admin/Language/uk/EpisodeNavigation.php   |  23 +
 modules/Admin/Language/uk/Fediverse.php       |  32 ++
 modules/Admin/Language/uk/Home.php            |  14 +
 modules/Admin/Language/uk/Install.php         |  61 +++
 modules/Admin/Language/uk/Navigation.php      |  42 ++
 modules/Admin/Language/uk/Notifications.php   |  19 +
 modules/Admin/Language/uk/Page.php            |  30 ++
 modules/Admin/Language/uk/Pager.php           |  21 +
 modules/Admin/Language/uk/Person.php          |  65 +++
 modules/Admin/Language/uk/Platforms.php       |  30 ++
 modules/Admin/Language/uk/Podcast.php         | 314 ++++++++++++++
 modules/Admin/Language/uk/PodcastImport.php   |  37 ++
 .../Admin/Language/uk/PodcastNavigation.php   |  38 ++
 modules/Admin/Language/uk/Settings.php        |  58 +++
 modules/Admin/Language/uk/Soundbite.php       |  31 ++
 modules/Admin/Language/uk/Validation.php      |  16 +
 modules/Admin/Language/uk/VideoClip.php       |  72 ++++
 modules/Admin/Language/zh-Hans/Charts.php     |   1 +
 modules/Admin/Language/zh-Hans/Episode.php    |   1 +
 modules/Auth/Language/ca/Auth.php             |  98 ++---
 modules/Auth/Language/ca/Contributor.php      |  12 +-
 modules/Auth/Language/ca/User.php             |  16 +-
 modules/Auth/Language/de/Auth.php             |   8 +-
 modules/Auth/Language/de/Contributor.php      |   6 +-
 modules/Auth/Language/de/User.php             |  12 +-
 modules/Auth/Language/fr/Auth.php             | 102 ++---
 modules/Auth/Language/fr/Contributor.php      |  12 +-
 modules/Auth/Language/fr/User.php             |  16 +-
 modules/Auth/Language/fr_CA/Auth.php          |  94 +++++
 modules/Auth/Language/fr_CA/Contributor.php   |  47 +++
 modules/Auth/Language/fr_CA/MyAccount.php     |  18 +
 modules/Auth/Language/fr_CA/User.php          |  60 +++
 modules/Auth/Language/fr_trad/Auth.php        |  94 +++++
 modules/Auth/Language/fr_trad/Contributor.php |  47 +++
 modules/Auth/Language/fr_trad/MyAccount.php   |  18 +
 modules/Auth/Language/fr_trad/User.php        |  60 +++
 modules/Auth/Language/nl/Auth.php             |  16 +-
 modules/Auth/Language/nl/Contributor.php      |  12 +-
 modules/Auth/Language/nl/MyAccount.php        |   8 +-
 modules/Auth/Language/nl/User.php             |  66 +--
 modules/Auth/Language/pl/Contributor.php      |  12 +-
 modules/Auth/Language/pl/User.php             |  16 +-
 modules/Auth/Language/pt-BR/Contributor.php   |  12 +-
 modules/Auth/Language/uk/Auth.php             |  94 +++++
 modules/Auth/Language/uk/Contributor.php      |  47 +++
 modules/Auth/Language/uk/MyAccount.php        |  18 +
 modules/Auth/Language/uk/User.php             |  60 +++
 modules/Install/Language/de/Install.php       |   4 +-
 modules/Install/Language/fr_CA/Install.php    |  62 +++
 modules/Install/Language/fr_trad/Install.php  |  62 +++
 modules/Install/Language/sk/Install.php       |   2 +-
 modules/Install/Language/uk/Install.php       |  62 +++
 .../Language/de/PremiumPodcasts.php           |   4 +-
 .../Language/de/Subscription.php              |  62 +--
 .../Language/fr/PremiumPodcasts.php           |  36 +-
 .../Language/fr/Subscription.php              | 144 +++----
 .../Language/fr_CA/PremiumPodcasts.php        |  34 ++
 .../Language/fr_CA/Subscription.php           | 100 +++++
 .../Language/fr_trad/PremiumPodcasts.php      |  34 ++
 .../Language/fr_trad/Subscription.php         | 100 +++++
 .../Language/nl/PremiumPodcasts.php           |  36 +-
 .../Language/pl/PremiumPodcasts.php           |  36 +-
 .../Language/pl/Subscription.php              | 138 +++---
 .../Language/uk/PremiumPodcasts.php           |  34 ++
 .../Language/uk/Subscription.php              | 100 +++++
 345 files changed, 13628 insertions(+), 1972 deletions(-)
 create mode 100644 app/Language/fr2/Comment.php
 create mode 100644 app/Language/fr2/Common.php
 create mode 100644 app/Language/fr2/Episode.php
 create mode 100644 app/Language/fr2/Fediverse.php
 create mode 100644 app/Language/fr2/Home.php
 create mode 100644 app/Language/fr2/Page.php
 create mode 100644 app/Language/fr2/Podcast.php
 create mode 100644 app/Language/fr2/Post.php
 create mode 100644 app/Language/fr_CA/Comment.php
 create mode 100644 app/Language/fr_CA/Common.php
 create mode 100644 app/Language/fr_CA/Episode.php
 create mode 100644 app/Language/fr_CA/Fediverse.php
 create mode 100644 app/Language/fr_CA/Home.php
 create mode 100644 app/Language/fr_CA/Page.php
 create mode 100644 app/Language/fr_CA/Podcast.php
 create mode 100644 app/Language/fr_CA/Post.php
 create mode 100644 app/Language/fr_trad/Comment.php
 create mode 100644 app/Language/fr_trad/Common.php
 create mode 100644 app/Language/fr_trad/Episode.php
 create mode 100644 app/Language/fr_trad/Fediverse.php
 create mode 100644 app/Language/fr_trad/Home.php
 create mode 100644 app/Language/fr_trad/Page.php
 create mode 100644 app/Language/fr_trad/Podcast.php
 create mode 100644 app/Language/fr_trad/Post.php
 create mode 100644 app/Language/uk/Comment.php
 create mode 100644 app/Language/uk/Common.php
 create mode 100644 app/Language/uk/Episode.php
 create mode 100644 app/Language/uk/Fediverse.php
 create mode 100644 app/Language/uk/Home.php
 create mode 100644 app/Language/uk/Page.php
 create mode 100644 app/Language/uk/Podcast.php
 create mode 100644 app/Language/uk/Post.php
 create mode 100644 docs/src/fr2/getting-started/auth.md
 create mode 100644 docs/src/fr2/getting-started/install.md
 create mode 100644 docs/src/fr_CA/getting-started/auth.md
 create mode 100644 docs/src/fr_CA/getting-started/docker.md
 create mode 100644 docs/src/fr_CA/getting-started/install.md
 create mode 100644 docs/src/fr_CA/getting-started/security.md
 create mode 100644 docs/src/fr_CA/getting-started/update.md
 create mode 100644 docs/src/fr_CA/index.md
 create mode 100644 docs/src/fr_trad/getting-started/auth.md
 create mode 100644 docs/src/fr_trad/getting-started/docker.md
 create mode 100644 docs/src/fr_trad/getting-started/install.md
 create mode 100644 docs/src/fr_trad/getting-started/security.md
 create mode 100644 docs/src/fr_trad/getting-started/update.md
 create mode 100644 docs/src/fr_trad/index.md
 create mode 100644 docs/src/uk/getting-started/auth.md
 create mode 100644 docs/src/uk/getting-started/docker.md
 create mode 100644 docs/src/uk/getting-started/install.md
 create mode 100644 docs/src/uk/getting-started/security.md
 create mode 100644 docs/src/uk/getting-started/update.md
 create mode 100644 docs/src/uk/index.md
 create mode 100644 modules/Admin/Language/fr2/Breadcrumb.php
 create mode 100644 modules/Admin/Language/fr2/Charts.php
 create mode 100644 modules/Admin/Language/fr2/Common.php
 create mode 100644 modules/Admin/Language/fr2/Countries.php
 create mode 100644 modules/Admin/Language/fr2/Episode.php
 create mode 100644 modules/Admin/Language/fr2/EpisodeNavigation.php
 create mode 100644 modules/Admin/Language/fr2/Fediverse.php
 create mode 100644 modules/Admin/Language/fr2/Home.php
 create mode 100644 modules/Admin/Language/fr2/Install.php
 create mode 100644 modules/Admin/Language/fr_CA/AboutCastopod.php
 create mode 100644 modules/Admin/Language/fr_CA/Breadcrumb.php
 create mode 100644 modules/Admin/Language/fr_CA/Charts.php
 create mode 100644 modules/Admin/Language/fr_CA/Common.php
 create mode 100644 modules/Admin/Language/fr_CA/Countries.php
 create mode 100644 modules/Admin/Language/fr_CA/Dashboard.php
 create mode 100644 modules/Admin/Language/fr_CA/Episode.php
 create mode 100644 modules/Admin/Language/fr_CA/EpisodeNavigation.php
 create mode 100644 modules/Admin/Language/fr_CA/Fediverse.php
 create mode 100644 modules/Admin/Language/fr_CA/Home.php
 create mode 100644 modules/Admin/Language/fr_CA/Install.php
 create mode 100644 modules/Admin/Language/fr_CA/Navigation.php
 create mode 100644 modules/Admin/Language/fr_CA/Notifications.php
 create mode 100644 modules/Admin/Language/fr_CA/Page.php
 create mode 100644 modules/Admin/Language/fr_CA/Pager.php
 create mode 100644 modules/Admin/Language/fr_CA/Person.php
 create mode 100644 modules/Admin/Language/fr_CA/Platforms.php
 create mode 100644 modules/Admin/Language/fr_CA/Podcast.php
 create mode 100644 modules/Admin/Language/fr_CA/PodcastImport.php
 create mode 100644 modules/Admin/Language/fr_CA/PodcastNavigation.php
 create mode 100644 modules/Admin/Language/fr_CA/Settings.php
 create mode 100644 modules/Admin/Language/fr_CA/Soundbite.php
 create mode 100644 modules/Admin/Language/fr_CA/Validation.php
 create mode 100644 modules/Admin/Language/fr_CA/VideoClip.php
 create mode 100644 modules/Admin/Language/fr_trad/AboutCastopod.php
 create mode 100644 modules/Admin/Language/fr_trad/Breadcrumb.php
 create mode 100644 modules/Admin/Language/fr_trad/Charts.php
 create mode 100644 modules/Admin/Language/fr_trad/Common.php
 create mode 100644 modules/Admin/Language/fr_trad/Countries.php
 create mode 100644 modules/Admin/Language/fr_trad/Dashboard.php
 create mode 100644 modules/Admin/Language/fr_trad/Episode.php
 create mode 100644 modules/Admin/Language/fr_trad/EpisodeNavigation.php
 create mode 100644 modules/Admin/Language/fr_trad/Fediverse.php
 create mode 100644 modules/Admin/Language/fr_trad/Home.php
 create mode 100644 modules/Admin/Language/fr_trad/Install.php
 create mode 100644 modules/Admin/Language/fr_trad/Navigation.php
 create mode 100644 modules/Admin/Language/fr_trad/Notifications.php
 create mode 100644 modules/Admin/Language/fr_trad/Page.php
 create mode 100644 modules/Admin/Language/fr_trad/Pager.php
 create mode 100644 modules/Admin/Language/fr_trad/Person.php
 create mode 100644 modules/Admin/Language/fr_trad/Platforms.php
 create mode 100644 modules/Admin/Language/fr_trad/Podcast.php
 create mode 100644 modules/Admin/Language/fr_trad/PodcastImport.php
 create mode 100644 modules/Admin/Language/fr_trad/PodcastNavigation.php
 create mode 100644 modules/Admin/Language/fr_trad/Settings.php
 create mode 100644 modules/Admin/Language/fr_trad/Soundbite.php
 create mode 100644 modules/Admin/Language/fr_trad/Validation.php
 create mode 100644 modules/Admin/Language/fr_trad/VideoClip.php
 create mode 100644 modules/Admin/Language/uk/AboutCastopod.php
 create mode 100644 modules/Admin/Language/uk/Breadcrumb.php
 create mode 100644 modules/Admin/Language/uk/Charts.php
 create mode 100644 modules/Admin/Language/uk/Common.php
 create mode 100644 modules/Admin/Language/uk/Countries.php
 create mode 100644 modules/Admin/Language/uk/Dashboard.php
 create mode 100644 modules/Admin/Language/uk/Episode.php
 create mode 100644 modules/Admin/Language/uk/EpisodeNavigation.php
 create mode 100644 modules/Admin/Language/uk/Fediverse.php
 create mode 100644 modules/Admin/Language/uk/Home.php
 create mode 100644 modules/Admin/Language/uk/Install.php
 create mode 100644 modules/Admin/Language/uk/Navigation.php
 create mode 100644 modules/Admin/Language/uk/Notifications.php
 create mode 100644 modules/Admin/Language/uk/Page.php
 create mode 100644 modules/Admin/Language/uk/Pager.php
 create mode 100644 modules/Admin/Language/uk/Person.php
 create mode 100644 modules/Admin/Language/uk/Platforms.php
 create mode 100644 modules/Admin/Language/uk/Podcast.php
 create mode 100644 modules/Admin/Language/uk/PodcastImport.php
 create mode 100644 modules/Admin/Language/uk/PodcastNavigation.php
 create mode 100644 modules/Admin/Language/uk/Settings.php
 create mode 100644 modules/Admin/Language/uk/Soundbite.php
 create mode 100644 modules/Admin/Language/uk/Validation.php
 create mode 100644 modules/Admin/Language/uk/VideoClip.php
 create mode 100644 modules/Auth/Language/fr_CA/Auth.php
 create mode 100644 modules/Auth/Language/fr_CA/Contributor.php
 create mode 100644 modules/Auth/Language/fr_CA/MyAccount.php
 create mode 100644 modules/Auth/Language/fr_CA/User.php
 create mode 100644 modules/Auth/Language/fr_trad/Auth.php
 create mode 100644 modules/Auth/Language/fr_trad/Contributor.php
 create mode 100644 modules/Auth/Language/fr_trad/MyAccount.php
 create mode 100644 modules/Auth/Language/fr_trad/User.php
 create mode 100644 modules/Auth/Language/uk/Auth.php
 create mode 100644 modules/Auth/Language/uk/Contributor.php
 create mode 100644 modules/Auth/Language/uk/MyAccount.php
 create mode 100644 modules/Auth/Language/uk/User.php
 create mode 100644 modules/Install/Language/fr_CA/Install.php
 create mode 100644 modules/Install/Language/fr_trad/Install.php
 create mode 100644 modules/Install/Language/uk/Install.php
 create mode 100644 modules/PremiumPodcasts/Language/fr_CA/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/fr_CA/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/fr_trad/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/fr_trad/Subscription.php
 create mode 100644 modules/PremiumPodcasts/Language/uk/PremiumPodcasts.php
 create mode 100644 modules/PremiumPodcasts/Language/uk/Subscription.php

diff --git a/app/Language/de/Comment.php b/app/Language/de/Comment.php
index 1003f00085..e6eb466aa1 100644
--- a/app/Language/de/Comment.php
+++ b/app/Language/de/Comment.php
@@ -9,26 +9,26 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => "{actorDisplayName}'s Kommentar zu {episodeTitle}",
+    'title' => "Kommentar von {actorDisplayName} für {episodeTitle}",
     'back_to_comments' => 'Zurück zu den Kommentaren',
     'form' => [
         'episode_message_placeholder' => 'Schreibe einen Kommentar…',
-        'reply_to_placeholder' => 'Antwort zu @{actorUsername}',
+        'reply_to_placeholder' => 'Antworten auf @{actorUsername}',
         'submit' => 'Senden',
         'submit_reply' => 'Antwort senden',
     ],
     'likes' => '{numberOfLikes, plural,
-        one {# Like}
-        other {# Likes}
+        one {# Beitrag}
+        other {# Beiträge}
     }',
     'replies' => '{numberOfReplies, plural,
         one {# Antwort}
         other {# Antworten}
     }',
-    'like' => 'Liken',
-    'reply' => 'Antwort',
+    'like' => 'Gefällt mir',
+    'reply' => 'Antworten',
     'view_replies' => 'Antworten anzeigen ({numberOfReplies})',
-    'block_actor' => '@{actorUsername} blockieren',
+    'block_actor' => 'Benutzer @{actorUsername} blockieren',
     'block_domain' => 'Domain @{actorDomain} blockieren',
     'delete' => 'Kommentar löschen',
 ];
diff --git a/app/Language/de/Common.php b/app/Language/de/Common.php
index e2c2a6d588..bdbe64009c 100644
--- a/app/Language/de/Common.php
+++ b/app/Language/de/Common.php
@@ -16,14 +16,14 @@ return [
     'close' => 'Schließen',
     'home' => 'Startseite',
     'explicit' => 'Anstößig',
-    'powered_by' => 'Betrieben durch {castopod}',
+    'powered_by' => 'Betrieben mit {castopod}',
     'go_back' => 'Zurück',
     'play_episode_button' => [
         'play' => 'Abspielen',
         'playing' => 'Wird wiedergegeben',
     ],
-    'read_more' => 'Mehr lesen',
-    'read_less' => 'Weniger lesen',
+    'read_more' => 'Weiterlesen',
+    'read_less' => 'Weniger anzeigen',
     'see_more' => 'Mehr anzeigen',
     'see_less' => 'Weniger anzeigen',
     'legal_notice' => 'Impressum',
diff --git a/app/Language/de/Episode.php b/app/Language/de/Episode.php
index 5c1d9e83d7..793c86d1aa 100644
--- a/app/Language/de/Episode.php
+++ b/app/Language/de/Episode.php
@@ -11,23 +11,23 @@ declare(strict_types=1);
 return [
     'season' => 'Staffel {seasonNumber}',
     'season_abbr' => 'S{seasonNumber}',
-    'number' => 'Episode {episodeNumber}',
-    'number_abbr' => 'E {episodeNumber}',
+    'number' => 'Folge {episodeNumber}',
+    'number_abbr' => 'F {episodeNumber}',
     'season_episode' => 'Staffel {seasonNumber} Folge {episodeNumber}',
-    'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}F{episodeNumber}',
     'persons' => '{personsCount, plural,
         one {# Mitwirkender}
         other {# Mitwirkende}
     }',
     'persons_list' => 'Mitwirkende',
-    'back_to_episodes' => 'Zurück zu Episoden von {podcast}',
+    'back_to_episodes' => 'Zurück zu den Folgen von {podcast}',
     'comments' => 'Kommentare',
     'activity' => 'Aktivitäten',
-    'description' => 'Beschreibung der Episode',
+    'description' => 'Beschreibung der Folge',
     'number_of_comments' => '{numberOfComments, plural,
         one {# Kommentar}
         other {# Kommentare}
     }',
-    'all_podcast_episodes' => 'Alle Podcast-Episoden',
+    'all_podcast_episodes' => 'Alle Podcast-Folgen',
     'back_to_podcast' => 'Zurück zum Podcast',
 ];
diff --git a/app/Language/de/Fediverse.php b/app/Language/de/Fediverse.php
index 104797a3e5..99248ebaa8 100644
--- a/app/Language/de/Fediverse.php
+++ b/app/Language/de/Fediverse.php
@@ -10,7 +10,7 @@ declare(strict_types=1);
 
 return [
     'your_handle' => 'Handle',
-    'your_handle_hint' => '@name@domain eingeben, womit Sie agieren möchten.',
+    'your_handle_hint' => '@name@domain eingeben, in deren Name Sie agieren möchten.',
     'follow' => [
         'label' => 'Folge',
         'title' => 'Folge {actorDisplayName}',
@@ -20,18 +20,18 @@ return [
         'submit' => 'Weiter zum Folgen',
     ],
     'favourite' => [
-        'title' => "{actorDisplayName}'s Beitrag favorisieren",
+        'title' => "Beitrag von {actorDisplayName} favorisieren",
         'subtitle' => 'Sie werden favorisieren:',
-        'submit' => 'Weiter zum Favorisieren',
+        'submit' => 'Zum Favorisieren fortfahren',
     ],
     'reblog' => [
-        'title' => "{actorDisplayName}'s Beitrag teilen",
+        'title' => "Den Beitrag von {actorDisplayName} teilen",
         'subtitle' => 'Sie werden teilen:',
         'submit' => 'Weiter zum Teilen',
     ],
     'reply' => [
-        'title' => "Auf {actorDisplayName}'s Beitrag antworten",
-        'subtitle' => 'Sie werden antworten auf:',
+        'title' => "Auf den Beitrag von {actorDisplayName} antworten",
+        'subtitle' => 'Sie antworten auf:',
         'submit' => 'Weiter zum Antworten',
     ],
 ];
diff --git a/app/Language/de/Podcast.php b/app/Language/de/Podcast.php
index 238b680d3b..e22ecfe5b8 100644
--- a/app/Language/de/Podcast.php
+++ b/app/Language/de/Podcast.php
@@ -11,7 +11,7 @@ declare(strict_types=1);
 return [
     'feed' => 'RSS-Feed',
     'season' => 'Staffel {seasonNumber}',
-    'list_of_episodes_year' => '{year} Folgen ({episodeCount})',
+    'list_of_episodes_year' => '({episodeCount}) Folgen in {year}',
     'list_of_episodes_season' =>
         'Staffel {seasonNumber} Folgen ({episodeCount})',
     'no_episode' => 'Keine Folge gefunden',
diff --git a/app/Language/de/Post.php b/app/Language/de/Post.php
index 589c69076f..ec98d76256 100644
--- a/app/Language/de/Post.php
+++ b/app/Language/de/Post.php
@@ -9,13 +9,13 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => "{actorDisplayName}'s Beitrag",
-    'back_to_actor_posts' => 'Zurück zu {actor}\'s Beiträge',
+    'title' => "Beitrag von {actorDisplayName}",
+    'back_to_actor_posts' => 'Zurück zu den Beiträgen von {actor}',
     'actor_shared' => '{actor} teilte',
-    'reply_to' => 'Antorten auf @{actorUsername}',
+    'reply_to' => 'Antworten auf @{actorUsername}',
     'form' => [
         'message_placeholder' => 'Scheibe eine Nachricht…',
-        'episode_message_placeholder' => 'Schreibe eine Nachricht für die Episode…',
+        'episode_message_placeholder' => 'Schreibe eine Nachricht für die Folge…',
         'episode_url_placeholder' => 'URL der Episode',
         'reply_to_placeholder' => 'Antworten auf @{actorUsername}',
         'submit' => 'Senden',
diff --git a/app/Language/fr2/Comment.php b/app/Language/fr2/Comment.php
new file mode 100644
index 0000000000..6a18189e7f
--- /dev/null
+++ b/app/Language/fr2/Comment.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "Commentaire de {actorDisplayName} pour {episodeTitle}",
+    'back_to_comments' => 'Retour à la liste des commentaires',
+    'form' => [
+        'episode_message_placeholder' => 'Écrire un commentaire…',
+        'reply_to_placeholder' => 'Répondre à @{actorUsername}',
+        'submit' => 'Envoyer',
+        'submit_reply' => 'Répondre',
+    ],
+    'likes' => '{numberOfLikes, plural,
+        one {# "j\'aime"}
+        other {# "j\'aime"}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# réponse}
+        other {# réponses}
+    }',
+    'like' => 'J’aime',
+    'reply' => 'Répondre',
+    'view_replies' => 'Voir les réponses ({numberOfReplies})',
+    'block_actor' => 'Bloquer l’utilisateur @{actorUsername}',
+    'block_domain' => 'Bloquer le domaine @{actorDomain}',
+    'delete' => 'Supprimer le commentaire',
+];
diff --git a/app/Language/fr2/Common.php b/app/Language/fr2/Common.php
new file mode 100644
index 0000000000..c87b7fb47d
--- /dev/null
+++ b/app/Language/fr2/Common.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Oui',
+    'no' => 'Non',
+    'cancel' => 'Annuler',
+    'optional' => 'Optionnel',
+    'close' => 'Fermer',
+    'home' => 'Accueil',
+    'explicit' => 'Explicite',
+    'powered_by' => 'Propulsé par {castopod}',
+    'go_back' => 'Retour en arrière',
+    'play_episode_button' => [
+        'play' => 'Lire',
+        'playing' => 'En cours',
+    ],
+    'read_more' => 'Lire plus',
+    'read_less' => 'Lire moins',
+    'see_more' => 'Voir plus',
+    'see_less' => 'Voir moins',
+    'legal_notice' => 'Mentions légales',
+];
diff --git a/app/Language/fr2/Episode.php b/app/Language/fr2/Episode.php
new file mode 100644
index 0000000000..96d6a3ca3f
--- /dev/null
+++ b/app/Language/fr2/Episode.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Saison {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Épisode {episodeNumber}',
+    'number_abbr' => 'Ép. {episodeNumber}',
+    'season_episode' => 'Saison {seasonNumber} épisode {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
+    'persons' => '{personsCount, plural,
+        one {# intervenant}
+        other {# intervenants}
+    }',
+    'persons_list' => 'Intervenants',
+    'back_to_episodes' => 'Retour aux épisodes de {podcast}',
+    'comments' => 'Commentaires',
+    'activity' => 'Activité',
+    'description' => 'Description de l’épisode',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# commentaire}
+        other {# commentaires}
+    }',
+    'all_podcast_episodes' => 'Tous les épisodes du podcast',
+    'back_to_podcast' => 'Revenir au podcast',
+];
diff --git a/app/Language/fr2/Fediverse.php b/app/Language/fr2/Fediverse.php
new file mode 100644
index 0000000000..73628768cb
--- /dev/null
+++ b/app/Language/fr2/Fediverse.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'your_handle' => 'Votre pseudonyme',
+    'your_handle_hint' => 'Entrez l\'@utilisateur@domaine avec lequel vous voulez interagir.',
+    'follow' => [
+        'label' => 'Suivre',
+        'title' => 'Suivre {actorDisplayName}',
+        'subtitle' => 'Vous allez suivre :',
+        'accountNotFound' => 'Le compte n’a pas pu être trouvé.',
+        'remoteFollowNotAllowed' => 'Il semble que le serveur du compte ne permet pas le suivi d’un compte externe…',
+        'submit' => 'Poursuivre',
+    ],
+    'favourite' => [
+        'title' => "Mettre la publication de {actorDisplayName} en favori",
+        'subtitle' => 'Vous allez mettre en favori :',
+        'submit' => 'Poursuivre',
+    ],
+    'reblog' => [
+        'title' => "Partager la publication de {actorDisplayName}",
+        'subtitle' => 'Vous allez partager :',
+        'submit' => 'Poursuivre',
+    ],
+    'reply' => [
+        'title' => "Répondre à la publication de {actorDisplayName}",
+        'subtitle' => 'Vous allez répondre à :',
+        'submit' => 'Poursuivre',
+    ],
+];
diff --git a/app/Language/fr2/Home.php b/app/Language/fr2/Home.php
new file mode 100644
index 0000000000..5a8f5f8a28
--- /dev/null
+++ b/app/Language/fr2/Home.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'Tous les podcasts',
+    'sort_by' => 'Trier par',
+    'sort_options' => [
+        'activity' => 'Activité récente',
+        'created_desc' => 'Le plus récent d’abord',
+        'created_asc' => 'Le plus ancien d’abord',
+    ],
+    'no_podcast' => 'Aucun podcast trouvé',
+];
diff --git a/app/Language/fr2/Page.php b/app/Language/fr2/Page.php
new file mode 100644
index 0000000000..cd11a7cff1
--- /dev/null
+++ b/app/Language/fr2/Page.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'back_to_home' => 'Retour à l’accueil',
+    'map' => [
+        'title' => 'Cartographie',
+        'description' => 'Découvrez des épisodes de podcast placés sur une carte avec {siteName}  ! Voyagez sur une carte du monde et écoutez des épisodes mentionnant des lieux spécifiques.',
+    ],
+];
diff --git a/app/Language/fr2/Podcast.php b/app/Language/fr2/Podcast.php
new file mode 100644
index 0000000000..5b0af2e7e9
--- /dev/null
+++ b/app/Language/fr2/Podcast.php
@@ -0,0 +1,53 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'feed' => 'Flux RSS du Podcast',
+    'season' => 'Saison {seasonNumber}',
+    'list_of_episodes_year' => 'Épisodes de {year} ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Épisodes de la saison {seasonNumber} ({episodeCount})',
+    'no_episode' => 'Aucun épisode trouvé  !',
+    'follow' => 'Suivre',
+    'followTitle' => 'Suivre {actorDisplayName} sur le fédiverse  !',
+    'followers' => '{numberOfFollowers, plural,
+        one {# abonné}
+        other {# abonnés}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {# publication}
+        other {# publications}
+    }',
+    'activity' => 'Activité',
+    'episodes' => 'Épisodes',
+    'episodes_title' => 'Épisodes de {podcastTitle}',
+    'about' => 'À propos',
+    'stats' => [
+        'title' => 'Statistiques',
+        'number_of_seasons' => '{0, plural,
+            one {# saison}
+            other {# saisons}
+        }',
+        'number_of_episodes' => '{0, plural,
+            one {# épisode}
+            other {# épisodes}
+        }',
+        'first_published_at' => 'Premier épisode publié le {0, date, medium}',
+    ],
+    'sponsor' => 'Soutenir',
+    'funding_links' => 'Liens de financement pour {podcastTitle}',
+    'find_on' => 'Trouvez {podcastTitle} sur',
+    'listen_on' => 'Écoutez sur',
+    'persons' => '{personsCount, plural,
+        one {# intervenant}
+        other {# intervenants}
+    }',
+    'persons_list' => 'Intervenants',
+];
diff --git a/app/Language/fr2/Post.php b/app/Language/fr2/Post.php
new file mode 100644
index 0000000000..6bdcb49bf5
--- /dev/null
+++ b/app/Language/fr2/Post.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "Publication de {actorDisplayName}",
+    'back_to_actor_posts' => 'Retour aux publications de {actor}',
+    'actor_shared' => '{actor} a partagé',
+    'reply_to' => 'Répondre à @{actorUsername}',
+    'form' => [
+        'message_placeholder' => 'Écrivez votre message…',
+        'episode_message_placeholder' => 'Écrivez votre message pour l’épisode…',
+        'episode_url_placeholder' => 'URL de l’épisode',
+        'reply_to_placeholder' => 'Répondre à @{actorUsername}',
+        'submit' => 'Envoyer ',
+        'submit_reply' => 'Répondre',
+    ],
+    'favourites' => '{numberOfFavourites, plural,
+        one {# favori}
+        other {# favoris}
+    }',
+    'reblogs' => '{numberOfReblogs, plural,
+        one {# partage}
+        other {# partages}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# réponse}
+        other {# réponses}
+    }',
+    'expand' => 'Étendre la publication',
+    'block_actor' => 'Bloquer l’utilisateur @{actorUsername}',
+    'block_domain' => 'Bloquer le domaine @{actorDomain}',
+    'delete' => 'Supprimer la publication',
+];
diff --git a/app/Language/fr_CA/Comment.php b/app/Language/fr_CA/Comment.php
new file mode 100644
index 0000000000..1dd8f5eadc
--- /dev/null
+++ b/app/Language/fr_CA/Comment.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "{actorDisplayName}'s comment for {episodeTitle}",
+    'back_to_comments' => 'Back to comments',
+    'form' => [
+        'episode_message_placeholder' => 'Write a comment…',
+        'reply_to_placeholder' => 'Reply to @{actorUsername}',
+        'submit' => 'Send',
+        'submit_reply' => 'Reply',
+    ],
+    'likes' => '{numberOfLikes, plural,
+        one {# like}
+        other {# likes}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'like' => 'Like',
+    'reply' => 'Reply',
+    'view_replies' => 'View replies ({numberOfReplies})',
+    'block_actor' => 'Block user @{actorUsername}',
+    'block_domain' => 'Block domain @{actorDomain}',
+    'delete' => 'Delete comment',
+];
diff --git a/app/Language/fr_CA/Common.php b/app/Language/fr_CA/Common.php
new file mode 100644
index 0000000000..1258afcc19
--- /dev/null
+++ b/app/Language/fr_CA/Common.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Yes',
+    'no' => 'No',
+    'cancel' => 'Cancel',
+    'optional' => 'Optional',
+    'close' => 'Close',
+    'home' => 'Home',
+    'explicit' => 'Explicit',
+    'powered_by' => 'Powered by {castopod}',
+    'go_back' => 'Go back',
+    'play_episode_button' => [
+        'play' => 'Play',
+        'playing' => 'Playing',
+    ],
+    'read_more' => 'Read more',
+    'read_less' => 'Read less',
+    'see_more' => 'See more',
+    'see_less' => 'See less',
+    'legal_notice' => 'Legal notice',
+];
diff --git a/app/Language/fr_CA/Episode.php b/app/Language/fr_CA/Episode.php
new file mode 100644
index 0000000000..ebe39336fc
--- /dev/null
+++ b/app/Language/fr_CA/Episode.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Season {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Episode {episodeNumber}',
+    'number_abbr' => 'Ep. {episodeNumber}',
+    'season_episode' => 'Season {seasonNumber} episode {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',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# comment}
+        other {# comments}
+    }',
+    'all_podcast_episodes' => 'All podcast episodes',
+    'back_to_podcast' => 'Go back to podcast',
+];
diff --git a/app/Language/fr_CA/Fediverse.php b/app/Language/fr_CA/Fediverse.php
new file mode 100644
index 0000000000..32f54c074f
--- /dev/null
+++ b/app/Language/fr_CA/Fediverse.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'your_handle' => 'Your handle',
+    'your_handle_hint' => 'Enter the @username@domain you want to act from.',
+    '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',
+    ],
+    'favourite' => [
+        'title' => "Favourite {actorDisplayName}'s post",
+        'subtitle' => 'You are going to favourite:',
+        'submit' => 'Proceed to favourite',
+    ],
+    'reblog' => [
+        'title' => "Share {actorDisplayName}'s post",
+        'subtitle' => 'You are going to share:',
+        'submit' => 'Proceed to share',
+    ],
+    'reply' => [
+        'title' => "Reply to {actorDisplayName}'s post",
+        'subtitle' => 'You are going to reply to:',
+        'submit' => 'Proceed to reply',
+    ],
+];
diff --git a/app/Language/fr_CA/Home.php b/app/Language/fr_CA/Home.php
new file mode 100644
index 0000000000..1518239bd9
--- /dev/null
+++ b/app/Language/fr_CA/Home.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'sort_by' => 'Sort by',
+    'sort_options' => [
+        'activity' => 'Recent activity',
+        'created_desc' => 'Newest first',
+        'created_asc' => 'Oldest first',
+    ],
+    'no_podcast' => 'No podcast found',
+];
diff --git a/app/Language/fr_CA/Page.php b/app/Language/fr_CA/Page.php
new file mode 100644
index 0000000000..7cd606694e
--- /dev/null
+++ b/app/Language/fr_CA/Page.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'back_to_home' => 'Back to 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.',
+    ],
+];
diff --git a/app/Language/fr_CA/Podcast.php b/app/Language/fr_CA/Podcast.php
new file mode 100644
index 0000000000..9b1e749aa1
--- /dev/null
+++ b/app/Language/fr_CA/Podcast.php
@@ -0,0 +1,53 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'feed' => 'RSS Podcast feed',
+    'season' => 'Season {seasonNumber}',
+    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Season {seasonNumber} episodes ({episodeCount})',
+    'no_episode' => 'No episode found!',
+    'follow' => 'Follow',
+    'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
+    'followers' => '{numberOfFollowers, plural,
+        one {# follower}
+        other {# followers}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {# post}
+        other {# posts}
+    }',
+    'activity' => 'Activity',
+    'episodes' => 'Episodes',
+    'episodes_title' => 'Episodes of {podcastTitle}',
+    'about' => 'About',
+    'stats' => [
+        'title' => 'Stats',
+        'number_of_seasons' => '{0, plural,
+            one {# season}
+            other {# seasons}
+        }',
+        'number_of_episodes' => '{0, plural,
+            one {# episode}
+            other {# episodes}
+        }',
+        'first_published_at' => 'First episode published on {0, date, medium}',
+    ],
+    'sponsor' => 'Sponsor',
+    'funding_links' => 'Funding links for {podcastTitle}',
+    'find_on' => 'Find {podcastTitle} on',
+    'listen_on' => 'Listen on',
+    'persons' => '{personsCount, plural,
+        one {# person}
+        other {# persons}
+    }',
+    'persons_list' => 'Persons',
+];
diff --git a/app/Language/fr_CA/Post.php b/app/Language/fr_CA/Post.php
new file mode 100644
index 0000000000..58d1cf8002
--- /dev/null
+++ b/app/Language/fr_CA/Post.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "{actorDisplayName}'s post",
+    'back_to_actor_posts' => 'Back to {actor} posts',
+    'actor_shared' => '{actor} shared',
+    'reply_to' => 'Reply to @{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',
+    ],
+    'favourites' => '{numberOfFavourites, plural,
+        one {# favourite}
+        other {# favourites}
+    }',
+    'reblogs' => '{numberOfReblogs, plural,
+        one {# share}
+        other {# shares}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'expand' => 'Expand post',
+    'block_actor' => 'Block user @{actorUsername}',
+    'block_domain' => 'Block domain @{actorDomain}',
+    'delete' => 'Delete post',
+];
diff --git a/app/Language/fr_trad/Comment.php b/app/Language/fr_trad/Comment.php
new file mode 100644
index 0000000000..1dd8f5eadc
--- /dev/null
+++ b/app/Language/fr_trad/Comment.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "{actorDisplayName}'s comment for {episodeTitle}",
+    'back_to_comments' => 'Back to comments',
+    'form' => [
+        'episode_message_placeholder' => 'Write a comment…',
+        'reply_to_placeholder' => 'Reply to @{actorUsername}',
+        'submit' => 'Send',
+        'submit_reply' => 'Reply',
+    ],
+    'likes' => '{numberOfLikes, plural,
+        one {# like}
+        other {# likes}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'like' => 'Like',
+    'reply' => 'Reply',
+    'view_replies' => 'View replies ({numberOfReplies})',
+    'block_actor' => 'Block user @{actorUsername}',
+    'block_domain' => 'Block domain @{actorDomain}',
+    'delete' => 'Delete comment',
+];
diff --git a/app/Language/fr_trad/Common.php b/app/Language/fr_trad/Common.php
new file mode 100644
index 0000000000..1258afcc19
--- /dev/null
+++ b/app/Language/fr_trad/Common.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Yes',
+    'no' => 'No',
+    'cancel' => 'Cancel',
+    'optional' => 'Optional',
+    'close' => 'Close',
+    'home' => 'Home',
+    'explicit' => 'Explicit',
+    'powered_by' => 'Powered by {castopod}',
+    'go_back' => 'Go back',
+    'play_episode_button' => [
+        'play' => 'Play',
+        'playing' => 'Playing',
+    ],
+    'read_more' => 'Read more',
+    'read_less' => 'Read less',
+    'see_more' => 'See more',
+    'see_less' => 'See less',
+    'legal_notice' => 'Legal notice',
+];
diff --git a/app/Language/fr_trad/Episode.php b/app/Language/fr_trad/Episode.php
new file mode 100644
index 0000000000..ebe39336fc
--- /dev/null
+++ b/app/Language/fr_trad/Episode.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Season {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Episode {episodeNumber}',
+    'number_abbr' => 'Ep. {episodeNumber}',
+    'season_episode' => 'Season {seasonNumber} episode {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',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# comment}
+        other {# comments}
+    }',
+    'all_podcast_episodes' => 'All podcast episodes',
+    'back_to_podcast' => 'Go back to podcast',
+];
diff --git a/app/Language/fr_trad/Fediverse.php b/app/Language/fr_trad/Fediverse.php
new file mode 100644
index 0000000000..32f54c074f
--- /dev/null
+++ b/app/Language/fr_trad/Fediverse.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'your_handle' => 'Your handle',
+    'your_handle_hint' => 'Enter the @username@domain you want to act from.',
+    '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',
+    ],
+    'favourite' => [
+        'title' => "Favourite {actorDisplayName}'s post",
+        'subtitle' => 'You are going to favourite:',
+        'submit' => 'Proceed to favourite',
+    ],
+    'reblog' => [
+        'title' => "Share {actorDisplayName}'s post",
+        'subtitle' => 'You are going to share:',
+        'submit' => 'Proceed to share',
+    ],
+    'reply' => [
+        'title' => "Reply to {actorDisplayName}'s post",
+        'subtitle' => 'You are going to reply to:',
+        'submit' => 'Proceed to reply',
+    ],
+];
diff --git a/app/Language/fr_trad/Home.php b/app/Language/fr_trad/Home.php
new file mode 100644
index 0000000000..1518239bd9
--- /dev/null
+++ b/app/Language/fr_trad/Home.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'sort_by' => 'Sort by',
+    'sort_options' => [
+        'activity' => 'Recent activity',
+        'created_desc' => 'Newest first',
+        'created_asc' => 'Oldest first',
+    ],
+    'no_podcast' => 'No podcast found',
+];
diff --git a/app/Language/fr_trad/Page.php b/app/Language/fr_trad/Page.php
new file mode 100644
index 0000000000..7cd606694e
--- /dev/null
+++ b/app/Language/fr_trad/Page.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'back_to_home' => 'Back to 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.',
+    ],
+];
diff --git a/app/Language/fr_trad/Podcast.php b/app/Language/fr_trad/Podcast.php
new file mode 100644
index 0000000000..9b1e749aa1
--- /dev/null
+++ b/app/Language/fr_trad/Podcast.php
@@ -0,0 +1,53 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'feed' => 'RSS Podcast feed',
+    'season' => 'Season {seasonNumber}',
+    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Season {seasonNumber} episodes ({episodeCount})',
+    'no_episode' => 'No episode found!',
+    'follow' => 'Follow',
+    'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
+    'followers' => '{numberOfFollowers, plural,
+        one {# follower}
+        other {# followers}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {# post}
+        other {# posts}
+    }',
+    'activity' => 'Activity',
+    'episodes' => 'Episodes',
+    'episodes_title' => 'Episodes of {podcastTitle}',
+    'about' => 'About',
+    'stats' => [
+        'title' => 'Stats',
+        'number_of_seasons' => '{0, plural,
+            one {# season}
+            other {# seasons}
+        }',
+        'number_of_episodes' => '{0, plural,
+            one {# episode}
+            other {# episodes}
+        }',
+        'first_published_at' => 'First episode published on {0, date, medium}',
+    ],
+    'sponsor' => 'Sponsor',
+    'funding_links' => 'Funding links for {podcastTitle}',
+    'find_on' => 'Find {podcastTitle} on',
+    'listen_on' => 'Listen on',
+    'persons' => '{personsCount, plural,
+        one {# person}
+        other {# persons}
+    }',
+    'persons_list' => 'Persons',
+];
diff --git a/app/Language/fr_trad/Post.php b/app/Language/fr_trad/Post.php
new file mode 100644
index 0000000000..58d1cf8002
--- /dev/null
+++ b/app/Language/fr_trad/Post.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "{actorDisplayName}'s post",
+    'back_to_actor_posts' => 'Back to {actor} posts',
+    'actor_shared' => '{actor} shared',
+    'reply_to' => 'Reply to @{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',
+    ],
+    'favourites' => '{numberOfFavourites, plural,
+        one {# favourite}
+        other {# favourites}
+    }',
+    'reblogs' => '{numberOfReblogs, plural,
+        one {# share}
+        other {# shares}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'expand' => 'Expand post',
+    'block_actor' => 'Block user @{actorUsername}',
+    'block_domain' => 'Block domain @{actorDomain}',
+    'delete' => 'Delete post',
+];
diff --git a/app/Language/pl/Common.php b/app/Language/pl/Common.php
index 045ea18180..5009c01ffc 100644
--- a/app/Language/pl/Common.php
+++ b/app/Language/pl/Common.php
@@ -26,5 +26,5 @@ return [
     'read_less' => 'Czytaj mniej',
     'see_more' => 'Zobacz więcej',
     'see_less' => 'Zobacz mniej',
-    'legal_notice' => 'Legal notice',
+    'legal_notice' => 'Informacje prawne',
 ];
diff --git a/app/Language/pl/Fediverse.php b/app/Language/pl/Fediverse.php
index d46bbff768..93923303b2 100644
--- a/app/Language/pl/Fediverse.php
+++ b/app/Language/pl/Fediverse.php
@@ -16,7 +16,7 @@ return [
         'title' => 'Obserwuj {actorDisplayName}',
         'subtitle' => 'Zamierzasz obserwować:',
         'accountNotFound' => 'Nie można znaleźć konta.',
-        'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
+        'remoteFollowNotAllowed' => 'Wygląda na to, że serwer kont nie pozwala na śledzenie zdalnie…',
         'submit' => 'Przejdź do obserwowania',
     ],
     'favourite' => [
diff --git a/app/Language/pl/Podcast.php b/app/Language/pl/Podcast.php
index d04dd1581b..c72d00c388 100644
--- a/app/Language/pl/Podcast.php
+++ b/app/Language/pl/Podcast.php
@@ -18,12 +18,14 @@ return [
     'follow' => 'Obserwuj',
     'followTitle' => 'Obserwuj {actorDisplayName} na fediverse!',
     'followers' => '{numberOfFollowers, plural,
-        one {# follower}
-        other {# followers}
+        one {# polubienie}
+        few {# polubienia}
+        other {# polubień}
     }',
     'posts' => '{numberOfPosts, plural,
-        one {# post}
-        other {# posts}
+        one {# osoba}
+        few {# osoby}
+        other {# osób}
     }',
     'activity' => 'Aktywność',
     'episodes' => 'Odcinki',
@@ -32,14 +34,16 @@ return [
     'stats' => [
         'title' => 'Statystyki',
         'number_of_seasons' => '{0, plural,
-            one {# season}
-            other {# seasons}
-        }',
+        one {# osoba}
+        few {# osoby}
+        other {# osób}
+    }',
         'number_of_episodes' => '{0, plural,
-            one {# episode}
-            other {# episodes}
-        }',
-        'first_published_at' => 'First episode published on {0, date, medium}',
+        one {# osoba}
+        few {# osoby}
+        other {# osób}
+    }',
+        'first_published_at' => 'Pierwszy odcinek opublikowany {0, date, medium}',
     ],
     'sponsor' => 'Sponsoruj',
     'funding_links' => 'Linki finansowania dla {podcastTitle}',
diff --git a/app/Language/sr_Latn/Comment.php b/app/Language/sr_Latn/Comment.php
index 18d52b7251..38cdd5f0c9 100644
--- a/app/Language/sr_Latn/Comment.php
+++ b/app/Language/sr_Latn/Comment.php
@@ -18,12 +18,12 @@ return [
         'submit_reply' => 'Odgovori',
     ],
     'likes' => '{numberOfLikes, plural,
-        one {# like}
-        other {# likes}
+        one {# sviđanje}
+        other {# sviđanja}
     }',
     'replies' => '{numberOfReplies, plural,
-        one {# reply}
-        other {# replies}
+        one {# odgovor}
+        other {# odgovora}
     }',
     'like' => 'Preporuči',
     'reply' => 'Odgovori',
diff --git a/app/Language/sr_Latn/Episode.php b/app/Language/sr_Latn/Episode.php
index 6ae1d2eb75..cd15419b66 100644
--- a/app/Language/sr_Latn/Episode.php
+++ b/app/Language/sr_Latn/Episode.php
@@ -16,17 +16,17 @@ return [
     'season_episode' => 'Sezona {seasonNumber} epizoda {episodeNumber}',
     'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
     'persons' => '{personsCount, plural,
-        one {# person}
-        other {# persons}
-    }',
+        few {# osobe}
+        other {# osoba}
+}',
     'persons_list' => 'Ličnosti',
     'back_to_episodes' => 'Nazad na epizode {podcast}',
     'comments' => 'Komentari',
     'activity' => 'Aktivnosti',
     'description' => 'Opis epizode',
     'number_of_comments' => '{numberOfComments, plural,
-        one {# comment}
-        other {# comments}
+        one {# komentar}
+        other {# komentara}
     }',
     'all_podcast_episodes' => 'Sve epizode podkasta',
     'back_to_podcast' => 'Nazad na podkast',
diff --git a/app/Language/sr_Latn/Fediverse.php b/app/Language/sr_Latn/Fediverse.php
index b5ff9c18ce..93c5e1adbc 100644
--- a/app/Language/sr_Latn/Fediverse.php
+++ b/app/Language/sr_Latn/Fediverse.php
@@ -16,7 +16,7 @@ return [
         'title' => 'Prati {actorDisplayName}',
         'subtitle' => 'Pratićete:',
         'accountNotFound' => 'Nalog ne može biti pronađen.',
-        'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
+        'remoteFollowNotAllowed' => 'Čini se da server naloga ne dozvoljava daljinsko praćenje…',
         'submit' => 'Nastavite',
     ],
     'favourite' => [
diff --git a/app/Language/sr_Latn/Podcast.php b/app/Language/sr_Latn/Podcast.php
index 1412012dd1..c412e8abd2 100644
--- a/app/Language/sr_Latn/Podcast.php
+++ b/app/Language/sr_Latn/Podcast.php
@@ -14,40 +14,40 @@ return [
     'list_of_episodes_year' => '{year} epizode ({episodeCount})',
     'list_of_episodes_season' =>
         'Sezona {seasonNumber} epizoda ({episodeCount})',
-    'no_episode' => 'Bez epizoda!',
+    'no_episode' => 'Nijedna epizode nije pronađena!',
     'follow' => 'Prati',
     'followTitle' => 'Prati {actorDisplayName} na fediverse!',
     'followers' => '{numberOfFollowers, plural,
-        one {# follower}
-        other {# followers}
+        one {# pratioc}
+        other {# pratilaca}
     }',
     'posts' => '{numberOfPosts, plural,
-        one {# post}
-        other {# posts}
+        few {# objave}
+        other {# objava}
     }',
-    'activity' => 'Aktivnosti',
+    'activity' => 'Aktivnost',
     'episodes' => 'Epizode',
     'episodes_title' => 'Epizode {podcastTitle}',
-    'about' => 'O',
+    'about' => 'Osnovni podaci',
     'stats' => [
         'title' => 'Statistika',
         'number_of_seasons' => '{0, plural,
-            one {# season}
-            other {# seasons}
+            few {# sezone}
+            other {# sezona}
         }',
         'number_of_episodes' => '{0, plural,
-            one {# episode}
-            other {# episodes}
+            one {# epizoda}
+            other {# epizode}
         }',
         'first_published_at' => 'Prva epizoda objavljena na {0, date, medium}',
     ],
     'sponsor' => 'Sponzor',
-    'funding_links' => 'Funding links for {podcastTitle}',
+    'funding_links' => 'Linkovi za finansiranje {podcastTitle}',
     'find_on' => 'Pronađi {podcastTitle} na',
     'listen_on' => 'Slušaj na',
     'persons' => '{personsCount, plural,
-        one {# person}
-        other {# persons}
+        one {# osoba}
+        other {# osobe}
     }',
     'persons_list' => 'Ličnosti',
 ];
diff --git a/app/Language/sr_Latn/Post.php b/app/Language/sr_Latn/Post.php
index 65f072bdb9..94f4fbacec 100644
--- a/app/Language/sr_Latn/Post.php
+++ b/app/Language/sr_Latn/Post.php
@@ -22,16 +22,16 @@ return [
         'submit_reply' => 'Odgovori',
     ],
     'favourites' => '{numberOfFavourites, plural,
-        one {# favourite}
-        other {# favourites}
+        one {# omiljen}
+        other {# omiljenih}
     }',
     'reblogs' => '{numberOfReblogs, plural,
-        one {# share}
-        other {# shares}
+        one {# deljenje}
+        other {# deljenja}
     }',
     'replies' => '{numberOfReplies, plural,
-        one {# reply}
-        other {# replies}
+        one {# odgovor}
+        other {# odgovora}
     }',
     'expand' => 'Proširi objavu',
     'block_actor' => 'Blokiraj korisnika @{actorUsername}',
diff --git a/app/Language/uk/Comment.php b/app/Language/uk/Comment.php
new file mode 100644
index 0000000000..f6dca2cd05
--- /dev/null
+++ b/app/Language/uk/Comment.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "{actorDisplayName}'s comment for {episodeTitle}",
+    'back_to_comments' => 'Повернутися до коментарів',
+    'form' => [
+        'episode_message_placeholder' => 'Написати коментар…',
+        'reply_to_placeholder' => 'Відповісти @{actorUsername}',
+        'submit' => 'Відправити',
+        'submit_reply' => 'Відповісти',
+    ],
+    'likes' => '{numberOfLikes, plural,
+        one {# like}
+        other {# likes}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'like' => 'Вподобайка',
+    'reply' => 'Відповідь',
+    'view_replies' => 'Переглянути відповіді ({numberOfReplies})',
+    'block_actor' => 'Заблокувати користувача @{actorUsername}',
+    'block_domain' => 'Заблокувати домен @{actorDomain}',
+    'delete' => 'Видалити коментар',
+];
diff --git a/app/Language/uk/Common.php b/app/Language/uk/Common.php
new file mode 100644
index 0000000000..cce0179298
--- /dev/null
+++ b/app/Language/uk/Common.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Так',
+    'no' => 'Ні',
+    'cancel' => 'Відмінити',
+    'optional' => 'Необов\'язково',
+    'close' => 'Закрити',
+    'home' => 'Головна',
+    'explicit' => 'Явний',
+    'powered_by' => 'Створено {castopod}',
+    'go_back' => 'Повернутися назад',
+    'play_episode_button' => [
+        'play' => 'Відтворити',
+        'playing' => 'Відтворюється',
+    ],
+    'read_more' => 'Читати більше',
+    'read_less' => 'Приховати деталі',
+    'see_more' => 'Показати більше',
+    'see_less' => 'Показати менше',
+    'legal_notice' => 'Юридичне повідомлення',
+];
diff --git a/app/Language/uk/Episode.php b/app/Language/uk/Episode.php
new file mode 100644
index 0000000000..fdd046cf64
--- /dev/null
+++ b/app/Language/uk/Episode.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Сезон {seasonNumber}',
+    'season_abbr' => 'С{seasonNumber}',
+    'number' => 'Серія {episodeNumber}',
+    'number_abbr' => 'Серія {episodeNumber}',
+    'season_episode' => 'Сезон {seasonNumber} серія {episodeNumber}',
+    'season_episode_abbr' => 'С{seasonNumber}:Е{episodeNumber}',
+    'persons' => '{personsCount, plural,
+        one {# person}
+        other {# persons}
+    }',
+    'persons_list' => 'Кіл-сть осіб',
+    'back_to_episodes' => 'Повернутись до серій {podcast}',
+    'comments' => 'Коментарі',
+    'activity' => 'Активність',
+    'description' => 'Опис Серії',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# comment}
+        other {# comments}
+    }',
+    'all_podcast_episodes' => 'Всі серії подкастів',
+    'back_to_podcast' => 'Повернутися до подкасту',
+];
diff --git a/app/Language/uk/Fediverse.php b/app/Language/uk/Fediverse.php
new file mode 100644
index 0000000000..32f54c074f
--- /dev/null
+++ b/app/Language/uk/Fediverse.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'your_handle' => 'Your handle',
+    'your_handle_hint' => 'Enter the @username@domain you want to act from.',
+    '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',
+    ],
+    'favourite' => [
+        'title' => "Favourite {actorDisplayName}'s post",
+        'subtitle' => 'You are going to favourite:',
+        'submit' => 'Proceed to favourite',
+    ],
+    'reblog' => [
+        'title' => "Share {actorDisplayName}'s post",
+        'subtitle' => 'You are going to share:',
+        'submit' => 'Proceed to share',
+    ],
+    'reply' => [
+        'title' => "Reply to {actorDisplayName}'s post",
+        'subtitle' => 'You are going to reply to:',
+        'submit' => 'Proceed to reply',
+    ],
+];
diff --git a/app/Language/uk/Home.php b/app/Language/uk/Home.php
new file mode 100644
index 0000000000..1518239bd9
--- /dev/null
+++ b/app/Language/uk/Home.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'sort_by' => 'Sort by',
+    'sort_options' => [
+        'activity' => 'Recent activity',
+        'created_desc' => 'Newest first',
+        'created_asc' => 'Oldest first',
+    ],
+    'no_podcast' => 'No podcast found',
+];
diff --git a/app/Language/uk/Page.php b/app/Language/uk/Page.php
new file mode 100644
index 0000000000..7cd606694e
--- /dev/null
+++ b/app/Language/uk/Page.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'back_to_home' => 'Back to 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.',
+    ],
+];
diff --git a/app/Language/uk/Podcast.php b/app/Language/uk/Podcast.php
new file mode 100644
index 0000000000..9b1e749aa1
--- /dev/null
+++ b/app/Language/uk/Podcast.php
@@ -0,0 +1,53 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'feed' => 'RSS Podcast feed',
+    'season' => 'Season {seasonNumber}',
+    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Season {seasonNumber} episodes ({episodeCount})',
+    'no_episode' => 'No episode found!',
+    'follow' => 'Follow',
+    'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
+    'followers' => '{numberOfFollowers, plural,
+        one {# follower}
+        other {# followers}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {# post}
+        other {# posts}
+    }',
+    'activity' => 'Activity',
+    'episodes' => 'Episodes',
+    'episodes_title' => 'Episodes of {podcastTitle}',
+    'about' => 'About',
+    'stats' => [
+        'title' => 'Stats',
+        'number_of_seasons' => '{0, plural,
+            one {# season}
+            other {# seasons}
+        }',
+        'number_of_episodes' => '{0, plural,
+            one {# episode}
+            other {# episodes}
+        }',
+        'first_published_at' => 'First episode published on {0, date, medium}',
+    ],
+    'sponsor' => 'Sponsor',
+    'funding_links' => 'Funding links for {podcastTitle}',
+    'find_on' => 'Find {podcastTitle} on',
+    'listen_on' => 'Listen on',
+    'persons' => '{personsCount, plural,
+        one {# person}
+        other {# persons}
+    }',
+    'persons_list' => 'Persons',
+];
diff --git a/app/Language/uk/Post.php b/app/Language/uk/Post.php
new file mode 100644
index 0000000000..58d1cf8002
--- /dev/null
+++ b/app/Language/uk/Post.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "{actorDisplayName}'s post",
+    'back_to_actor_posts' => 'Back to {actor} posts',
+    'actor_shared' => '{actor} shared',
+    'reply_to' => 'Reply to @{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',
+    ],
+    'favourites' => '{numberOfFavourites, plural,
+        one {# favourite}
+        other {# favourites}
+    }',
+    'reblogs' => '{numberOfReblogs, plural,
+        one {# share}
+        other {# shares}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'expand' => 'Expand post',
+    'block_actor' => 'Block user @{actorUsername}',
+    'block_domain' => 'Block domain @{actorDomain}',
+    'delete' => 'Delete post',
+];
diff --git a/docs/src/ar/getting-started/install.md b/docs/src/ar/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/ar/getting-started/install.md
+++ b/docs/src/ar/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/br/getting-started/install.md b/docs/src/br/getting-started/install.md
index 9e7a1744a0..39c53c325d 100644
--- a/docs/src/br/getting-started/install.md
+++ b/docs/src/br/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/ca/getting-started/auth.md b/docs/src/ca/getting-started/auth.md
index ff5d59c067..100b332c1b 100644
--- a/docs/src/ca/getting-started/auth.md
+++ b/docs/src/ca/getting-started/auth.md
@@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels:
 
 <!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
 
-| role        | description                         | permissions                                                                                |
-| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
-| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
-| Manager     | Manages Castopod's content.         | podcasts.create, podcasts.import, persons.manage, pages.manage                             |
-| Podcaster   | General users of Castopod.          | admin.access                                                                               |
+| role                | description                          | permissions                                                                                |
+| ------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------ |
+| Super administrador | Té control complet sobre Castopod.   | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
+| Administrador       | Administra el contingut de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage                             |
+| Podcaster           | Usos generals de Castopod.           | admin.access                                                                               |
 
 <!-- AUTH-INSTANCE-ROLES-LIST:END -->
 
@@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels:
 
 <!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
 
-| permission              | description                                                        |
-| ----------------------- | ------------------------------------------------------------------ |
-| admin.access            | Can access the Castopod admin area.                                |
-| admin.settings          | Can access the Castopod settings.                                  |
-| users.manage            | Can manage Castopod users.                                         |
-| persons.manage          | Can manage persons.                                                |
-| pages.manage            | Can manage pages.                                                  |
-| podcasts.view           | Can view all podcasts.                                             |
-| podcasts.create         | Can create new podcasts.                                           |
-| podcasts.import         | Can import podcasts.                                               |
-| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
+| permission              | description                                                          |
+| ----------------------- | -------------------------------------------------------------------- |
+| admin.access            | Pot accedir a l'àrea d'administració de Castopod.                    |
+| admin.settings          | Pot accedir a la configuració de Castopod.                           |
+| users.manage            | Pot administrar els usuaris de Castopod.                             |
+| persons.manage          | Pot administrar persones.                                            |
+| pages.manage            | Pot administrar pàgines.                                             |
+| podcasts.view           | Pot veure els pòdcasts.                                              |
+| podcasts.create         | Pot crear nous pòdcasts.                                             |
+| podcasts.import         | Pot importar pòdcasts.                                               |
+| fediverse.manage-blocks | Pot evitar que actors/dominis del fedivers interactuen amb Castopod. |
 
 <!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
 
@@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels:
 
 <!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
 
-| role   | description                                               | permissions                                                                                                                                                                                                                                                                                 |
-| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Admin  | Has complete control of podcast #{id}.                    | \*                                                                                                                                                                                                                                                                                          |
-| Editor | Manages content and publications of podcast #{id}.        | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
-| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips                                                                                                                                                                         |
-| Guest  | General contributor of the podcast #{id}.                 | view, episodes.view                                                                                                                                                                                                                                                                         |
+| role          | description                                                        | permissions                                                                                                                                                                                                                                                                                 |
+| ------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Administrador | Té control complet del pòdcast #{id}.                              | \*                                                                                                                                                                                                                                                                                          |
+| Editor        | Administra els continguts i la publicació del pòdcast #{id}.       | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
+| Autor         | Administra el contingut del podcast #{id} però no el pot publicar. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips                                                                                                                                                                         |
+| Convidat      | Col·laborador general del podcast #{id}.                           | view, episodes.view                                                                                                                                                                                                                                                                         |
 
 <!-- AUTH-PODCAST-ROLES-LIST:END -->
 
@@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels:
 
 <!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
 
-| permission                   | description                                                              |
-| ---------------------------- | ------------------------------------------------------------------------ |
-| view                         | Can view dashboard and analytics of podcast #{id}.                       |
-| edit                         | Can edit podcast #{id}.                                                  |
-| delete                       | Can delete podcast #{id}.                                                |
-| manage-import                | Can synchronize imported podcast #{id}.                                  |
-| manage-persons               | Can manage subscriptions of podcast #{id}.                               |
-| manage-subscriptions         | Can manage subscriptions of podcast #{id}.                               |
-| manage-contributors          | Can manage contributors of podcast #{id}.                                |
-| manage-platforms             | Can set/remove platform links of podcast #{id}.                          |
-| manage-publications          | Can publish podcast #{id}.                                               |
-| manage-notifications         | Can view and mark notifications as read for podcast #{id}.               |
-| interact-as                  | Can interact as the podcast #{id} to favourite, share or reply to posts. |
-| episodes.view                | Can view dashboard and analytics of podcast #{id}.                       |
-| episodes.create              | Can create episodes for podcast #{id}.                                   |
-| episodes.edit                | Can edit podcast #{id}.                                                  |
-| episodes.delete              | Can delete podcast #{id}.                                                |
-| episodes.manage-persons      | Can manage subscriptions of podcast #{id}.                               |
-| episodes.manage-clips        | Can manage video clips or soundbites of podcast #{id}.                   |
-| episodes.manage-publications | Can publish podcast #{id}.                                               |
-| episodes.manage-comments     | Can create/remove episode comments of podcast #{id}.                     |
+| permission                   | description                                                                                                          |
+| ---------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| view                         | Pot veure el tauler i les estadístiques del podcast #{id}.                                                           |
+| edit                         | Pot editar el podcast #{id}.                                                                                         |
+| delete                       | Pot suprimir el podcast #{id}.                                                                                       |
+| manage-import                | Pot sincronitzar el podcast importat #{id}.                                                                          |
+| manage-persons               | Pot gestionar les subscripcions del podcast #{id}.                                                                   |
+| manage-subscriptions         | Pot gestionar les subscripcions del podcast #{id}.                                                                   |
+| manage-contributors          | Pot gestionar els col·laboradors del podcast #{id}.                                                                  |
+| manage-platforms             | Pot establir/eliminar enllaços de plataforma del podcast #{id}.                                                      |
+| manage-publications          | Pot publicar el podcast #{id}.                                                                                       |
+| manage-notifications         | Pot veure i marcar les notificacions com a llegides per al podcast #{id}.                                            |
+| interact-as                  | Pot interactuar en nom del podcast #{id} per marcar les publicacions com a preferides, compartir-les o respondre-hi. |
+| episodes.view                | Pot veure el tauler i les estadístiques del podcast #{id}.                                                           |
+| episodes.create              | Pot crear episodis per al podcast #{id}.                                                                             |
+| episodes.edit                | Pot editar el podcast #{id}.                                                                                         |
+| episodes.delete              | Pot suprimir el podcast #{id}.                                                                                       |
+| episodes.manage-persons      | Pot gestionar les subscripcions del podcast #{id}.                                                                   |
+| episodes.manage-clips        | Pot gestionar clips de vídeo o fragments de so del pòdcast #{id}.                                                    |
+| episodes.manage-publications | Pot publicar el podcast #{id}.                                                                                       |
+| episodes.manage-comments     | Pot crear/eliminar comentaris d'episodi del pòdcast #{id}.                                                           |
 
 <!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
diff --git a/docs/src/ca/getting-started/install.md b/docs/src/ca/getting-started/install.md
index e6516f14a7..63ceaa50aa 100644
--- a/docs/src/ca/getting-started/install.md
+++ b/docs/src/ca/getting-started/install.md
@@ -23,6 +23,8 @@ Si preferiu utilitzar Docker, podeu ometre això i anar directament a la
 - PHP v8.1 o superior
 - MySQL versió 5.7 o superior o MariaDB versió 10.2 o superior
 - Support d'HTTPS
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 o superior
 
@@ -165,6 +167,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Paquets de la comunitat
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/de/getting-started/auth.md b/docs/src/de/getting-started/auth.md
index 4965758731..2c47137326 100644
--- a/docs/src/de/getting-started/auth.md
+++ b/docs/src/de/getting-started/auth.md
@@ -1,19 +1,20 @@
 ---
-title: Authentication & Authorization
+title: Authentifizierung & Autorisierung
 sidebarDepth: 3
 ---
 
-# Authentication & Authorization
+# Authentifizierung & Autorisierung
 
-Castopod handles authentication and authorization using `codeigniter/shield`
-coupled with custom rules. Roles and permissions are defined at two levels:
+Castopod behandelt Authentifizierung und Autorisierung mit `codeigniter/shield`
+kombiniert mit eigenen Regeln. Rollen und Berechtigungen sind auf zwei Ebenen
+definiert:
 
-1. [instance wide](#1-instance-wide-roles-and-permissions)
-2. [per podcast](#2-per-podcast-roles-and-permissions)
+1. [instanzweit](#1-instance-wide-roles-and-permissions)
+2. [pro Podcast](#2-per-podcast-roles-and-permissions)
 
-## 1. Instance wide roles and permissions
+## 1. Instanzweite Rollen und Berechtigungen
 
-### Instance roles
+### Instanz Rollen
 
 <!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
 
@@ -25,27 +26,27 @@ coupled with custom rules. Roles and permissions are defined at two levels:
 
 <!-- AUTH-INSTANCE-ROLES-LIST:END -->
 
-### Instance permissions
+### Instanz Berechtigungen
 
 <!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
 
-| permission              | description                                                        |
-| ----------------------- | ------------------------------------------------------------------ |
-| admin.access            | Kann auf den Admin-Bereich von Castopod zugreifen.                 |
-| admin.settings          | Kann auf die Einstellungen von Castopod zugreifen.                 |
-| users.manage            | Kann Castopod-Benutzer verwalten.                                  |
-| persons.manage          | Kann Mitwirkende verwalten.                                        |
-| pages.manage            | Kann Seiten verwalten.                                             |
-| podcasts.view           | Kann alle Podcasts einsehen.                                       |
-| podcasts.create         | Kann neue Podcasts erstellen.                                      |
-| podcasts.import         | Kann Podcasts importieren.                                         |
-| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
+| permission              | description                                                                  |
+| ----------------------- | ---------------------------------------------------------------------------- |
+| admin.access            | Kann auf den Admin-Bereich von Castopod zugreifen.                           |
+| admin.settings          | Kann auf die Einstellungen von Castopod zugreifen.                           |
+| users.manage            | Kann Castopod-Benutzer verwalten.                                            |
+| persons.manage          | Kann Mitwirkende verwalten.                                                  |
+| pages.manage            | Kann Seiten verwalten.                                                       |
+| podcasts.view           | Kann alle Podcasts einsehen.                                                 |
+| podcasts.create         | Kann neue Podcasts erstellen.                                                |
+| podcasts.import         | Kann Podcasts importieren.                                                   |
+| fediverse.manage-blocks | Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren. |
 
 <!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
 
-## 2. Per podcast roles and permissions
+## 2. Pro Podcast Rollen und Berechtigungen
 
-### Per podcast roles
+### Pro Podcast Rollen
 
 <!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
 
@@ -58,30 +59,30 @@ coupled with custom rules. Roles and permissions are defined at two levels:
 
 <!-- AUTH-PODCAST-ROLES-LIST:END -->
 
-### Per podcast permissions
+### Pro Podcast Berechtigung
 
 <!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
 
-| permission                   | description                                                                    |
-| ---------------------------- | ------------------------------------------------------------------------------ |
-| view                         | Kann das Dashboard und Analysen des Podcasts #{id} einsehen.                   |
-| edit                         | Kann Podcast #{id} bearbeiten.                                                 |
-| delete                       | Kann Podcast #{id} löschen.                                                    |
-| manage-import                | Kann den importierten Podcast #{id} synchronisieren.                           |
-| manage-persons               | Kann Abonnements des Podcasts #{id} verwalten.                                 |
-| manage-subscriptions         | Kann Abonnements des Podcasts #{id} verwalten.                                 |
-| manage-contributors          | Kann Mitwirkende des Podcasts #{id} verwalten.                                 |
-| manage-platforms             | Kann Plattform-Links des Podcasts #{id} verwalten.                             |
-| manage-publications          | Kann Podcast #{id} veröffentlichen.                                            |
-| manage-notifications         | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. |
-| interact-as                  | Can interact as the podcast #{id} to favourite, share or reply to posts.       |
-| episodes.view                | Kann das Dashboard und Analysen des Podcasts #{id} einsehen.                   |
-| episodes.create              | Kann Folgen für Podcast #{id} erstellen.                                       |
-| episodes.edit                | Kann Podcast #{id} bearbeiten.                                                 |
-| episodes.delete              | Kann Podcast #{id} löschen.                                                    |
-| episodes.manage-persons      | Kann Abonnements des Podcasts #{id} verwalten.                                 |
-| episodes.manage-clips        | Kann Videoclips und Soundbites des Podcasts #{id} verwalten.                   |
-| episodes.manage-publications | Kann Podcast #{id} veröffentlichen.                                            |
-| episodes.manage-comments     | Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen.           |
+| permission                   | description                                                                                            |
+| ---------------------------- | ------------------------------------------------------------------------------------------------------ |
+| view                         | Kann das Dashboard und Analysen des Podcasts #{id} einsehen.                                           |
+| edit                         | Kann Podcast #{id} bearbeiten.                                                                         |
+| delete                       | Kann Podcast #{id} löschen.                                                                            |
+| manage-import                | Kann den importierten Podcast #{id} synchronisieren.                                                   |
+| manage-persons               | Kann Abonnements des Podcasts #{id} verwalten.                                                         |
+| manage-subscriptions         | Kann Abonnements des Podcasts #{id} verwalten.                                                         |
+| manage-contributors          | Kann Mitwirkende des Podcasts #{id} verwalten.                                                         |
+| manage-platforms             | Kann Plattform-Links des Podcasts #{id} verwalten.                                                     |
+| manage-publications          | Kann Podcast #{id} veröffentlichen.                                                                    |
+| manage-notifications         | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren.                         |
+| interact-as                  | Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten. |
+| episodes.view                | Kann das Dashboard und Analysen des Podcasts #{id} einsehen.                                           |
+| episodes.create              | Kann Folgen für Podcast #{id} erstellen.                                                               |
+| episodes.edit                | Kann Podcast #{id} bearbeiten.                                                                         |
+| episodes.delete              | Kann Podcast #{id} löschen.                                                                            |
+| episodes.manage-persons      | Kann Abonnements des Podcasts #{id} verwalten.                                                         |
+| episodes.manage-clips        | Kann Videoclips und Soundbites des Podcasts #{id} verwalten.                                           |
+| episodes.manage-publications | Kann Podcast #{id} veröffentlichen.                                                                    |
+| episodes.manage-comments     | Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen.                                   |
 
 <!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
diff --git a/docs/src/de/getting-started/install.md b/docs/src/de/getting-started/install.md
index 3c99e225ce..b36473af06 100644
--- a/docs/src/de/getting-started/install.md
+++ b/docs/src/de/getting-started/install.md
@@ -3,7 +3,7 @@ title: Installation
 sidebarDepth: 3
 ---
 
-# How to install Castopod?
+# Wie installiere ich Castopod?
 
 Castopod was thought-out to be easy to install. Whether using dedicated or
 shared hosting, you can install it on most PHP-MySQL compatible web servers.
@@ -17,13 +17,15 @@ If you prefer using Docker, you may skip this and go straight to the
 
 :::
 
-## Requirements
+## Voraussetzungen
 
-- PHP v8.1 or higher
-- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
-- HTTPS support
+- PHP v8.1 oder höher
+- MySQL Version 5.7 oder höher oder MariaDB Version 10.2 oder höher
+- HTTPS-Unterstützung
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
-### PHP v8.1 or higher
+### PHP v8.1 oder höher
 
 PHP version 8.1 or higher is required, with the following extensions installed:
 
@@ -162,6 +164,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/de/getting-started/security.md b/docs/src/de/getting-started/security.md
index e205698df8..b288664133 100644
--- a/docs/src/de/getting-started/security.md
+++ b/docs/src/de/getting-started/security.md
@@ -1,23 +1,25 @@
 ---
-title: Security
+title: Sicherheit
 ---
 
-# Security concerns
+# Sicherheitsbedenken
 
-Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
-framework that encourages
-[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
+Castopod wurde mittels [CodeIgniter4](https://codeigniter.com/) (einem PHP
+Framework) gebaut, welches
+[gute Sicherheitspraktiken](https://codeigniter.com/user_guide/concepts/security.html)
+fördert.
 
-To maximize your instance's safety and prevent any malicious attack, we
-recommend you update all your Castopod files permissions after installation or
-updates (to avoid any prior permission error):
+Um die Sicherheit Ihrer Instanz zu erhöhen und bösartige Angriffe zu verhindern,
+empfehlen wir, alle deine Castopod-Dateiberechtigungen nach der Installation
+oder dem Updaten zu aktualisieren (um Fehler bei der vorherigen Berechtigung zu
+vermeiden):
 
-- `writable/` folder must be **readable** and **writable**.
-- `public/media/` folder must be **readable** and **writable**.
-- any other file must be set to **readonly**.
+- der `writable/` Ordner muss **lesbar** und **beschreibbar** sein.
+- `public/media/` muss **lesbar** und **beschreibbar** sein.
+- jede andere Datei muss nur **lesbar** sein.
 
-For instance, if you are using Apache or NGINX with Ubuntu you may do the
-following:
+Wenn Sie beispielsweise Apache oder NGINX mit Ubuntu verwenden, können Sie
+folgendermaßen vorgehen:
 
 ```bash
 sudo chown -R root:root /path/to/castopod
diff --git a/docs/src/el/getting-started/install.md b/docs/src/el/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/el/getting-started/install.md
+++ b/docs/src/el/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/es/getting-started/install.md b/docs/src/es/getting-started/install.md
index 0a20476fd6..849fd9177a 100644
--- a/docs/src/es/getting-started/install.md
+++ b/docs/src/es/getting-started/install.md
@@ -23,6 +23,8 @@ Si prefieres usar Docker, puedes saltarte esto e ir directamente a la
 - PHP v8.1 o superior
 - MySQL versión 5.7 o superior o MariaDB versión 10.2 o superior
 - Soporte HTTPS
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 o superior
 
@@ -167,16 +169,45 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**        | number               | `25`           |
 | **`SMTPCrypto`**      | [`"tls"` or `"ssl"`] | `"tls"`        |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## 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/fa/getting-started/install.md b/docs/src/fa/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/fa/getting-started/install.md
+++ b/docs/src/fa/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/fr/getting-started/auth.md b/docs/src/fr/getting-started/auth.md
index ff5d59c067..ee460680b0 100644
--- a/docs/src/fr/getting-started/auth.md
+++ b/docs/src/fr/getting-started/auth.md
@@ -1,87 +1,88 @@
 ---
-title: Authentication & Authorization
+title: Authentification et Autorisation
 sidebarDepth: 3
 ---
 
-# Authentication & Authorization
+# Authentification et Autorisation
 
-Castopod handles authentication and authorization using `codeigniter/shield`
-coupled with custom rules. Roles and permissions are defined at two levels:
+Castopod gère l'authentification et l'autorisation à l'aide de
+`codeigniter/shield` associés à des règles personnalisées. Les rôles et les
+autorisations sont définis sur deux niveaux :
 
-1. [instance wide](#1-instance-wide-roles-and-permissions)
-2. [per podcast](#2-per-podcast-roles-and-permissions)
+1. [à l'échelle de l'instance](#1-instance-wide-roles-and-permissions)
+2. [par podcast](#2-per-podcast-roles-and-permissions)
 
-## 1. Instance wide roles and permissions
+## 1. Rôles et autorisations à l'échelle de l'instance
 
-### Instance roles
+### Rôles dans l’instance
 
 <!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
 
-| role        | description                         | permissions                                                                                |
-| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
-| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
-| Manager     | Manages Castopod's content.         | podcasts.create, podcasts.import, persons.manage, pages.manage                             |
-| Podcaster   | General users of Castopod.          | admin.access                                                                               |
+| role                       | description                         | permissions                                                                                |
+| -------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
+| Super administrat·rice·eur | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
+| Gestionnaire               | Gère le contenu de Castopod.        | podcasts.create, podcasts.import, persons.manage, pages.manage                             |
+| Podcast·rice·eur           | Utilisateurs généraux de Castopod.  | admin.access                                                                               |
 
 <!-- AUTH-INSTANCE-ROLES-LIST:END -->
 
-### Instance permissions
+### Autorisations dans l'instance
 
 <!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
 
-| permission              | description                                                        |
-| ----------------------- | ------------------------------------------------------------------ |
-| admin.access            | Can access the Castopod admin area.                                |
-| admin.settings          | Can access the Castopod settings.                                  |
-| users.manage            | Can manage Castopod users.                                         |
-| persons.manage          | Can manage persons.                                                |
-| pages.manage            | Can manage pages.                                                  |
-| podcasts.view           | Can view all podcasts.                                             |
-| podcasts.create         | Can create new podcasts.                                           |
-| podcasts.import         | Can import podcasts.                                               |
-| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
+| permission              | description                                                          |
+| ----------------------- | -------------------------------------------------------------------- |
+| admin.access            | Peut accéder à la zone d'administration Castopod.                    |
+| admin.settings          | Peut accéder aux paramètres de Castopod.                             |
+| users.manage            | Peut gérer les utilisateurs de Castopod.                             |
+| persons.manage          | Permet de gérer les personnes.                                       |
+| pages.manage            | Permet de gérer les pages.                                           |
+| podcasts.view           | Peut voir tous les podcasts.                                         |
+| podcasts.create         | Peut créer de nouveaux podcasts.                                     |
+| podcasts.import         | Peut importer des podcasts.                                          |
+| fediverse.manage-blocks | Peut empêcher des act·rice·eur·s/domaines d'interagir avec Castopod. |
 
 <!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
 
-## 2. Per podcast roles and permissions
+## 2. Rôles et autorisations par podcast
 
-### Per podcast roles
+### Rôles par podcast
 
 <!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
 
-| role   | description                                               | permissions                                                                                                                                                                                                                                                                                 |
-| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Admin  | Has complete control of podcast #{id}.                    | \*                                                                                                                                                                                                                                                                                          |
-| Editor | Manages content and publications of podcast #{id}.        | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
-| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips                                                                                                                                                                         |
-| Guest  | General contributor of the podcast #{id}.                 | view, episodes.view                                                                                                                                                                                                                                                                         |
+| role             | description                                                     | permissions                                                                                                                                                                                                                                                                                 |
+| ---------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Administrateur   | A un contrôle total sur le podcast #{id}.                       | \*                                                                                                                                                                                                                                                                                          |
+| Éditeur          | Gère le contenu et les publications du podcast #{id}.           | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
+| Auteur / Autrice | Gère le contenu du podcast #{id} , mais ne peut pas le publier. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips                                                                                                                                                                         |
+| Invité           | Contributeur général du podcast #{id}.                          | view, episodes.view                                                                                                                                                                                                                                                                         |
 
 <!-- AUTH-PODCAST-ROLES-LIST:END -->
 
-### Per podcast permissions
+### Permissions par podcast
 
 <!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
 
-| permission                   | description                                                              |
-| ---------------------------- | ------------------------------------------------------------------------ |
-| view                         | Can view dashboard and analytics of podcast #{id}.                       |
-| edit                         | Can edit podcast #{id}.                                                  |
-| delete                       | Can delete podcast #{id}.                                                |
-| manage-import                | Can synchronize imported podcast #{id}.                                  |
-| manage-persons               | Can manage subscriptions of podcast #{id}.                               |
-| manage-subscriptions         | Can manage subscriptions of podcast #{id}.                               |
-| manage-contributors          | Can manage contributors of podcast #{id}.                                |
-| manage-platforms             | Can set/remove platform links of podcast #{id}.                          |
-| manage-publications          | Can publish podcast #{id}.                                               |
-| manage-notifications         | Can view and mark notifications as read for podcast #{id}.               |
-| interact-as                  | Can interact as the podcast #{id} to favourite, share or reply to posts. |
-| episodes.view                | Can view dashboard and analytics of podcast #{id}.                       |
-| episodes.create              | Can create episodes for podcast #{id}.                                   |
-| episodes.edit                | Can edit podcast #{id}.                                                  |
-| episodes.delete              | Can delete podcast #{id}.                                                |
-| episodes.manage-persons      | Can manage subscriptions of podcast #{id}.                               |
-| episodes.manage-clips        | Can manage video clips or soundbites of podcast #{id}.                   |
-| episodes.manage-publications | Can publish podcast #{id}.                                               |
-| episodes.manage-comments     | Can create/remove episode comments of podcast #{id}.                     |
+| permission                   | description                                                                                        |
+| ---------------------------- | -------------------------------------------------------------------------------------------------- |
+| view                         | Peut voir le tableau de bord et les analyses du podcast #{id}.                                     |
+| edit                         | Peut éditer le podcast #{id}.                                                                      |
+| delete                       | Peut supprimer le podcast #{id}.                                                                   |
+| manage-import                | Peut synchroniser le podcast importé #{id}.                                                        |
+| manage-persons               | Permet de gérer les abonnements au podcast #{id}.                                                  |
+| manage-subscriptions         | Permet de gérer les abonnements au podcast #{id}.                                                  |
+| manage-contributors          | Permet de gérer les contributeurs du podcast #{id}.                                                |
+| manage-platforms             | Peut configurer/supprimer les liens de la plateforme du podcast #{id}.                             |
+| manage-publications          | Peut publier le podcast #{id}.                                                                     |
+| manage-notifications         | Peut afficher et marquer les notifications comme lues pour le podcast #{id}.                       |
+| interact-as                  | Peut interagir en tant que podcast #{id} pour mettre en favori, partager ou répondre aux messages. |
+| episodes.view                | Peut voir le tableau de bord et les analyses du podcast #{id}.                                     |
+| episodes.create              | Peut créer des épisodes pour le podcast #{id}.                                                     |
+| episodes.edit                | Peut éditer le podcast #{id}.                                                                      |
+| episodes.delete              | Peut supprimer le podcast #{id}.                                                                   |
+| episodes.manage-persons      | Permet de gérer les abonnements au podcast #{id}.                                                  |
+| episodes.manage-clips        | Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}.                           |
+| episodes.manage-publications | Peut publier le podcast #{id}.                                                                     |
+| episodes.manage-comments     | Peut créer/supprimer les commentaires de l'épisode du podcast #{id}.                               |
 
 <!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
diff --git a/docs/src/fr/getting-started/docker.md b/docs/src/fr/getting-started/docker.md
index c6e6cb7e65..e673887491 100644
--- a/docs/src/fr/getting-started/docker.md
+++ b/docs/src/fr/getting-started/docker.md
@@ -1,12 +1,12 @@
 ---
-title: Official Docker images
+title: Images officielles Docker
 sidebarDepth: 3
 ---
 
-# Official Docker images
+# Images officielles de Docker
 
-Castopod pushes 3 Docker images to the Docker Hub during its automated build
-process:
+Castopod envoie 3 images Docker au Hub Docker pendant son processus de
+construction automatisée :
 
 - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
   with all of Castopod dependencies
@@ -15,22 +15,22 @@ process:
 - [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
   an optional image building videoclips thanks to ffmpeg
 
-Additionally, Castopod requires a MySQL-compatible database. A Redis database
-can be added as a cache handler.
+De plus, Castopod nécessite une base de données compatible avec MySQL. Une base
+de données Redis peut être ajoutée en tant que gestionnaire de cache.
 
-## Supported tags
+## Tags supportés
 
-- `develop` [unstable], latest development branch build
-- `beta` [stable], latest beta version build
-- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
-- `latest` [stable], latest version build
-- `1.x.x` [stable], specific version build (since `1.0.0`)
+- `développer` [unstable], la dernière version de la branche de développement
+- `beta` [stable], dernière version bêta
+- `1.0.0-beta.x` [stable], version bêta spécifique (depuis `1.0.0-beta.22`)
+- `beta` [stable], dernière version bêta
+- `1.x.x` [stable], version spécifique (depuis `1.0.0`)
 
-## Example usage
+## Exemple d'utilisation
 
-1.  Install [docker](https://docs.docker.com/get-docker/) and
+1.  Installez [docker](https://docs.docker.com/get-docker/) et
     [docker-compose](https://docs.docker.com/compose/install/)
-2.  Create a `docker-compose.yml` file with the following:
+2.  Créez un fichier `docker-compose.yml` avec les éléments suivants :
 
     ```yml
     version: "3.7"
@@ -112,8 +112,8 @@ can be added as a cache handler.
       castopod-db:
     ```
 
-    You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
-    `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
+    Vous devez adapter certaines variables à vos besoins (p. ex. `CP_BASEURL`,
+    `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` et `CP_ANALYTICS_SALT`).
 
 3.  Setup a reverse proxy for TLS (SSL/HTTPS)
 
@@ -127,16 +127,17 @@ can be added as a cache handler.
     }
     ```
 
-4.  Run `docker-compose up -d`, wait for it to initialize and head on to
-    `https://castopod.example.com/cp-install` to finish setting up Castopod!
+4.  Exécutez `docker-compose up -d`, attendez qu'il s'initialise sur
+    `https://castopod.example.com/cp-install` pour terminer la configuration de
+    Castopod !
 
-5.  You're all set, start podcasting! 🎙️🚀
+5.  Vous êtes prêt, commencez à podcaster! 🎙️🚀
 
 ## Environment Variables
 
 - **castopod/video-clipper**
 
-  | Variable name              | Type (`default`) | Default          |
+  | Nom de la variable         | Type (`default`) | Par défaut       |
   | -------------------------- | ---------------- | ---------------- |
   | **`CP_DATABASE_HOSTNAME`** | ?string          | `"mariadb"`      |
   | **`CP_DATABASE_NAME`**     | ?string          | `MYSQL_DATABASE` |
@@ -146,7 +147,7 @@ can be added as a cache handler.
 
 - **castopod/app**
 
-  | Variable name                | Type (`default`)        | Default          |
+  | Variable name                | Type (`default`)        | Par défaut       |
   | ---------------------------- | ----------------------- | ---------------- |
   | **`CP_BASEURL`**             | string                  | `undefined`      |
   | **`CP_MEDIA_BASEURL`**       | ?string                 | `CP_BASEURL`     |
@@ -172,6 +173,6 @@ can be added as a cache handler.
 
 - **castopod/web-server**
 
-  | Variable name         | Type    | Default |
-  | --------------------- | ------- | ------- |
-  | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
+  | Nom de la variable    | Type    | Par défaut |
+  | --------------------- | ------- | ---------- |
+  | **`CP_APP_HOSTNAME`** | ?string | `"app"`    |
diff --git a/docs/src/fr/getting-started/install.md b/docs/src/fr/getting-started/install.md
index 71b41bdebc..475078093a 100644
--- a/docs/src/fr/getting-started/install.md
+++ b/docs/src/fr/getting-started/install.md
@@ -23,6 +23,8 @@ directement à la [documentation Docker](./docker.md) pour Castopod.
 - PHP v8.1 ou supérieure
 - MySQL version 5.7 ou supérieure ou MariaDB version 10.2 ou supérieure
 - Prise en charge HTTPS
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 ou supérieure
 
@@ -47,7 +49,7 @@ De plus, assurez-vous que les extensions suivantes sont activées dans votre PHP
 
 > Nous vous recommandons d'utiliser [MariaDB](https://mariadb.org).
 
-::: warning Warning
+::: warning Attention
 
 Castopod ne fonctionne qu'avec les bases de données MySQL 5.7 ou plus récentes.
 Les versions 5.6 (dont le support a cessé le 5 février 2021) ou précédentes de
@@ -130,11 +132,11 @@ installées :
 2. Suivez les instructions affichée.
 3. Commencer à baladodiffuser !
 
-::: info Note
+:::info Note
 
-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.
+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 éditer
+le fichier `.env` manuellement en vous appuyant sur le fichier `.env.example`.
 
 :::
 
@@ -167,6 +169,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Paquets fournis par la communauté
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/fr/getting-started/update.md b/docs/src/fr/getting-started/update.md
index 36221d24c1..e7bc8e8718 100644
--- a/docs/src/fr/getting-started/update.md
+++ b/docs/src/fr/getting-started/update.md
@@ -9,10 +9,10 @@ Après avoir installé Castopod, vous pouvez mettre à jour votre instance vers
 dernière version afin de profiter des dernières fonctionnalités ✨, des
 corrections de bugs 🐛 et des améliorations de performance ⚡.
 
-## Update instructions
+## Instructions de mise à jour
 
-0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
-   database.
+0. ⚠️ Avant toute mise à jour, nous vous recommandons fortement de sauvegarder
+   vos fichiers Castopod et la base de données .
 
    - cf.
      [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
@@ -31,15 +31,16 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
    - Note that you can also download the latest package from
      [castopod.org](https://castopod.org/)
 
-3. On your server:
+3. Sur votre serveur :
 
-   - Remove all files except `.env` and `public/media`
-   - Copy the new files from the downloaded package into your server
+   - Supprimer tous les fichiers sauf `.env` et `public/media`
+   - Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur
 
      ::: info Note
 
-     You may need to reset files permissions as during the install process.
-     Check [Security Concerns](./security.md).
+     Vous devrez peut-être re-définir les autorisations de fichiers comme
+     effectué durant le processus d'installation. Check
+     [Security Concerns](./security.md).
 
      :::
 
@@ -52,19 +53,20 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
 
 5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
    `Housekeeping`
-6. ✨ Enjoy your fresh instance, you're all done!
+6. ✨Profitez de votre nouvelle instance, vous avez terminé !
 
 ::: info Note
 
-Releases may come with additional update instructions (see
-[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
+Les versions peuvent être accompagnées d'instructions de mise à jour
+supplémentaires (cf. la
+[page des notes de versions](https://code.castopod.org/adaures/castopod/-/releases)).
 
-- cf.
-  [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
+- Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire
+  ?</a>
 
 :::
 
-## Fully Automated updates
+## Mises à jour entièrement automatisées
 
 > Prochainement... 👀
 
@@ -72,23 +74,23 @@ Releases may come with additional update instructions (see
 
 ### Où puis-je trouver ma version de Castopod ?
 
-Go to your Castopod admin panel, the version is displayed on the bottom left
-corner.
+Allez dans votre panneau d'administration de Castopod, la version s'affiche en
+bas à gauche.
 
-Alternatively, you can find the version in the `app > Config > Constants.php`
-file.
+Vous pouvez également trouver la version dans l'application
+`> Configuration > Constantes.php` dossier.
 
 ### [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
 
-No problem! Just get the latest release as described above. Only, when going
-through the release instructions (4), perform them sequentially, from the oldest
-to the newest.
+Pas de problème ! Il suffit d'obtenir la dernière version comme décrit
+ci-dessus. Lorsque vous exécutez les instructions de mise à jour (4), lancez-les
+séquentiellement, de la plus ancienne à la plus récente.
 
 > Vous devriez sauvegarder votre instance selon la date de votre dernière mise à
 > jour de Castopod.
 
-For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
-`v1.0.0-beta.1`:
+Par exemple, si vous êtes en `v1.0.0-alpha.42` et souhaitez mettre à jour vers
+la `v1.0.0-beta.1` :
 
 0. (fortement recommandé) Faites une sauvegarde de vos fichiers et de votre base
    de données.
@@ -103,7 +105,8 @@ For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
 
 ### Dois-je faire une sauvegarde avant de mettre à jour ?
 
-We advise you do, so you don't lose everything if anything goes wrong!
+Nous vous conseillons de le faire, afin de ne pas tout perdre si quelque chose
+se passait mal !
 
-More generally, we advise you make regular backups of your Castopod files and
-database to prevent you from losing it all…
+Plus généralement, nous vous conseillons de faire des sauvegardes régulières de
+vos fichiers Castopod et de votre base de données afin d'éviter de tout perdre…
diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md
index b57803f0b4..41472a4c77 100644
--- a/docs/src/fr/index.md
+++ b/docs/src/fr/index.md
@@ -44,7 +44,7 @@ petite taille.
   - 🔗 &nbsp;Liens de financement
   - 📲 &nbsp;publicité “listen-to-click”
   - 🤝 &nbsp;value4value / WebMonetization
-  - 💎 &nbsp;Premium podcasts
+  - 💎 &nbsp;Podcasts premium
 - 📡&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…
@@ -252,9 +252,9 @@ Merci à toutes ces personnes merveilleuses
 
 <!-- ALL-CONTRIBUTORS-LIST:END -->
 
-This project follows the
-[all-contributors](https://github.com/all-contributors/all-contributors)
-specification. Contributions of any kind welcome!
+Ce projet suit la spécification
+[all-contributors](https://github.com/all-contributors/all-contributors) .
+Toutes les contributions sont bienvenues !
 
 ## Contact
 
@@ -287,9 +287,9 @@ parrains. Si vous souhaitez aider, n'hésitez pas à
 
 ## Licence
 
-[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
+[Licence publique générale GNU Affero v3](https://choosealicense.com/licenses/agpl-3.0/)
 
-Copyright © 2020-present, [Ad Aures](https://adaures.com/).
+Copyright © 2020-aujourd'hui, [Ad Aures](https://adaures.com/).
 https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
 https://img.shields.io/github/license/ad-aures/castopod?color=blue
 https://img.shields.io/badge/contributions-welcome-brightgreen.svg
diff --git a/docs/src/fr2/getting-started/auth.md b/docs/src/fr2/getting-started/auth.md
new file mode 100644
index 0000000000..ff5d59c067
--- /dev/null
+++ b/docs/src/fr2/getting-started/auth.md
@@ -0,0 +1,87 @@
+---
+title: Authentication & Authorization
+sidebarDepth: 3
+---
+
+# Authentication & Authorization
+
+Castopod handles authentication and authorization using `codeigniter/shield`
+coupled with custom rules. Roles and permissions are defined at two levels:
+
+1. [instance wide](#1-instance-wide-roles-and-permissions)
+2. [per podcast](#2-per-podcast-roles-and-permissions)
+
+## 1. Instance wide roles and permissions
+
+### Instance roles
+
+<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
+
+| role        | description                         | permissions                                                                                |
+| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
+| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
+| Manager     | Manages Castopod's content.         | podcasts.create, podcasts.import, persons.manage, pages.manage                             |
+| Podcaster   | General users of Castopod.          | admin.access                                                                               |
+
+<!-- AUTH-INSTANCE-ROLES-LIST:END -->
+
+### Instance permissions
+
+<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
+
+| permission              | description                                                        |
+| ----------------------- | ------------------------------------------------------------------ |
+| admin.access            | Can access the Castopod admin area.                                |
+| admin.settings          | Can access the Castopod settings.                                  |
+| users.manage            | Can manage Castopod users.                                         |
+| persons.manage          | Can manage persons.                                                |
+| pages.manage            | Can manage pages.                                                  |
+| podcasts.view           | Can view all podcasts.                                             |
+| podcasts.create         | Can create new podcasts.                                           |
+| podcasts.import         | Can import podcasts.                                               |
+| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
+
+<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
+
+## 2. Per podcast roles and permissions
+
+### Per podcast roles
+
+<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
+
+| role   | description                                               | permissions                                                                                                                                                                                                                                                                                 |
+| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Admin  | Has complete control of podcast #{id}.                    | \*                                                                                                                                                                                                                                                                                          |
+| Editor | Manages content and publications of podcast #{id}.        | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
+| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips                                                                                                                                                                         |
+| Guest  | General contributor of the podcast #{id}.                 | view, episodes.view                                                                                                                                                                                                                                                                         |
+
+<!-- AUTH-PODCAST-ROLES-LIST:END -->
+
+### Per podcast permissions
+
+<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
+
+| permission                   | description                                                              |
+| ---------------------------- | ------------------------------------------------------------------------ |
+| view                         | Can view dashboard and analytics of podcast #{id}.                       |
+| edit                         | Can edit podcast #{id}.                                                  |
+| delete                       | Can delete podcast #{id}.                                                |
+| manage-import                | Can synchronize imported podcast #{id}.                                  |
+| manage-persons               | Can manage subscriptions of podcast #{id}.                               |
+| manage-subscriptions         | Can manage subscriptions of podcast #{id}.                               |
+| manage-contributors          | Can manage contributors of podcast #{id}.                                |
+| manage-platforms             | Can set/remove platform links of podcast #{id}.                          |
+| manage-publications          | Can publish podcast #{id}.                                               |
+| manage-notifications         | Can view and mark notifications as read for podcast #{id}.               |
+| interact-as                  | Can interact as the podcast #{id} to favourite, share or reply to posts. |
+| episodes.view                | Can view dashboard and analytics of podcast #{id}.                       |
+| episodes.create              | Can create episodes for podcast #{id}.                                   |
+| episodes.edit                | Can edit podcast #{id}.                                                  |
+| episodes.delete              | Can delete podcast #{id}.                                                |
+| episodes.manage-persons      | Can manage subscriptions of podcast #{id}.                               |
+| episodes.manage-clips        | Can manage video clips or soundbites of podcast #{id}.                   |
+| episodes.manage-publications | Can publish podcast #{id}.                                               |
+| episodes.manage-comments     | Can create/remove episode comments of podcast #{id}.                     |
+
+<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
diff --git a/docs/src/fr2/getting-started/install.md b/docs/src/fr2/getting-started/install.md
new file mode 100644
index 0000000000..41b5153c8d
--- /dev/null
+++ b/docs/src/fr2/getting-started/install.md
@@ -0,0 +1,216 @@
+---
+title: Installation
+sidebarDepth: 3
+---
+
+# How to install Castopod?
+
+Castopod was thought-out to be easy to install. Whether using dedicated or
+shared hosting, you can install it on most PHP-MySQL compatible web servers.
+
+::: tip Note
+
+We've released official Docker images for Castopod!
+
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
+
+:::
+
+## Requirements
+
+- PHP v8.1 or higher
+- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
+- HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
+
+### PHP v8.1 or higher
+
+PHP version 8.1 or higher is required, with the following extensions installed:
+
+- [intl](https://php.net/manual/en/intl.requirements.php)
+- [libcurl](https://php.net/manual/en/curl.requirements.php)
+- [mbstring](https://php.net/manual/en/mbstring.installation.php)
+- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**,
+  **PNG** and **WEBP** libraries.
+- [exif](https://www.php.net/manual/en/exif.installation.php)
+
+Additionally, make sure that the following extensions are enabled in your PHP:
+
+- json (enabled by default - don't turn it off)
+- xml (enabled by default - don't turn it off)
+- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
+
+### MySQL compatible database
+
+> We recommend using [MariaDB](https://mariadb.org).
+
+::: warning Warning
+
+Castopod only works with supported MySQL 5.7 or higher compatible databases. It
+will break with the previous MySQL v5.6 for example as its end of life was on
+February 5, 2021.
+
+:::
+
+You will need the server hostname, database name, username and password to
+complete the installation process. If you do not have these, please contact your
+server administrator.
+
+#### Privileges
+
+User must have at least these privileges on the database for Castopod to work:
+`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`,
+`REFERENCES`, `CREATE VIEW`.
+
+### (Optional) FFmpeg v4.1.8 or higher for Video Clips
+
+[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you
+want to generate Video Clips. The following extensions must be installed:
+
+- **FreeType 2** library for
+  [gd](https://www.php.net/manual/en/image.installation.php).
+
+### (Optional) Other recommendations
+
+- Redis for better cache performances.
+- CDN for static files caching and better performances.
+- e-mail gateway for lost passwords.
+
+## Install instructions
+
+### Pre-requisites
+
+0. Get a Web Server with [requirements](#requirements) installed
+1. Create a MySQL database for Castopod with a user having access and
+   modification privileges (for more info, see
+   [MySQL compatible database](#mysql-compatible-database)).
+2. Activate HTTPS on your domain with an _SSL certificate_.
+3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto
+   the web server if you haven’t already.
+   - ⚠️ Set the web server document root to the `public/` sub-folder within the
+     `castopod` folder.
+4. Add **cron tasks** on your web server for various background processes
+   (replace the paths accordingly):
+
+   - For social features to work properly, this task is used to broadcast social
+     activities to your followers on the fediverse:
+
+   ```bash
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities
+   ```
+
+   - For having your episodes be broadcasted on open hubs upon publication using
+     [WebSub](https://en.wikipedia.org/wiki/WebSub):
+
+   ```bash
+      * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish
+   ```
+
+   - For Video Clips to be created (see
+     [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)):
+
+   ```bash
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
+   ```
+
+   > These tasks run **every minute**. You may set the frequency depending on
+   > your needs: every 5, 10 minutes or more.
+
+### (recommended) Install Wizard
+
+1. Run the Castopod install script by going to the install wizard page
+   (`https://your_domain_name.com/cp-install`) in your favorite web browser.
+2. Follow the instructions on your screen.
+3. Start podcasting!
+
+::: 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 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"`      |
+
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
+## Community packages
+
+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.
+
+### 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
+self-hosting for you.
+
+<div class="flex flex-wrap items-center gap-4">
+
+<a href="https://install-app.yunohost.org/?app=castopod" target="_blank" rel="noopener noreferrer">
+   <img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Install Castopod with YunoHost" class="align-middle" />
+</a>
+
+<a href="https://github.com/YunoHost-Apps/castopod_ynh" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"><svg
+   xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em"
+   class="text-xl"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z"/></svg>Github
+Repo</a>
+
+</div>
diff --git a/docs/src/fr_CA/getting-started/auth.md b/docs/src/fr_CA/getting-started/auth.md
new file mode 100644
index 0000000000..ff5d59c067
--- /dev/null
+++ b/docs/src/fr_CA/getting-started/auth.md
@@ -0,0 +1,87 @@
+---
+title: Authentication & Authorization
+sidebarDepth: 3
+---
+
+# Authentication & Authorization
+
+Castopod handles authentication and authorization using `codeigniter/shield`
+coupled with custom rules. Roles and permissions are defined at two levels:
+
+1. [instance wide](#1-instance-wide-roles-and-permissions)
+2. [per podcast](#2-per-podcast-roles-and-permissions)
+
+## 1. Instance wide roles and permissions
+
+### Instance roles
+
+<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
+
+| role        | description                         | permissions                                                                                |
+| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
+| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
+| Manager     | Manages Castopod's content.         | podcasts.create, podcasts.import, persons.manage, pages.manage                             |
+| Podcaster   | General users of Castopod.          | admin.access                                                                               |
+
+<!-- AUTH-INSTANCE-ROLES-LIST:END -->
+
+### Instance permissions
+
+<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
+
+| permission              | description                                                        |
+| ----------------------- | ------------------------------------------------------------------ |
+| admin.access            | Can access the Castopod admin area.                                |
+| admin.settings          | Can access the Castopod settings.                                  |
+| users.manage            | Can manage Castopod users.                                         |
+| persons.manage          | Can manage persons.                                                |
+| pages.manage            | Can manage pages.                                                  |
+| podcasts.view           | Can view all podcasts.                                             |
+| podcasts.create         | Can create new podcasts.                                           |
+| podcasts.import         | Can import podcasts.                                               |
+| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
+
+<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
+
+## 2. Per podcast roles and permissions
+
+### Per podcast roles
+
+<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
+
+| role   | description                                               | permissions                                                                                                                                                                                                                                                                                 |
+| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Admin  | Has complete control of podcast #{id}.                    | \*                                                                                                                                                                                                                                                                                          |
+| Editor | Manages content and publications of podcast #{id}.        | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
+| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips                                                                                                                                                                         |
+| Guest  | General contributor of the podcast #{id}.                 | view, episodes.view                                                                                                                                                                                                                                                                         |
+
+<!-- AUTH-PODCAST-ROLES-LIST:END -->
+
+### Per podcast permissions
+
+<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
+
+| permission                   | description                                                              |
+| ---------------------------- | ------------------------------------------------------------------------ |
+| view                         | Can view dashboard and analytics of podcast #{id}.                       |
+| edit                         | Can edit podcast #{id}.                                                  |
+| delete                       | Can delete podcast #{id}.                                                |
+| manage-import                | Can synchronize imported podcast #{id}.                                  |
+| manage-persons               | Can manage subscriptions of podcast #{id}.                               |
+| manage-subscriptions         | Can manage subscriptions of podcast #{id}.                               |
+| manage-contributors          | Can manage contributors of podcast #{id}.                                |
+| manage-platforms             | Can set/remove platform links of podcast #{id}.                          |
+| manage-publications          | Can publish podcast #{id}.                                               |
+| manage-notifications         | Can view and mark notifications as read for podcast #{id}.               |
+| interact-as                  | Can interact as the podcast #{id} to favourite, share or reply to posts. |
+| episodes.view                | Can view dashboard and analytics of podcast #{id}.                       |
+| episodes.create              | Can create episodes for podcast #{id}.                                   |
+| episodes.edit                | Can edit podcast #{id}.                                                  |
+| episodes.delete              | Can delete podcast #{id}.                                                |
+| episodes.manage-persons      | Can manage subscriptions of podcast #{id}.                               |
+| episodes.manage-clips        | Can manage video clips or soundbites of podcast #{id}.                   |
+| episodes.manage-publications | Can publish podcast #{id}.                                               |
+| episodes.manage-comments     | Can create/remove episode comments of podcast #{id}.                     |
+
+<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
diff --git a/docs/src/fr_CA/getting-started/docker.md b/docs/src/fr_CA/getting-started/docker.md
new file mode 100644
index 0000000000..c6e6cb7e65
--- /dev/null
+++ b/docs/src/fr_CA/getting-started/docker.md
@@ -0,0 +1,177 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 3 Docker images to the Docker Hub during its automated build
+process:
+
+- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
+  with all of Castopod dependencies
+- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
+  Nginx configuration for Castopod
+- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
+  an optional image building videoclips thanks to ffmpeg
+
+Additionally, Castopod requires a MySQL-compatible database. A Redis database
+can be added as a cache handler.
+
+## Supported tags
+
+- `develop` [unstable], latest development branch build
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
+- `latest` [stable], latest version build
+- `1.x.x` [stable], specific version build (since `1.0.0`)
+
+## Example usage
+
+1.  Install [docker](https://docs.docker.com/get-docker/) and
+    [docker-compose](https://docs.docker.com/compose/install/)
+2.  Create a `docker-compose.yml` file with the following:
+
+    ```yml
+    version: "3.7"
+
+    services:
+      app:
+        image: castopod/app:latest
+        container_name: "castopod-app"
+        volumes:
+          - castopod-media:/opt/castopod/public/media
+        environment:
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+          CP_BASEURL: "http://castopod.example.com"
+          CP_ANALYTICS_SALT: changeme
+          CP_CACHE_HANDLER: redis
+          CP_REDIS_HOST: redis
+        networks:
+          - castopod-app
+          - castopod-db
+        restart: unless-stopped
+
+      web-server:
+        image: castopod/web-server:latest
+        container_name: "castopod-web-server"
+        volumes:
+          - castopod-media:/var/www/html/media
+        networks:
+          - castopod-app
+        ports:
+          - 8080:80
+        restart: unless-stopped
+
+      mariadb:
+        image: mariadb:10.5
+        container_name: "castopod-mariadb"
+        networks:
+          - castopod-db
+        volumes:
+          - castopod-db:/var/lib/mysql
+        environment:
+          MYSQL_ROOT_PASSWORD: changeme
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+        restart: unless-stopped
+
+      redis:
+        image: redis:7.0-alpine
+        container_name: "castopod-redis"
+        volumes:
+          - castopod-cache:/data
+        networks:
+          - castopod-app
+
+      # this container is optional
+      # add this if you want to use the videoclips feature
+      video-clipper:
+        image: castopod/video-clipper:latest
+        container_name: "castopod-video-clipper"
+        volumes:
+          - castopod-media:/opt/castopod/public/media
+        environment:
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+        networks:
+          - castopod-db
+        restart: unless-stopped
+
+    volumes:
+      castopod-media:
+      castopod-db:
+      castopod-cache:
+
+    networks:
+      castopod-app:
+      castopod-db:
+    ```
+
+    You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
+    `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
+
+3.  Setup a reverse proxy for TLS (SSL/HTTPS)
+
+    TLS is mandatory for ActivityPub to work. This job can easily be handled by
+    a reverse proxy, for example with [Caddy](https://caddyserver.com/):
+
+    ```
+    #castopod
+    castopod.example.com {
+        reverse_proxy localhost:8080
+    }
+    ```
+
+4.  Run `docker-compose up -d`, wait for it to initialize and head on to
+    `https://castopod.example.com/cp-install` to finish setting up Castopod!
+
+5.  You're all set, start podcasting! 🎙️🚀
+
+## Environment Variables
+
+- **castopod/video-clipper**
+
+  | Variable name              | Type (`default`) | Default          |
+  | -------------------------- | ---------------- | ---------------- |
+  | **`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_"`          |
+
+- **castopod/app**
+
+  | 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"` |
diff --git a/docs/src/fr_CA/getting-started/install.md b/docs/src/fr_CA/getting-started/install.md
new file mode 100644
index 0000000000..41b5153c8d
--- /dev/null
+++ b/docs/src/fr_CA/getting-started/install.md
@@ -0,0 +1,216 @@
+---
+title: Installation
+sidebarDepth: 3
+---
+
+# How to install Castopod?
+
+Castopod was thought-out to be easy to install. Whether using dedicated or
+shared hosting, you can install it on most PHP-MySQL compatible web servers.
+
+::: tip Note
+
+We've released official Docker images for Castopod!
+
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
+
+:::
+
+## Requirements
+
+- PHP v8.1 or higher
+- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
+- HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
+
+### PHP v8.1 or higher
+
+PHP version 8.1 or higher is required, with the following extensions installed:
+
+- [intl](https://php.net/manual/en/intl.requirements.php)
+- [libcurl](https://php.net/manual/en/curl.requirements.php)
+- [mbstring](https://php.net/manual/en/mbstring.installation.php)
+- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**,
+  **PNG** and **WEBP** libraries.
+- [exif](https://www.php.net/manual/en/exif.installation.php)
+
+Additionally, make sure that the following extensions are enabled in your PHP:
+
+- json (enabled by default - don't turn it off)
+- xml (enabled by default - don't turn it off)
+- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
+
+### MySQL compatible database
+
+> We recommend using [MariaDB](https://mariadb.org).
+
+::: warning Warning
+
+Castopod only works with supported MySQL 5.7 or higher compatible databases. It
+will break with the previous MySQL v5.6 for example as its end of life was on
+February 5, 2021.
+
+:::
+
+You will need the server hostname, database name, username and password to
+complete the installation process. If you do not have these, please contact your
+server administrator.
+
+#### Privileges
+
+User must have at least these privileges on the database for Castopod to work:
+`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`,
+`REFERENCES`, `CREATE VIEW`.
+
+### (Optional) FFmpeg v4.1.8 or higher for Video Clips
+
+[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you
+want to generate Video Clips. The following extensions must be installed:
+
+- **FreeType 2** library for
+  [gd](https://www.php.net/manual/en/image.installation.php).
+
+### (Optional) Other recommendations
+
+- Redis for better cache performances.
+- CDN for static files caching and better performances.
+- e-mail gateway for lost passwords.
+
+## Install instructions
+
+### Pre-requisites
+
+0. Get a Web Server with [requirements](#requirements) installed
+1. Create a MySQL database for Castopod with a user having access and
+   modification privileges (for more info, see
+   [MySQL compatible database](#mysql-compatible-database)).
+2. Activate HTTPS on your domain with an _SSL certificate_.
+3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto
+   the web server if you haven’t already.
+   - ⚠️ Set the web server document root to the `public/` sub-folder within the
+     `castopod` folder.
+4. Add **cron tasks** on your web server for various background processes
+   (replace the paths accordingly):
+
+   - For social features to work properly, this task is used to broadcast social
+     activities to your followers on the fediverse:
+
+   ```bash
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities
+   ```
+
+   - For having your episodes be broadcasted on open hubs upon publication using
+     [WebSub](https://en.wikipedia.org/wiki/WebSub):
+
+   ```bash
+      * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish
+   ```
+
+   - For Video Clips to be created (see
+     [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)):
+
+   ```bash
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
+   ```
+
+   > These tasks run **every minute**. You may set the frequency depending on
+   > your needs: every 5, 10 minutes or more.
+
+### (recommended) Install Wizard
+
+1. Run the Castopod install script by going to the install wizard page
+   (`https://your_domain_name.com/cp-install`) in your favorite web browser.
+2. Follow the instructions on your screen.
+3. Start podcasting!
+
+::: 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 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"`      |
+
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
+## Community packages
+
+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.
+
+### 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
+self-hosting for you.
+
+<div class="flex flex-wrap items-center gap-4">
+
+<a href="https://install-app.yunohost.org/?app=castopod" target="_blank" rel="noopener noreferrer">
+   <img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Install Castopod with YunoHost" class="align-middle" />
+</a>
+
+<a href="https://github.com/YunoHost-Apps/castopod_ynh" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"><svg
+   xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em"
+   class="text-xl"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z"/></svg>Github
+Repo</a>
+
+</div>
diff --git a/docs/src/fr_CA/getting-started/security.md b/docs/src/fr_CA/getting-started/security.md
new file mode 100644
index 0000000000..e205698df8
--- /dev/null
+++ b/docs/src/fr_CA/getting-started/security.md
@@ -0,0 +1,26 @@
+---
+title: Security
+---
+
+# Security concerns
+
+Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
+framework that encourages
+[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
+
+To maximize your instance's safety and prevent any malicious attack, we
+recommend you update all your Castopod files permissions after installation or
+updates (to avoid any prior permission error):
+
+- `writable/` folder must be **readable** and **writable**.
+- `public/media/` folder must be **readable** and **writable**.
+- any other file must be set to **readonly**.
+
+For instance, if you are using Apache or NGINX with Ubuntu you may do the
+following:
+
+```bash
+sudo chown -R root:root /path/to/castopod
+sudo chown -R www-data:www-data /path/to/castopod/writable
+sudo chown -R www-data:www-data /path/to/castopod/public/media
+```
diff --git a/docs/src/fr_CA/getting-started/update.md b/docs/src/fr_CA/getting-started/update.md
new file mode 100644
index 0000000000..98e019fbc7
--- /dev/null
+++ b/docs/src/fr_CA/getting-started/update.md
@@ -0,0 +1,109 @@
+---
+title: Update
+sidebarDepth: 3
+---
+
+# How to update Castopod?
+
+After installing Castopod, you may want to update your instance to the latest
+version in order to enjoy the latest features ✨, bug fixes 🐛 and performance
+improvements ⚡.
+
+## Update instructions
+
+0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
+   database.
+
+   - cf.
+     [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
+
+1. Go to the
+   [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
+   see if your instance is up to date with the latest Castopod version
+
+   - cf.
+     [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
+
+2. Download the latest release package named `Castopod Package`, you may choose
+   between the `zip` or `tar.gz` archives
+
+   - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
+   - Note that you can also download the latest package from
+     [castopod.org](https://castopod.org/)
+
+3. On your server:
+
+   - Remove all files except `.env` and `public/media`
+   - Copy the new files from the downloaded package into your server
+
+     ::: info Note
+
+     You may need to reset files permissions as during the install process.
+     Check [Security Concerns](./security.md).
+
+     :::
+
+4. Update your database schema from your `Castopod Admin` > `About` page or by
+   running:
+
+   ```bash
+   php spark castopod:database-update
+   ```
+
+5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
+   `Housekeeping`
+6. ✨ Enjoy your fresh instance, you're all done!
+
+::: info Note
+
+Releases may come with additional update instructions (see
+[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
+
+- cf.
+  [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
+
+:::
+
+## Fully Automated updates
+
+> Coming soon... 👀
+
+## Frequently asked questions (FAQ)
+
+### Where can I find my Castopod version?
+
+Go to your Castopod admin panel, the version is displayed on the bottom left
+corner.
+
+Alternatively, you can find the version in the `app > Config > Constants.php`
+file.
+
+### I haven't updated my instance in a long time… What should I do?
+
+No problem! Just get the latest release as described above. Only, when going
+through the release instructions (4), perform them sequentially, from the oldest
+to the newest.
+
+> You may want to backup your instance depending on how long you haven't updated
+> Castopod.
+
+For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
+`v1.0.0-beta.1`:
+
+0. (highly recommended) Make a backup of your files and database.
+
+1. Download the latest release, overwrite your files whilst keeping `.env` and
+   `public/media`.
+
+2. Go through each release update instructions sequentially (from oldest to
+   newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`,
+   `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`.
+
+3. ✨ Enjoy your fresh instance, you're all done!
+
+### Should I make a backup before updating?
+
+We advise you do, so you don't lose everything if anything goes wrong!
+
+More generally, we advise you make regular backups of your Castopod files and
+database to prevent you from losing it all…
diff --git a/docs/src/fr_CA/index.md b/docs/src/fr_CA/index.md
new file mode 100644
index 0000000000..6e04835b64
--- /dev/null
+++ b/docs/src/fr_CA/index.md
@@ -0,0 +1,303 @@
+---
+sidebarDepth: 2
+---
+
+# Welcome 👋
+
+[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&nbsp;[![discord-badge]][discord]&nbsp;[![stars-badge]][stars]
+
+Castopod is a free & open-source hosting platform made for podcasters who want
+engage and interact with their audience.
+
+Castopod is easy to install and was built on top of
+[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very
+small footprint.
+
+::: info Status
+
+Castopod is currently in **beta** but already quite stable and used by
+podcasters around&nbsp;the&nbsp;world!
+
+:::
+
+<div class="flex items-center">
+  <a href="/getting-started/install" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-full shadow gap-x-1 bg-pine-500 hover:no-underline hover:bg-pine-600">Install<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
+</div>
+
+## Features
+
+- 🌱 &nbsp;Free & open-source (AGPL v3 License)
+- 🔐 &nbsp;Focused on data sovereignty: your content, audience, and analytics
+  belong to you, and&nbsp;you&nbsp;only
+- 🪄 &nbsp;Podcasting 2.0 features: GUID, locked, transcripts, funding,
+  chapters, location, persons, soundbites, …
+- 💬 &nbsp;Built-in social network:
+  - 🚀 &nbsp;Castopod is part of the Fediverse, a decentralized social network
+  - ❤️ &nbsp;Create posts, share, favourite, and comment on episodes
+- 📈 &nbsp;Built-in analytics:
+  - ⚖️ &nbsp;GDPR / CCPA / LGPD compliant
+  - 🪙 &nbsp;Standard IABv2 audience measurement
+  - 🏡 &nbsp;On-premises analytics, no third party involved
+- 📢 &nbsp;Built-in marketing tools:
+  - ✅ &nbsp;SEO ready (open-graph meta-tags, JSON-LD, …)
+  - 📱 &nbsp;PWA: install as a standalone app
+  - 🎨 &nbsp;Customizable theme colors
+  - 🎬 &nbsp;Generate ready-to-share Video clips from episodes
+  - 🔉 &nbsp;Generate soundbites
+  - ▶️ &nbsp;Embeddable player, embed your episodes on any website
+- 💸 &nbsp;Monetization:
+  - 🔗 &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, …
+  - ⚡ &nbsp;Broadcast your episodes instantly with WebSub
+- 📥 &nbsp;Podcast import: move your existing podcast into Castopod
+- 📤 &nbsp;Move your podcast out of Castopod
+- 🔀 &nbsp;Multi-tenant: host as many podcasts as you want
+- 👥 &nbsp;Multi-user: add contributors and set roles
+- 🌎 &nbsp;i18n support: translated in English, French, Polish, German,
+  Brazilian Portuguese & Spanish… with
+  [more to come](https://translate.castopod.org)!
+
+## Motivation
+
+The podcasting ecosystem is decentralized by nature: you can create your podcast
+as an RSS file, publish it on the web and have it shared everywhere online.
+
+It is in fact one of the only media to have stayed this way for a long time.
+
+As usages are evolving, more and more people are getting into podcasts: whether
+it is creators finding new ways to share their ideas, or listeners in the search
+for better content.
+
+With podcasting becoming more widely used, some companies are trying to shift it
+towards a more controlled and centralized medium.
+
+Castopod was created in an effort to provide an open and sustainable alternative
+to hosting your podcasts, promoting decentralization to ensure that podcasters
+creativity can express itself.
+
+This project is pushed by the open-source community, and specifically by the
+[Fediverse](https://fediverse.party/en/fediverse/) and
+[Podcasting 2.0](https://podcastindex.org/) movements.
+
+## Comparison with other solutions
+
+We believe that a solution is not necessarily right for everyone, it highly
+depends on your needs. So, here are comparisons with other tools to help you to
+gauge whether Castopod is the right fit for&nbsp;you.
+
+### Castopod vs Wordpress
+
+Castopod is often referred to as "the Wordpress for podcasts" because of the
+similarities between the two. In some ways this is true. And actually, Castopod
+was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption
+from the community and the number of websites running&nbsp;it.
+
+Just like Wordpress, Castopod is free & open source, built using PHP with a
+MySQL database and is packaged in a way that you can easily install on most web
+servers.
+
+Wordpress is a great way to create your website and extend it with plugins to
+get what you want. It is a full fledged CMS that helps you get any type of
+website online.
+
+On the other hand, Castopod is meant to address the podcasters needs
+specifically, focusing on podcasting, and nothing else. You don't need any
+plugin to get you started on your podcasting&nbsp;journey.
+
+This allows optimizing the processes specific to podcasting: ranging from the
+creation of your podcasts and the publication of new episodes all the way to
+broadcasting, marketing and analytics.
+
+Finally, depending on your needs, Wordpress and Castopod can even live side by
+side as they share the same requirements!
+
+### Castopod vs Funkwhale
+
+Funkwhale is a self-hosted, modern free and open-source music server. Just as
+Castopod, Funkwhale is on the fediverse, a decentralized social network allowing
+interoperability between the two.
+
+Funkwhale was initially built around music. And later on, as the project
+evolved, the ability to host podcasts was introduced.
+
+Unlike Funkwhale, Castopod has been designed and built around podcasting
+exclusively. This allows easier implementation for features related to the
+podcasting ecosystem, such as the podcasting 2.0 features (transcripts,
+chapters, locations, persons, …).
+
+So, you should probably use Funkwhale if you want to host your music, and use
+Castopod if you want to host your podcasts.
+
+### Castopod vs other podcast hosts
+
+There are many solutions for you to host your podcasts, some of which are really
+great and [a lot of them](https://podcastindex.org/apps) are jumping into the
+Podcasting 2.0 wagon just like Castopod!
+
+Each of these solutions differ from one another, you may compare with the
+[list of features](#features).
+
+That being said, there are two main differences with other podcasting solutions:
+
+- Castopod can be self-hosted and is the only solution that allows you to keep
+  full control over what you produce. Also, as it is open-source, you can even
+  customize it as you wish.
+
+- Castopod is the only solution that currently integrates both a decentralized
+  social network with ActivityPub as well as many of the podcasting 2.0
+  features, hoping to bridge the gap between the two.
+
+## Contributing
+
+Love Castopod and would like to help? Take a look at the following documentation
+to get you&nbsp;started.
+
+### Code of conduct
+
+Castopod has adopted a Code of Conduct that we expect project participants to
+adhere to. Please read the
+[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
+so that you can understand what actions will and will not be&nbsp;tolerated.
+
+### Contributing guide
+
+Read our [contributing guide](./contributing/guidelines.md) to learn about our
+development process, how to propose bugfixes and improvements, and how to build
+and test your changes to Castopod.
+
+## Contributors ✨
+
+Thanks goes to these wonderful people
+([emoji key](https://allcontributors.org/docs/en/emoji-key)):
+
+<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
+<!-- prettier-ignore-start -->
+<!-- markdownlint-disable -->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑‍🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+  </tbody>
+</table>
+
+<!-- markdownlint-restore -->
+<!-- prettier-ignore-end -->
+
+<!-- ALL-CONTRIBUTORS-LIST:END -->
+
+This project follows the
+[all-contributors](https://github.com/all-contributors/all-contributors)
+specification. Contributions of any kind welcome!
+
+## Contact
+
+You may reach us for help or ask any question you have on:
+
+- [Discord](https://castopod.org/discord) (for direct interaction with
+  developers and the community)
+- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for
+  feature requests & bug reports)
+
+Alternatively, you can follow us on social media platforms to get news about
+Castopod:
+
+- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
+- [Twitter](https://twitter.com/castopod)
+- [LinkedIn](https://linkedin.com/company/castopod)
+- [Facebook](https://www.facebook.com/castopod)
+
+## Sponsors
+
+The ongoing development of Castopod is made possible with the support of its
+backers. If you'd like to help, please consider
+[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
+
+<div class="flex flex-wrap gap-x-16 gap-y-8">
+  <a href="https://adaures.com/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/adaures.svg" alt="Ad Aures Logo" class="h-16" /></a>
+  <a href="https://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="NLnet Logo" class="h-16" /></a>
+</div>
+
+## License
+
+[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
+
+Copyright © 2020-present, [Ad Aures](https://adaures.com/).
+https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
+https://img.shields.io/github/license/ad-aures/castopod?color=blue
+https://img.shields.io/badge/contributions-welcome-brightgreen.svg
+https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
+https://img.shields.io/github/stars/ad-aures/castopod?style=social
+
+[release]: https://code.castopod.org/adaures/castopod/-/releases
+[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md
+[contributions]: https://code.castopod.org/adaures/castopod/-/issues
+[semantic-release]: https://github.com/semantic-release/semantic-release
+[discord]: https://castopod.org/discord
+[stars]: https://github.com/ad-aures/castopod/stargazers
+[crowdin]: https://translate.castopod.org/project/castopod
diff --git a/docs/src/fr_trad/getting-started/auth.md b/docs/src/fr_trad/getting-started/auth.md
new file mode 100644
index 0000000000..ff5d59c067
--- /dev/null
+++ b/docs/src/fr_trad/getting-started/auth.md
@@ -0,0 +1,87 @@
+---
+title: Authentication & Authorization
+sidebarDepth: 3
+---
+
+# Authentication & Authorization
+
+Castopod handles authentication and authorization using `codeigniter/shield`
+coupled with custom rules. Roles and permissions are defined at two levels:
+
+1. [instance wide](#1-instance-wide-roles-and-permissions)
+2. [per podcast](#2-per-podcast-roles-and-permissions)
+
+## 1. Instance wide roles and permissions
+
+### Instance roles
+
+<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
+
+| role        | description                         | permissions                                                                                |
+| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
+| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
+| Manager     | Manages Castopod's content.         | podcasts.create, podcasts.import, persons.manage, pages.manage                             |
+| Podcaster   | General users of Castopod.          | admin.access                                                                               |
+
+<!-- AUTH-INSTANCE-ROLES-LIST:END -->
+
+### Instance permissions
+
+<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
+
+| permission              | description                                                        |
+| ----------------------- | ------------------------------------------------------------------ |
+| admin.access            | Can access the Castopod admin area.                                |
+| admin.settings          | Can access the Castopod settings.                                  |
+| users.manage            | Can manage Castopod users.                                         |
+| persons.manage          | Can manage persons.                                                |
+| pages.manage            | Can manage pages.                                                  |
+| podcasts.view           | Can view all podcasts.                                             |
+| podcasts.create         | Can create new podcasts.                                           |
+| podcasts.import         | Can import podcasts.                                               |
+| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
+
+<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
+
+## 2. Per podcast roles and permissions
+
+### Per podcast roles
+
+<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
+
+| role   | description                                               | permissions                                                                                                                                                                                                                                                                                 |
+| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Admin  | Has complete control of podcast #{id}.                    | \*                                                                                                                                                                                                                                                                                          |
+| Editor | Manages content and publications of podcast #{id}.        | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
+| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips                                                                                                                                                                         |
+| Guest  | General contributor of the podcast #{id}.                 | view, episodes.view                                                                                                                                                                                                                                                                         |
+
+<!-- AUTH-PODCAST-ROLES-LIST:END -->
+
+### Per podcast permissions
+
+<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
+
+| permission                   | description                                                              |
+| ---------------------------- | ------------------------------------------------------------------------ |
+| view                         | Can view dashboard and analytics of podcast #{id}.                       |
+| edit                         | Can edit podcast #{id}.                                                  |
+| delete                       | Can delete podcast #{id}.                                                |
+| manage-import                | Can synchronize imported podcast #{id}.                                  |
+| manage-persons               | Can manage subscriptions of podcast #{id}.                               |
+| manage-subscriptions         | Can manage subscriptions of podcast #{id}.                               |
+| manage-contributors          | Can manage contributors of podcast #{id}.                                |
+| manage-platforms             | Can set/remove platform links of podcast #{id}.                          |
+| manage-publications          | Can publish podcast #{id}.                                               |
+| manage-notifications         | Can view and mark notifications as read for podcast #{id}.               |
+| interact-as                  | Can interact as the podcast #{id} to favourite, share or reply to posts. |
+| episodes.view                | Can view dashboard and analytics of podcast #{id}.                       |
+| episodes.create              | Can create episodes for podcast #{id}.                                   |
+| episodes.edit                | Can edit podcast #{id}.                                                  |
+| episodes.delete              | Can delete podcast #{id}.                                                |
+| episodes.manage-persons      | Can manage subscriptions of podcast #{id}.                               |
+| episodes.manage-clips        | Can manage video clips or soundbites of podcast #{id}.                   |
+| episodes.manage-publications | Can publish podcast #{id}.                                               |
+| episodes.manage-comments     | Can create/remove episode comments of podcast #{id}.                     |
+
+<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
diff --git a/docs/src/fr_trad/getting-started/docker.md b/docs/src/fr_trad/getting-started/docker.md
new file mode 100644
index 0000000000..c6e6cb7e65
--- /dev/null
+++ b/docs/src/fr_trad/getting-started/docker.md
@@ -0,0 +1,177 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 3 Docker images to the Docker Hub during its automated build
+process:
+
+- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
+  with all of Castopod dependencies
+- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
+  Nginx configuration for Castopod
+- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
+  an optional image building videoclips thanks to ffmpeg
+
+Additionally, Castopod requires a MySQL-compatible database. A Redis database
+can be added as a cache handler.
+
+## Supported tags
+
+- `develop` [unstable], latest development branch build
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
+- `latest` [stable], latest version build
+- `1.x.x` [stable], specific version build (since `1.0.0`)
+
+## Example usage
+
+1.  Install [docker](https://docs.docker.com/get-docker/) and
+    [docker-compose](https://docs.docker.com/compose/install/)
+2.  Create a `docker-compose.yml` file with the following:
+
+    ```yml
+    version: "3.7"
+
+    services:
+      app:
+        image: castopod/app:latest
+        container_name: "castopod-app"
+        volumes:
+          - castopod-media:/opt/castopod/public/media
+        environment:
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+          CP_BASEURL: "http://castopod.example.com"
+          CP_ANALYTICS_SALT: changeme
+          CP_CACHE_HANDLER: redis
+          CP_REDIS_HOST: redis
+        networks:
+          - castopod-app
+          - castopod-db
+        restart: unless-stopped
+
+      web-server:
+        image: castopod/web-server:latest
+        container_name: "castopod-web-server"
+        volumes:
+          - castopod-media:/var/www/html/media
+        networks:
+          - castopod-app
+        ports:
+          - 8080:80
+        restart: unless-stopped
+
+      mariadb:
+        image: mariadb:10.5
+        container_name: "castopod-mariadb"
+        networks:
+          - castopod-db
+        volumes:
+          - castopod-db:/var/lib/mysql
+        environment:
+          MYSQL_ROOT_PASSWORD: changeme
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+        restart: unless-stopped
+
+      redis:
+        image: redis:7.0-alpine
+        container_name: "castopod-redis"
+        volumes:
+          - castopod-cache:/data
+        networks:
+          - castopod-app
+
+      # this container is optional
+      # add this if you want to use the videoclips feature
+      video-clipper:
+        image: castopod/video-clipper:latest
+        container_name: "castopod-video-clipper"
+        volumes:
+          - castopod-media:/opt/castopod/public/media
+        environment:
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+        networks:
+          - castopod-db
+        restart: unless-stopped
+
+    volumes:
+      castopod-media:
+      castopod-db:
+      castopod-cache:
+
+    networks:
+      castopod-app:
+      castopod-db:
+    ```
+
+    You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
+    `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
+
+3.  Setup a reverse proxy for TLS (SSL/HTTPS)
+
+    TLS is mandatory for ActivityPub to work. This job can easily be handled by
+    a reverse proxy, for example with [Caddy](https://caddyserver.com/):
+
+    ```
+    #castopod
+    castopod.example.com {
+        reverse_proxy localhost:8080
+    }
+    ```
+
+4.  Run `docker-compose up -d`, wait for it to initialize and head on to
+    `https://castopod.example.com/cp-install` to finish setting up Castopod!
+
+5.  You're all set, start podcasting! 🎙️🚀
+
+## Environment Variables
+
+- **castopod/video-clipper**
+
+  | Variable name              | Type (`default`) | Default          |
+  | -------------------------- | ---------------- | ---------------- |
+  | **`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_"`          |
+
+- **castopod/app**
+
+  | 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"` |
diff --git a/docs/src/fr_trad/getting-started/install.md b/docs/src/fr_trad/getting-started/install.md
new file mode 100644
index 0000000000..c68be846b2
--- /dev/null
+++ b/docs/src/fr_trad/getting-started/install.md
@@ -0,0 +1,185 @@
+---
+title: Installation
+sidebarDepth: 3
+---
+
+# How to install Castopod?
+
+Castopod was thought-out to be easy to install. Whether using dedicated or
+shared hosting, you can install it on most PHP-MySQL compatible web servers.
+
+::: tip Note
+
+We've released official Docker images for Castopod!
+
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
+
+:::
+
+## Requirements
+
+- PHP v8.1 or higher
+- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
+- HTTPS support
+
+### PHP v8.1 or higher
+
+PHP version 8.1 or higher is required, with the following extensions installed:
+
+- [intl](https://php.net/manual/en/intl.requirements.php)
+- [libcurl](https://php.net/manual/en/curl.requirements.php)
+- [mbstring](https://php.net/manual/en/mbstring.installation.php)
+- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**,
+  **PNG** and **WEBP** libraries.
+- [exif](https://www.php.net/manual/en/exif.installation.php)
+
+Additionally, make sure that the following extensions are enabled in your PHP:
+
+- json (enabled by default - don't turn it off)
+- xml (enabled by default - don't turn it off)
+- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
+
+### MySQL compatible database
+
+> We recommend using [MariaDB](https://mariadb.org).
+
+::: warning Warning
+
+Castopod only works with supported MySQL 5.7 or higher compatible databases. It
+will break with the previous MySQL v5.6 for example as its end of life was on
+February 5, 2021.
+
+:::
+
+You will need the server hostname, database name, username and password to
+complete the installation process. If you do not have these, please contact your
+server administrator.
+
+#### Privileges
+
+User must have at least these privileges on the database for Castopod to work:
+`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`,
+`REFERENCES`, `CREATE VIEW`.
+
+### (Optional) FFmpeg v4.1.8 or higher for Video Clips
+
+[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you
+want to generate Video Clips. The following extensions must be installed:
+
+- **FreeType 2** library for
+  [gd](https://www.php.net/manual/en/image.installation.php).
+
+### (Optional) Other recommendations
+
+- Redis for better cache performances.
+- CDN for static files caching and better performances.
+- e-mail gateway for lost passwords.
+
+## Install instructions
+
+### Pre-requisites
+
+0. Get a Web Server with [requirements](#requirements) installed
+1. Create a MySQL database for Castopod with a user having access and
+   modification privileges (for more info, see
+   [MySQL compatible database](#mysql-compatible-database)).
+2. Activate HTTPS on your domain with an _SSL certificate_.
+3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto
+   the web server if you haven’t already.
+   - ⚠️ Set the web server document root to the `public/` sub-folder within the
+     `castopod` folder.
+4. Add **cron tasks** on your web server for various background processes
+   (replace the paths accordingly):
+
+   - For social features to work properly, this task is used to broadcast social
+     activities to your followers on the fediverse:
+
+   ```bash
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities
+   ```
+
+   - For having your episodes be broadcasted on open hubs upon publication using
+     [WebSub](https://en.wikipedia.org/wiki/WebSub):
+
+   ```bash
+      * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish
+   ```
+
+   - For Video Clips to be created (see
+     [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)):
+
+   ```bash
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
+   ```
+
+   > These tasks run **every minute**. You may set the frequency depending on
+   > your needs: every 5, 10 minutes or more.
+
+### (recommended) Install Wizard
+
+1. Run the Castopod install script by going to the install wizard page
+   (`https://your_domain_name.com/cp-install`) in your favorite web browser.
+2. Follow the instructions on your screen.
+3. Start podcasting!
+
+::: 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 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
+of the packages created and maintained by the open-source community.
+
+### 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
+self-hosting for you.
+
+<div class="flex flex-wrap items-center gap-4">
+
+<a href="https://install-app.yunohost.org/?app=castopod" target="_blank" rel="noopener noreferrer">
+   <img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Install Castopod with YunoHost" class="align-middle" />
+</a>
+
+<a href="https://github.com/YunoHost-Apps/castopod_ynh" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"><svg
+   xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em"
+   class="text-xl"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z"/></svg>Github
+Repo</a>
+
+</div>
diff --git a/docs/src/fr_trad/getting-started/security.md b/docs/src/fr_trad/getting-started/security.md
new file mode 100644
index 0000000000..e205698df8
--- /dev/null
+++ b/docs/src/fr_trad/getting-started/security.md
@@ -0,0 +1,26 @@
+---
+title: Security
+---
+
+# Security concerns
+
+Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
+framework that encourages
+[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
+
+To maximize your instance's safety and prevent any malicious attack, we
+recommend you update all your Castopod files permissions after installation or
+updates (to avoid any prior permission error):
+
+- `writable/` folder must be **readable** and **writable**.
+- `public/media/` folder must be **readable** and **writable**.
+- any other file must be set to **readonly**.
+
+For instance, if you are using Apache or NGINX with Ubuntu you may do the
+following:
+
+```bash
+sudo chown -R root:root /path/to/castopod
+sudo chown -R www-data:www-data /path/to/castopod/writable
+sudo chown -R www-data:www-data /path/to/castopod/public/media
+```
diff --git a/docs/src/fr_trad/getting-started/update.md b/docs/src/fr_trad/getting-started/update.md
new file mode 100644
index 0000000000..98e019fbc7
--- /dev/null
+++ b/docs/src/fr_trad/getting-started/update.md
@@ -0,0 +1,109 @@
+---
+title: Update
+sidebarDepth: 3
+---
+
+# How to update Castopod?
+
+After installing Castopod, you may want to update your instance to the latest
+version in order to enjoy the latest features ✨, bug fixes 🐛 and performance
+improvements ⚡.
+
+## Update instructions
+
+0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
+   database.
+
+   - cf.
+     [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
+
+1. Go to the
+   [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
+   see if your instance is up to date with the latest Castopod version
+
+   - cf.
+     [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
+
+2. Download the latest release package named `Castopod Package`, you may choose
+   between the `zip` or `tar.gz` archives
+
+   - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
+   - Note that you can also download the latest package from
+     [castopod.org](https://castopod.org/)
+
+3. On your server:
+
+   - Remove all files except `.env` and `public/media`
+   - Copy the new files from the downloaded package into your server
+
+     ::: info Note
+
+     You may need to reset files permissions as during the install process.
+     Check [Security Concerns](./security.md).
+
+     :::
+
+4. Update your database schema from your `Castopod Admin` > `About` page or by
+   running:
+
+   ```bash
+   php spark castopod:database-update
+   ```
+
+5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
+   `Housekeeping`
+6. ✨ Enjoy your fresh instance, you're all done!
+
+::: info Note
+
+Releases may come with additional update instructions (see
+[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
+
+- cf.
+  [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
+
+:::
+
+## Fully Automated updates
+
+> Coming soon... 👀
+
+## Frequently asked questions (FAQ)
+
+### Where can I find my Castopod version?
+
+Go to your Castopod admin panel, the version is displayed on the bottom left
+corner.
+
+Alternatively, you can find the version in the `app > Config > Constants.php`
+file.
+
+### I haven't updated my instance in a long time… What should I do?
+
+No problem! Just get the latest release as described above. Only, when going
+through the release instructions (4), perform them sequentially, from the oldest
+to the newest.
+
+> You may want to backup your instance depending on how long you haven't updated
+> Castopod.
+
+For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
+`v1.0.0-beta.1`:
+
+0. (highly recommended) Make a backup of your files and database.
+
+1. Download the latest release, overwrite your files whilst keeping `.env` and
+   `public/media`.
+
+2. Go through each release update instructions sequentially (from oldest to
+   newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`,
+   `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`.
+
+3. ✨ Enjoy your fresh instance, you're all done!
+
+### Should I make a backup before updating?
+
+We advise you do, so you don't lose everything if anything goes wrong!
+
+More generally, we advise you make regular backups of your Castopod files and
+database to prevent you from losing it all…
diff --git a/docs/src/fr_trad/index.md b/docs/src/fr_trad/index.md
new file mode 100644
index 0000000000..6e04835b64
--- /dev/null
+++ b/docs/src/fr_trad/index.md
@@ -0,0 +1,303 @@
+---
+sidebarDepth: 2
+---
+
+# Welcome 👋
+
+[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&nbsp;[![discord-badge]][discord]&nbsp;[![stars-badge]][stars]
+
+Castopod is a free & open-source hosting platform made for podcasters who want
+engage and interact with their audience.
+
+Castopod is easy to install and was built on top of
+[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very
+small footprint.
+
+::: info Status
+
+Castopod is currently in **beta** but already quite stable and used by
+podcasters around&nbsp;the&nbsp;world!
+
+:::
+
+<div class="flex items-center">
+  <a href="/getting-started/install" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-full shadow gap-x-1 bg-pine-500 hover:no-underline hover:bg-pine-600">Install<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
+</div>
+
+## Features
+
+- 🌱 &nbsp;Free & open-source (AGPL v3 License)
+- 🔐 &nbsp;Focused on data sovereignty: your content, audience, and analytics
+  belong to you, and&nbsp;you&nbsp;only
+- 🪄 &nbsp;Podcasting 2.0 features: GUID, locked, transcripts, funding,
+  chapters, location, persons, soundbites, …
+- 💬 &nbsp;Built-in social network:
+  - 🚀 &nbsp;Castopod is part of the Fediverse, a decentralized social network
+  - ❤️ &nbsp;Create posts, share, favourite, and comment on episodes
+- 📈 &nbsp;Built-in analytics:
+  - ⚖️ &nbsp;GDPR / CCPA / LGPD compliant
+  - 🪙 &nbsp;Standard IABv2 audience measurement
+  - 🏡 &nbsp;On-premises analytics, no third party involved
+- 📢 &nbsp;Built-in marketing tools:
+  - ✅ &nbsp;SEO ready (open-graph meta-tags, JSON-LD, …)
+  - 📱 &nbsp;PWA: install as a standalone app
+  - 🎨 &nbsp;Customizable theme colors
+  - 🎬 &nbsp;Generate ready-to-share Video clips from episodes
+  - 🔉 &nbsp;Generate soundbites
+  - ▶️ &nbsp;Embeddable player, embed your episodes on any website
+- 💸 &nbsp;Monetization:
+  - 🔗 &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, …
+  - ⚡ &nbsp;Broadcast your episodes instantly with WebSub
+- 📥 &nbsp;Podcast import: move your existing podcast into Castopod
+- 📤 &nbsp;Move your podcast out of Castopod
+- 🔀 &nbsp;Multi-tenant: host as many podcasts as you want
+- 👥 &nbsp;Multi-user: add contributors and set roles
+- 🌎 &nbsp;i18n support: translated in English, French, Polish, German,
+  Brazilian Portuguese & Spanish… with
+  [more to come](https://translate.castopod.org)!
+
+## Motivation
+
+The podcasting ecosystem is decentralized by nature: you can create your podcast
+as an RSS file, publish it on the web and have it shared everywhere online.
+
+It is in fact one of the only media to have stayed this way for a long time.
+
+As usages are evolving, more and more people are getting into podcasts: whether
+it is creators finding new ways to share their ideas, or listeners in the search
+for better content.
+
+With podcasting becoming more widely used, some companies are trying to shift it
+towards a more controlled and centralized medium.
+
+Castopod was created in an effort to provide an open and sustainable alternative
+to hosting your podcasts, promoting decentralization to ensure that podcasters
+creativity can express itself.
+
+This project is pushed by the open-source community, and specifically by the
+[Fediverse](https://fediverse.party/en/fediverse/) and
+[Podcasting 2.0](https://podcastindex.org/) movements.
+
+## Comparison with other solutions
+
+We believe that a solution is not necessarily right for everyone, it highly
+depends on your needs. So, here are comparisons with other tools to help you to
+gauge whether Castopod is the right fit for&nbsp;you.
+
+### Castopod vs Wordpress
+
+Castopod is often referred to as "the Wordpress for podcasts" because of the
+similarities between the two. In some ways this is true. And actually, Castopod
+was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption
+from the community and the number of websites running&nbsp;it.
+
+Just like Wordpress, Castopod is free & open source, built using PHP with a
+MySQL database and is packaged in a way that you can easily install on most web
+servers.
+
+Wordpress is a great way to create your website and extend it with plugins to
+get what you want. It is a full fledged CMS that helps you get any type of
+website online.
+
+On the other hand, Castopod is meant to address the podcasters needs
+specifically, focusing on podcasting, and nothing else. You don't need any
+plugin to get you started on your podcasting&nbsp;journey.
+
+This allows optimizing the processes specific to podcasting: ranging from the
+creation of your podcasts and the publication of new episodes all the way to
+broadcasting, marketing and analytics.
+
+Finally, depending on your needs, Wordpress and Castopod can even live side by
+side as they share the same requirements!
+
+### Castopod vs Funkwhale
+
+Funkwhale is a self-hosted, modern free and open-source music server. Just as
+Castopod, Funkwhale is on the fediverse, a decentralized social network allowing
+interoperability between the two.
+
+Funkwhale was initially built around music. And later on, as the project
+evolved, the ability to host podcasts was introduced.
+
+Unlike Funkwhale, Castopod has been designed and built around podcasting
+exclusively. This allows easier implementation for features related to the
+podcasting ecosystem, such as the podcasting 2.0 features (transcripts,
+chapters, locations, persons, …).
+
+So, you should probably use Funkwhale if you want to host your music, and use
+Castopod if you want to host your podcasts.
+
+### Castopod vs other podcast hosts
+
+There are many solutions for you to host your podcasts, some of which are really
+great and [a lot of them](https://podcastindex.org/apps) are jumping into the
+Podcasting 2.0 wagon just like Castopod!
+
+Each of these solutions differ from one another, you may compare with the
+[list of features](#features).
+
+That being said, there are two main differences with other podcasting solutions:
+
+- Castopod can be self-hosted and is the only solution that allows you to keep
+  full control over what you produce. Also, as it is open-source, you can even
+  customize it as you wish.
+
+- Castopod is the only solution that currently integrates both a decentralized
+  social network with ActivityPub as well as many of the podcasting 2.0
+  features, hoping to bridge the gap between the two.
+
+## Contributing
+
+Love Castopod and would like to help? Take a look at the following documentation
+to get you&nbsp;started.
+
+### Code of conduct
+
+Castopod has adopted a Code of Conduct that we expect project participants to
+adhere to. Please read the
+[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
+so that you can understand what actions will and will not be&nbsp;tolerated.
+
+### Contributing guide
+
+Read our [contributing guide](./contributing/guidelines.md) to learn about our
+development process, how to propose bugfixes and improvements, and how to build
+and test your changes to Castopod.
+
+## Contributors ✨
+
+Thanks goes to these wonderful people
+([emoji key](https://allcontributors.org/docs/en/emoji-key)):
+
+<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
+<!-- prettier-ignore-start -->
+<!-- markdownlint-disable -->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑‍🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+  </tbody>
+</table>
+
+<!-- markdownlint-restore -->
+<!-- prettier-ignore-end -->
+
+<!-- ALL-CONTRIBUTORS-LIST:END -->
+
+This project follows the
+[all-contributors](https://github.com/all-contributors/all-contributors)
+specification. Contributions of any kind welcome!
+
+## Contact
+
+You may reach us for help or ask any question you have on:
+
+- [Discord](https://castopod.org/discord) (for direct interaction with
+  developers and the community)
+- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for
+  feature requests & bug reports)
+
+Alternatively, you can follow us on social media platforms to get news about
+Castopod:
+
+- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
+- [Twitter](https://twitter.com/castopod)
+- [LinkedIn](https://linkedin.com/company/castopod)
+- [Facebook](https://www.facebook.com/castopod)
+
+## Sponsors
+
+The ongoing development of Castopod is made possible with the support of its
+backers. If you'd like to help, please consider
+[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
+
+<div class="flex flex-wrap gap-x-16 gap-y-8">
+  <a href="https://adaures.com/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/adaures.svg" alt="Ad Aures Logo" class="h-16" /></a>
+  <a href="https://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="NLnet Logo" class="h-16" /></a>
+</div>
+
+## License
+
+[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
+
+Copyright © 2020-present, [Ad Aures](https://adaures.com/).
+https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
+https://img.shields.io/github/license/ad-aures/castopod?color=blue
+https://img.shields.io/badge/contributions-welcome-brightgreen.svg
+https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
+https://img.shields.io/github/stars/ad-aures/castopod?style=social
+
+[release]: https://code.castopod.org/adaures/castopod/-/releases
+[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md
+[contributions]: https://code.castopod.org/adaures/castopod/-/issues
+[semantic-release]: https://github.com/semantic-release/semantic-release
+[discord]: https://castopod.org/discord
+[stars]: https://github.com/ad-aures/castopod/stargazers
+[crowdin]: https://translate.castopod.org/project/castopod
diff --git a/docs/src/gd/getting-started/install.md b/docs/src/gd/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/gd/getting-started/install.md
+++ b/docs/src/gd/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/gl/getting-started/install.md b/docs/src/gl/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/gl/getting-started/install.md
+++ b/docs/src/gl/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/id/getting-started/install.md b/docs/src/id/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/id/getting-started/install.md
+++ b/docs/src/id/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/it/getting-started/install.md b/docs/src/it/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/it/getting-started/install.md
+++ b/docs/src/it/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/ko/getting-started/install.md b/docs/src/ko/getting-started/install.md
index 3d73187d08..4cad016e95 100644
--- a/docs/src/ko/getting-started/install.md
+++ b/docs/src/ko/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.0 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.0 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/nl/getting-started/auth.md b/docs/src/nl/getting-started/auth.md
index 821d258515..5041973c55 100644
--- a/docs/src/nl/getting-started/auth.md
+++ b/docs/src/nl/getting-started/auth.md
@@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels:
 
 <!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
 
-| permission              | description                                                        |
-| ----------------------- | ------------------------------------------------------------------ |
-| admin.access            | Kan toegang krijgen tot de beheeromgeving van Castopod.            |
-| admin.settings          | Kan toegang krijgen tot de instellingen van Castopod.              |
-| users.manage            | Kan Castopod-gebruikers beheren.                                   |
-| persons.manage          | Can manage persons.                                                |
-| pages.manage            | Kan pagina's beheren.                                              |
-| podcasts.view           | Kan alle podcasts bekijken.                                        |
-| podcasts.create         | Kan nieuwe podcast aanmaken.                                       |
-| podcasts.import         | Kan podcasts importeren.                                           |
-| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
+| permission              | description                                                          |
+| ----------------------- | -------------------------------------------------------------------- |
+| admin.access            | Kan toegang krijgen tot de beheeromgeving van Castopod.              |
+| admin.settings          | Kan toegang krijgen tot de instellingen van Castopod.                |
+| users.manage            | Kan Castopod-gebruikers beheren.                                     |
+| persons.manage          | Kan personen beheren.                                                |
+| pages.manage            | Kan pagina's beheren.                                                |
+| podcasts.view           | Kan alle podcasts bekijken.                                          |
+| podcasts.create         | Kan nieuwe podcast aanmaken.                                         |
+| podcasts.import         | Kan podcasts importeren.                                             |
+| fediverse.manage-blocks | Kan fediverse actors/domains blokkeren voor interactie met Castopod. |
 
 <!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
 
@@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels:
 
 <!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
 
-| permission                   | description                                                              |
-| ---------------------------- | ------------------------------------------------------------------------ |
-| view                         | Kan dashboard en analyses van podcast #{id} zien.                        |
-| edit                         | Kan podcast #{id} wijzigen.                                              |
-| delete                       | Kan podcast #{id} verwijderen.                                           |
-| manage-import                | Kan de geïmporteerde podcast #{id} synchroniseren.                       |
-| manage-persons               | Can manage subscriptions of podcast #{id}.                               |
-| manage-subscriptions         | Kan abonnementen van podcast #{id} beheren.                              |
-| manage-contributors          | Kan bijdragers van podcast #{id} beheren.                                |
-| manage-platforms             | Can set/remove platform links of podcast #{id}.                          |
-| manage-publications          | Kan podcast #{id} publiceren.                                            |
-| manage-notifications         | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}.       |
-| interact-as                  | Can interact as the podcast #{id} to favourite, share or reply to posts. |
-| episodes.view                | Kan dashboard en analyses van podcast #{id} zien.                        |
-| episodes.create              | Kan afleveringen voor podcast #{id} aanmaken.                            |
-| episodes.edit                | Kan podcast #{id} wijzigen.                                              |
-| episodes.delete              | Kan podcast #{id} verwijderen.                                           |
-| episodes.manage-persons      | Can manage subscriptions of podcast #{id}.                               |
-| episodes.manage-clips        | Kan videoclips of soundbites van podcast #{id} beheren.                  |
-| episodes.manage-publications | Kan podcast #{id} publiceren.                                            |
-| episodes.manage-comments     | Can create/remove episode comments of podcast #{id}.                     |
+| permission                   | description                                                                            |
+| ---------------------------- | -------------------------------------------------------------------------------------- |
+| view                         | Kan dashboard en analyses van podcast #{id} zien.                                      |
+| edit                         | Kan podcast #{id} wijzigen.                                                            |
+| delete                       | Kan podcast #{id} verwijderen.                                                         |
+| manage-import                | Kan de geïmporteerde podcast #{id} synchroniseren.                                     |
+| manage-persons               | Kan abonnementen van podcast #{id} beheren.                                            |
+| manage-subscriptions         | Kan abonnementen van podcast #{id} beheren.                                            |
+| manage-contributors          | Kan bijdragers van podcast #{id} beheren.                                              |
+| manage-platforms             | Kan platform links van podcast #{id} instellen of verwijderen.                         |
+| manage-publications          | Kan podcast #{id} publiceren.                                                          |
+| manage-notifications         | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}.                     |
+| interact-as                  | Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten. |
+| episodes.view                | Kan dashboard en analyses van podcast #{id} zien.                                      |
+| episodes.create              | Kan afleveringen voor podcast #{id} aanmaken.                                          |
+| episodes.edit                | Kan podcast #{id} wijzigen.                                                            |
+| episodes.delete              | Kan podcast #{id} verwijderen.                                                         |
+| episodes.manage-persons      | Kan abonnementen van podcast #{id} beheren.                                            |
+| episodes.manage-clips        | Kan videoclips of soundbites van podcast #{id} beheren.                                |
+| episodes.manage-publications | Kan podcast #{id} publiceren.                                                          |
+| episodes.manage-comments     | Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen.             |
 
 <!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/nl/getting-started/install.md
+++ b/docs/src/nl/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md
index fdd2a81717..4425c486dc 100644
--- a/docs/src/nn-NO/getting-started/install.md
+++ b/docs/src/nn-NO/getting-started/install.md
@@ -23,6 +23,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 eller nyare
 - MySQL versjon 5.7 eller nyare, eller MariaDB versjon 10.2 eller nyare
 - Støtte for HTTPS
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 eller nyare
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Pakker frå brukarsamfunnet
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/oc/getting-started/install.md
+++ b/docs/src/oc/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/pl/getting-started/auth.md b/docs/src/pl/getting-started/auth.md
index ff5d59c067..a953d785cc 100644
--- a/docs/src/pl/getting-started/auth.md
+++ b/docs/src/pl/getting-started/auth.md
@@ -3,7 +3,7 @@ title: Authentication & Authorization
 sidebarDepth: 3
 ---
 
-# Authentication & Authorization
+# Uwierzytelnianie & Autoryzacja
 
 Castopod handles authentication and authorization using `codeigniter/shield`
 coupled with custom rules. Roles and permissions are defined at two levels:
diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/pl/getting-started/install.md
+++ b/docs/src/pl/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md
index 760a0a6ae9..9f96b15031 100644
--- a/docs/src/pt-BR/getting-started/install.md
+++ b/docs/src/pt-BR/getting-started/install.md
@@ -11,10 +11,10 @@ com PHP-MySQL.
 
 ::: dica Nota
 
-We've released official Docker images for Castopod!
+Nós lançamos imagens Docker oficiais para Castopod!
 
-If you prefer using Docker, you may skip this and go straight to the
-[docker documentation](./docker.md) for Castopod.
+Se você prefere usar o Docker, você pode pular isso e ir direto para a
+[documentação docker](./docker.md) de Castopod.
 
 :::
 
@@ -23,10 +23,12 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 ou superior
 - MySQL versão 5.7 ou superior ou MariaDB versão 10.2 ou superior
 - Suporte a HTTPS
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 ou superior
 
-PHP version 8.1 or higher is required, with the following extensions installed:
+É necessário PHP versão 8.1 ou superior, com as seguintes extensões instaladas:
 
 - [intl](https://php.net/manual/en/intl.requirements.php)
 - [libcurl](https://php.net/manual/en/curl.requirements.php)
@@ -35,7 +37,8 @@ PHP version 8.1 or higher is required, with the following extensions installed:
   **PNG** e bibliotecas **WEBP**.
 - [exif](https://www.php.net/manual/en/exif.installation.php)
 
-Additionally, make sure that the following extensions are enabled in your PHP:
+Além disso, certifique-se de que as seguintes extensões estejam habilitadas em
+seu PHP:
 
 - json (habilitado por padrão - não desativar)
 - xml (habilitado por padrão - não desativar)
@@ -45,17 +48,17 @@ Additionally, make sure that the following extensions are enabled in your PHP:
 
 > Recomendamos usar o [MariaDB](https://mariadb.org).
 
-::: warning Warning
+::: warning Aviso
 
-Castopod only works with supported MySQL 5.7 or higher compatible databases. It
+Castopod só funciona com bancos de dados MySQL 5.7 ou superior compatíveis. It
 will break with the previous MySQL v5.6 for example as its end of life was on
 February 5, 2021.
 
 :::
 
-You will need the server hostname, database name, username and password to
-complete the installation process. If you do not have these, please contact your
-server administrator.
+Você vai precisar do hostname do servidor, nome do banco de dados, nome do
+usuário e senha para concluir o processo de instalação. Se você não os tem,
+entre em contato com o administrador do servidor.
 
 #### Privilégios
 
@@ -66,7 +69,7 @@ User must have at least these privileges on the database for Castopod to work:
 ### (Opcional) FFmpeg v4.1.8 ou superior para Clipes de Vídeo
 
 [FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you
-want to generate Video Clips. The following extensions must be installed:
+want to generate Video Clips. As seguintes extensões devem ser instaladas:
 
 - Biblioteca **FreeType 2** para
   [gd](https://www.php.net/manual/en/image.installation.php).
@@ -125,10 +128,10 @@ want to generate Video Clips. The following extensions must be installed:
 2. Siga as instruções na sua tela.
 3. Comece o podcast!
 
-::: info Note
+::: Nota de Informação
 
-The install script writes a `.env` file in the package root. If you cannot go
-through the install wizard, you can create and edit the `.env` file manually
+O script de instalação grava um arquivo `.env` na raiz do pacote. If you cannot
+go through the install wizard, you can create and edit the `.env` file manually
 based on the `.env.example` file.
 
 :::
@@ -152,11 +155,11 @@ email.SMTPUser="your_smtp_user"
 email.SMTPPass="your_smtp_password"
 ```
 
-#### Email config options
+#### Configurar opções de e-mail
 
-| Variable name    | Type                 | Default      |
+| Nome da variável | Tipo                 | Padrão       |
 | ---------------- | -------------------- | ------------ |
-| **`fromEmail`**  | string               | `undefined`  |
+| **`fromEmail`**  | string               | `indefinido` |
 | **`fromName`**   | string               | `"Castopod"` |
 | **`SMTPHost`**   | string               | `undefined`  |
 | **`SMTPUser`**   | string               | `undefined`  |
@@ -164,6 +167,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Pacotes comunitários
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md
index 3c99e225ce..d85df8c090 100644
--- a/docs/src/pt/getting-started/install.md
+++ b/docs/src/pt/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -162,6 +164,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/ro/getting-started/install.md b/docs/src/ro/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/ro/getting-started/install.md
+++ b/docs/src/ro/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md
index 3c99e225ce..d85df8c090 100644
--- a/docs/src/ru/getting-started/install.md
+++ b/docs/src/ru/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -162,6 +164,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/sk/getting-started/install.md
+++ b/docs/src/sk/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/sr_Latn/getting-started/install.md b/docs/src/sr_Latn/getting-started/install.md
index c68be846b2..41b5153c8d 100644
--- a/docs/src/sr_Latn/getting-started/install.md
+++ b/docs/src/sr_Latn/getting-started/install.md
@@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
 - PHP v8.1 or higher
 - MySQL version 5.7 or higher or MariaDB version 10.2 or higher
 - HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Community packages
 
 If you don't want to bother with installing Castopod manually, you may use one
diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md
index 703b01bbb6..d326defd0f 100644
--- a/docs/src/sv/getting-started/install.md
+++ b/docs/src/sv/getting-started/install.md
@@ -23,6 +23,8 @@ Om du föredrar att använda Docker, kan du hoppa över detta och gå direkt til
 - PHP v8.1 or higher
 - MySQL version 5.7 eller högre eller MariaDB version 10.2 eller högre
 - Stöd för HTTPS
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP v8.1 or higher
 
@@ -161,16 +163,45 @@ email.SMTPPass="your_smtp_password"
 | **`SMTPPort`**   | nummer                  | `25`          |
 | **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"`       |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## Gemenskapspaket
 
-Om du inte vill bry dig om att installera Castopod manuellt, kan du använda ett
-av de paket som skapats och underhålls av open source-miljön.
+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.
 
-### Installera med YunoHost
+### Install with YunoHost
 
-[YunoHost](https://yunohost.org/) är en distribution baserad på Debian GNU/Linux
-som består av mjukvarupaket med fri och öppen källkod. Det hanterar
-svårigheterna med self-hosting för dig.
+[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/uk/getting-started/auth.md b/docs/src/uk/getting-started/auth.md
new file mode 100644
index 0000000000..0c330f062d
--- /dev/null
+++ b/docs/src/uk/getting-started/auth.md
@@ -0,0 +1,87 @@
+---
+title: Authentication & Authorization
+sidebarDepth: 3
+---
+
+# Аутентифікація & Авторизація
+
+Castopod handles authentication and authorization using `codeigniter/shield`
+coupled with custom rules. Roles and permissions are defined at two levels:
+
+1. [instance wide](#1-instance-wide-roles-and-permissions)
+2. [per podcast](#2-per-podcast-roles-and-permissions)
+
+## 1. Instance wide roles and permissions
+
+### Instance roles
+
+<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
+
+| role        | description                         | permissions                                                                                |
+| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
+| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
+| Manager     | Manages Castopod's content.         | podcasts.create, podcasts.import, persons.manage, pages.manage                             |
+| Podcaster   | General users of Castopod.          | admin.access                                                                               |
+
+<!-- AUTH-INSTANCE-ROLES-LIST:END -->
+
+### Instance permissions
+
+<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
+
+| permission              | description                                                        |
+| ----------------------- | ------------------------------------------------------------------ |
+| admin.access            | Can access the Castopod admin area.                                |
+| admin.settings          | Can access the Castopod settings.                                  |
+| users.manage            | Can manage Castopod users.                                         |
+| persons.manage          | Can manage persons.                                                |
+| pages.manage            | Can manage pages.                                                  |
+| podcasts.view           | Can view all podcasts.                                             |
+| podcasts.create         | Can create new podcasts.                                           |
+| podcasts.import         | Can import podcasts.                                               |
+| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
+
+<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
+
+## 2. Per podcast roles and permissions
+
+### Per podcast roles
+
+<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
+
+| role   | description                                               | permissions                                                                                                                                                                                                                                                                                 |
+| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Admin  | Has complete control of podcast #{id}.                    | \*                                                                                                                                                                                                                                                                                          |
+| Editor | Manages content and publications of podcast #{id}.        | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
+| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips                                                                                                                                                                         |
+| Guest  | General contributor of the podcast #{id}.                 | view, episodes.view                                                                                                                                                                                                                                                                         |
+
+<!-- AUTH-PODCAST-ROLES-LIST:END -->
+
+### Per podcast permissions
+
+<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
+
+| permission                   | description                                                              |
+| ---------------------------- | ------------------------------------------------------------------------ |
+| view                         | Can view dashboard and analytics of podcast #{id}.                       |
+| edit                         | Can edit podcast #{id}.                                                  |
+| delete                       | Can delete podcast #{id}.                                                |
+| manage-import                | Can synchronize imported podcast #{id}.                                  |
+| manage-persons               | Can manage subscriptions of podcast #{id}.                               |
+| manage-subscriptions         | Can manage subscriptions of podcast #{id}.                               |
+| manage-contributors          | Can manage contributors of podcast #{id}.                                |
+| manage-platforms             | Can set/remove platform links of podcast #{id}.                          |
+| manage-publications          | Can publish podcast #{id}.                                               |
+| manage-notifications         | Can view and mark notifications as read for podcast #{id}.               |
+| interact-as                  | Can interact as the podcast #{id} to favourite, share or reply to posts. |
+| episodes.view                | Can view dashboard and analytics of podcast #{id}.                       |
+| episodes.create              | Can create episodes for podcast #{id}.                                   |
+| episodes.edit                | Can edit podcast #{id}.                                                  |
+| episodes.delete              | Can delete podcast #{id}.                                                |
+| episodes.manage-persons      | Can manage subscriptions of podcast #{id}.                               |
+| episodes.manage-clips        | Can manage video clips or soundbites of podcast #{id}.                   |
+| episodes.manage-publications | Can publish podcast #{id}.                                               |
+| episodes.manage-comments     | Can create/remove episode comments of podcast #{id}.                     |
+
+<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
diff --git a/docs/src/uk/getting-started/docker.md b/docs/src/uk/getting-started/docker.md
new file mode 100644
index 0000000000..c6e6cb7e65
--- /dev/null
+++ b/docs/src/uk/getting-started/docker.md
@@ -0,0 +1,177 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 3 Docker images to the Docker Hub during its automated build
+process:
+
+- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
+  with all of Castopod dependencies
+- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
+  Nginx configuration for Castopod
+- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
+  an optional image building videoclips thanks to ffmpeg
+
+Additionally, Castopod requires a MySQL-compatible database. A Redis database
+can be added as a cache handler.
+
+## Supported tags
+
+- `develop` [unstable], latest development branch build
+- `beta` [stable], latest beta version build
+- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
+- `latest` [stable], latest version build
+- `1.x.x` [stable], specific version build (since `1.0.0`)
+
+## Example usage
+
+1.  Install [docker](https://docs.docker.com/get-docker/) and
+    [docker-compose](https://docs.docker.com/compose/install/)
+2.  Create a `docker-compose.yml` file with the following:
+
+    ```yml
+    version: "3.7"
+
+    services:
+      app:
+        image: castopod/app:latest
+        container_name: "castopod-app"
+        volumes:
+          - castopod-media:/opt/castopod/public/media
+        environment:
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+          CP_BASEURL: "http://castopod.example.com"
+          CP_ANALYTICS_SALT: changeme
+          CP_CACHE_HANDLER: redis
+          CP_REDIS_HOST: redis
+        networks:
+          - castopod-app
+          - castopod-db
+        restart: unless-stopped
+
+      web-server:
+        image: castopod/web-server:latest
+        container_name: "castopod-web-server"
+        volumes:
+          - castopod-media:/var/www/html/media
+        networks:
+          - castopod-app
+        ports:
+          - 8080:80
+        restart: unless-stopped
+
+      mariadb:
+        image: mariadb:10.5
+        container_name: "castopod-mariadb"
+        networks:
+          - castopod-db
+        volumes:
+          - castopod-db:/var/lib/mysql
+        environment:
+          MYSQL_ROOT_PASSWORD: changeme
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+        restart: unless-stopped
+
+      redis:
+        image: redis:7.0-alpine
+        container_name: "castopod-redis"
+        volumes:
+          - castopod-cache:/data
+        networks:
+          - castopod-app
+
+      # this container is optional
+      # add this if you want to use the videoclips feature
+      video-clipper:
+        image: castopod/video-clipper:latest
+        container_name: "castopod-video-clipper"
+        volumes:
+          - castopod-media:/opt/castopod/public/media
+        environment:
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: changeme
+        networks:
+          - castopod-db
+        restart: unless-stopped
+
+    volumes:
+      castopod-media:
+      castopod-db:
+      castopod-cache:
+
+    networks:
+      castopod-app:
+      castopod-db:
+    ```
+
+    You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
+    `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
+
+3.  Setup a reverse proxy for TLS (SSL/HTTPS)
+
+    TLS is mandatory for ActivityPub to work. This job can easily be handled by
+    a reverse proxy, for example with [Caddy](https://caddyserver.com/):
+
+    ```
+    #castopod
+    castopod.example.com {
+        reverse_proxy localhost:8080
+    }
+    ```
+
+4.  Run `docker-compose up -d`, wait for it to initialize and head on to
+    `https://castopod.example.com/cp-install` to finish setting up Castopod!
+
+5.  You're all set, start podcasting! 🎙️🚀
+
+## Environment Variables
+
+- **castopod/video-clipper**
+
+  | Variable name              | Type (`default`) | Default          |
+  | -------------------------- | ---------------- | ---------------- |
+  | **`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_"`          |
+
+- **castopod/app**
+
+  | 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"` |
diff --git a/docs/src/uk/getting-started/install.md b/docs/src/uk/getting-started/install.md
new file mode 100644
index 0000000000..41b5153c8d
--- /dev/null
+++ b/docs/src/uk/getting-started/install.md
@@ -0,0 +1,216 @@
+---
+title: Installation
+sidebarDepth: 3
+---
+
+# How to install Castopod?
+
+Castopod was thought-out to be easy to install. Whether using dedicated or
+shared hosting, you can install it on most PHP-MySQL compatible web servers.
+
+::: tip Note
+
+We've released official Docker images for Castopod!
+
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
+
+:::
+
+## Requirements
+
+- PHP v8.1 or higher
+- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
+- HTTPS support
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
+
+### PHP v8.1 or higher
+
+PHP version 8.1 or higher is required, with the following extensions installed:
+
+- [intl](https://php.net/manual/en/intl.requirements.php)
+- [libcurl](https://php.net/manual/en/curl.requirements.php)
+- [mbstring](https://php.net/manual/en/mbstring.installation.php)
+- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**,
+  **PNG** and **WEBP** libraries.
+- [exif](https://www.php.net/manual/en/exif.installation.php)
+
+Additionally, make sure that the following extensions are enabled in your PHP:
+
+- json (enabled by default - don't turn it off)
+- xml (enabled by default - don't turn it off)
+- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
+
+### MySQL compatible database
+
+> We recommend using [MariaDB](https://mariadb.org).
+
+::: warning Warning
+
+Castopod only works with supported MySQL 5.7 or higher compatible databases. It
+will break with the previous MySQL v5.6 for example as its end of life was on
+February 5, 2021.
+
+:::
+
+You will need the server hostname, database name, username and password to
+complete the installation process. If you do not have these, please contact your
+server administrator.
+
+#### Privileges
+
+User must have at least these privileges on the database for Castopod to work:
+`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`,
+`REFERENCES`, `CREATE VIEW`.
+
+### (Optional) FFmpeg v4.1.8 or higher for Video Clips
+
+[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you
+want to generate Video Clips. The following extensions must be installed:
+
+- **FreeType 2** library for
+  [gd](https://www.php.net/manual/en/image.installation.php).
+
+### (Optional) Other recommendations
+
+- Redis for better cache performances.
+- CDN for static files caching and better performances.
+- e-mail gateway for lost passwords.
+
+## Install instructions
+
+### Pre-requisites
+
+0. Get a Web Server with [requirements](#requirements) installed
+1. Create a MySQL database for Castopod with a user having access and
+   modification privileges (for more info, see
+   [MySQL compatible database](#mysql-compatible-database)).
+2. Activate HTTPS on your domain with an _SSL certificate_.
+3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto
+   the web server if you haven’t already.
+   - ⚠️ Set the web server document root to the `public/` sub-folder within the
+     `castopod` folder.
+4. Add **cron tasks** on your web server for various background processes
+   (replace the paths accordingly):
+
+   - For social features to work properly, this task is used to broadcast social
+     activities to your followers on the fediverse:
+
+   ```bash
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities
+   ```
+
+   - For having your episodes be broadcasted on open hubs upon publication using
+     [WebSub](https://en.wikipedia.org/wiki/WebSub):
+
+   ```bash
+      * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish
+   ```
+
+   - For Video Clips to be created (see
+     [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)):
+
+   ```bash
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
+   ```
+
+   > These tasks run **every minute**. You may set the frequency depending on
+   > your needs: every 5, 10 minutes or more.
+
+### (recommended) Install Wizard
+
+1. Run the Castopod install script by going to the install wizard page
+   (`https://your_domain_name.com/cp-install`) in your favorite web browser.
+2. Follow the instructions on your screen.
+3. Start podcasting!
+
+::: 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 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"`      |
+
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
+## Community packages
+
+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.
+
+### 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
+self-hosting for you.
+
+<div class="flex flex-wrap items-center gap-4">
+
+<a href="https://install-app.yunohost.org/?app=castopod" target="_blank" rel="noopener noreferrer">
+   <img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Install Castopod with YunoHost" class="align-middle" />
+</a>
+
+<a href="https://github.com/YunoHost-Apps/castopod_ynh" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"><svg
+   xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em"
+   class="text-xl"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z"/></svg>Github
+Repo</a>
+
+</div>
diff --git a/docs/src/uk/getting-started/security.md b/docs/src/uk/getting-started/security.md
new file mode 100644
index 0000000000..e205698df8
--- /dev/null
+++ b/docs/src/uk/getting-started/security.md
@@ -0,0 +1,26 @@
+---
+title: Security
+---
+
+# Security concerns
+
+Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
+framework that encourages
+[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
+
+To maximize your instance's safety and prevent any malicious attack, we
+recommend you update all your Castopod files permissions after installation or
+updates (to avoid any prior permission error):
+
+- `writable/` folder must be **readable** and **writable**.
+- `public/media/` folder must be **readable** and **writable**.
+- any other file must be set to **readonly**.
+
+For instance, if you are using Apache or NGINX with Ubuntu you may do the
+following:
+
+```bash
+sudo chown -R root:root /path/to/castopod
+sudo chown -R www-data:www-data /path/to/castopod/writable
+sudo chown -R www-data:www-data /path/to/castopod/public/media
+```
diff --git a/docs/src/uk/getting-started/update.md b/docs/src/uk/getting-started/update.md
new file mode 100644
index 0000000000..98e019fbc7
--- /dev/null
+++ b/docs/src/uk/getting-started/update.md
@@ -0,0 +1,109 @@
+---
+title: Update
+sidebarDepth: 3
+---
+
+# How to update Castopod?
+
+After installing Castopod, you may want to update your instance to the latest
+version in order to enjoy the latest features ✨, bug fixes 🐛 and performance
+improvements ⚡.
+
+## Update instructions
+
+0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
+   database.
+
+   - cf.
+     [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
+
+1. Go to the
+   [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
+   see if your instance is up to date with the latest Castopod version
+
+   - cf.
+     [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
+
+2. Download the latest release package named `Castopod Package`, you may choose
+   between the `zip` or `tar.gz` archives
+
+   - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
+   - Note that you can also download the latest package from
+     [castopod.org](https://castopod.org/)
+
+3. On your server:
+
+   - Remove all files except `.env` and `public/media`
+   - Copy the new files from the downloaded package into your server
+
+     ::: info Note
+
+     You may need to reset files permissions as during the install process.
+     Check [Security Concerns](./security.md).
+
+     :::
+
+4. Update your database schema from your `Castopod Admin` > `About` page or by
+   running:
+
+   ```bash
+   php spark castopod:database-update
+   ```
+
+5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
+   `Housekeeping`
+6. ✨ Enjoy your fresh instance, you're all done!
+
+::: info Note
+
+Releases may come with additional update instructions (see
+[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
+
+- cf.
+  [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
+
+:::
+
+## Fully Automated updates
+
+> Coming soon... 👀
+
+## Frequently asked questions (FAQ)
+
+### Where can I find my Castopod version?
+
+Go to your Castopod admin panel, the version is displayed on the bottom left
+corner.
+
+Alternatively, you can find the version in the `app > Config > Constants.php`
+file.
+
+### I haven't updated my instance in a long time… What should I do?
+
+No problem! Just get the latest release as described above. Only, when going
+through the release instructions (4), perform them sequentially, from the oldest
+to the newest.
+
+> You may want to backup your instance depending on how long you haven't updated
+> Castopod.
+
+For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
+`v1.0.0-beta.1`:
+
+0. (highly recommended) Make a backup of your files and database.
+
+1. Download the latest release, overwrite your files whilst keeping `.env` and
+   `public/media`.
+
+2. Go through each release update instructions sequentially (from oldest to
+   newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`,
+   `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`.
+
+3. ✨ Enjoy your fresh instance, you're all done!
+
+### Should I make a backup before updating?
+
+We advise you do, so you don't lose everything if anything goes wrong!
+
+More generally, we advise you make regular backups of your Castopod files and
+database to prevent you from losing it all…
diff --git a/docs/src/uk/index.md b/docs/src/uk/index.md
new file mode 100644
index 0000000000..6e04835b64
--- /dev/null
+++ b/docs/src/uk/index.md
@@ -0,0 +1,303 @@
+---
+sidebarDepth: 2
+---
+
+# Welcome 👋
+
+[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&nbsp;[![discord-badge]][discord]&nbsp;[![stars-badge]][stars]
+
+Castopod is a free & open-source hosting platform made for podcasters who want
+engage and interact with their audience.
+
+Castopod is easy to install and was built on top of
+[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very
+small footprint.
+
+::: info Status
+
+Castopod is currently in **beta** but already quite stable and used by
+podcasters around&nbsp;the&nbsp;world!
+
+:::
+
+<div class="flex items-center">
+  <a href="/getting-started/install" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-full shadow gap-x-1 bg-pine-500 hover:no-underline hover:bg-pine-600">Install<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
+</div>
+
+## Features
+
+- 🌱 &nbsp;Free & open-source (AGPL v3 License)
+- 🔐 &nbsp;Focused on data sovereignty: your content, audience, and analytics
+  belong to you, and&nbsp;you&nbsp;only
+- 🪄 &nbsp;Podcasting 2.0 features: GUID, locked, transcripts, funding,
+  chapters, location, persons, soundbites, …
+- 💬 &nbsp;Built-in social network:
+  - 🚀 &nbsp;Castopod is part of the Fediverse, a decentralized social network
+  - ❤️ &nbsp;Create posts, share, favourite, and comment on episodes
+- 📈 &nbsp;Built-in analytics:
+  - ⚖️ &nbsp;GDPR / CCPA / LGPD compliant
+  - 🪙 &nbsp;Standard IABv2 audience measurement
+  - 🏡 &nbsp;On-premises analytics, no third party involved
+- 📢 &nbsp;Built-in marketing tools:
+  - ✅ &nbsp;SEO ready (open-graph meta-tags, JSON-LD, …)
+  - 📱 &nbsp;PWA: install as a standalone app
+  - 🎨 &nbsp;Customizable theme colors
+  - 🎬 &nbsp;Generate ready-to-share Video clips from episodes
+  - 🔉 &nbsp;Generate soundbites
+  - ▶️ &nbsp;Embeddable player, embed your episodes on any website
+- 💸 &nbsp;Monetization:
+  - 🔗 &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, …
+  - ⚡ &nbsp;Broadcast your episodes instantly with WebSub
+- 📥 &nbsp;Podcast import: move your existing podcast into Castopod
+- 📤 &nbsp;Move your podcast out of Castopod
+- 🔀 &nbsp;Multi-tenant: host as many podcasts as you want
+- 👥 &nbsp;Multi-user: add contributors and set roles
+- 🌎 &nbsp;i18n support: translated in English, French, Polish, German,
+  Brazilian Portuguese & Spanish… with
+  [more to come](https://translate.castopod.org)!
+
+## Motivation
+
+The podcasting ecosystem is decentralized by nature: you can create your podcast
+as an RSS file, publish it on the web and have it shared everywhere online.
+
+It is in fact one of the only media to have stayed this way for a long time.
+
+As usages are evolving, more and more people are getting into podcasts: whether
+it is creators finding new ways to share their ideas, or listeners in the search
+for better content.
+
+With podcasting becoming more widely used, some companies are trying to shift it
+towards a more controlled and centralized medium.
+
+Castopod was created in an effort to provide an open and sustainable alternative
+to hosting your podcasts, promoting decentralization to ensure that podcasters
+creativity can express itself.
+
+This project is pushed by the open-source community, and specifically by the
+[Fediverse](https://fediverse.party/en/fediverse/) and
+[Podcasting 2.0](https://podcastindex.org/) movements.
+
+## Comparison with other solutions
+
+We believe that a solution is not necessarily right for everyone, it highly
+depends on your needs. So, here are comparisons with other tools to help you to
+gauge whether Castopod is the right fit for&nbsp;you.
+
+### Castopod vs Wordpress
+
+Castopod is often referred to as "the Wordpress for podcasts" because of the
+similarities between the two. In some ways this is true. And actually, Castopod
+was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption
+from the community and the number of websites running&nbsp;it.
+
+Just like Wordpress, Castopod is free & open source, built using PHP with a
+MySQL database and is packaged in a way that you can easily install on most web
+servers.
+
+Wordpress is a great way to create your website and extend it with plugins to
+get what you want. It is a full fledged CMS that helps you get any type of
+website online.
+
+On the other hand, Castopod is meant to address the podcasters needs
+specifically, focusing on podcasting, and nothing else. You don't need any
+plugin to get you started on your podcasting&nbsp;journey.
+
+This allows optimizing the processes specific to podcasting: ranging from the
+creation of your podcasts and the publication of new episodes all the way to
+broadcasting, marketing and analytics.
+
+Finally, depending on your needs, Wordpress and Castopod can even live side by
+side as they share the same requirements!
+
+### Castopod vs Funkwhale
+
+Funkwhale is a self-hosted, modern free and open-source music server. Just as
+Castopod, Funkwhale is on the fediverse, a decentralized social network allowing
+interoperability between the two.
+
+Funkwhale was initially built around music. And later on, as the project
+evolved, the ability to host podcasts was introduced.
+
+Unlike Funkwhale, Castopod has been designed and built around podcasting
+exclusively. This allows easier implementation for features related to the
+podcasting ecosystem, such as the podcasting 2.0 features (transcripts,
+chapters, locations, persons, …).
+
+So, you should probably use Funkwhale if you want to host your music, and use
+Castopod if you want to host your podcasts.
+
+### Castopod vs other podcast hosts
+
+There are many solutions for you to host your podcasts, some of which are really
+great and [a lot of them](https://podcastindex.org/apps) are jumping into the
+Podcasting 2.0 wagon just like Castopod!
+
+Each of these solutions differ from one another, you may compare with the
+[list of features](#features).
+
+That being said, there are two main differences with other podcasting solutions:
+
+- Castopod can be self-hosted and is the only solution that allows you to keep
+  full control over what you produce. Also, as it is open-source, you can even
+  customize it as you wish.
+
+- Castopod is the only solution that currently integrates both a decentralized
+  social network with ActivityPub as well as many of the podcasting 2.0
+  features, hoping to bridge the gap between the two.
+
+## Contributing
+
+Love Castopod and would like to help? Take a look at the following documentation
+to get you&nbsp;started.
+
+### Code of conduct
+
+Castopod has adopted a Code of Conduct that we expect project participants to
+adhere to. Please read the
+[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
+so that you can understand what actions will and will not be&nbsp;tolerated.
+
+### Contributing guide
+
+Read our [contributing guide](./contributing/guidelines.md) to learn about our
+development process, how to propose bugfixes and improvements, and how to build
+and test your changes to Castopod.
+
+## Contributors ✨
+
+Thanks goes to these wonderful people
+([emoji key](https://allcontributors.org/docs/en/emoji-key)):
+
+<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
+<!-- prettier-ignore-start -->
+<!-- markdownlint-disable -->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑‍🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    </tr>
+  </tbody>
+</table>
+
+<!-- markdownlint-restore -->
+<!-- prettier-ignore-end -->
+
+<!-- ALL-CONTRIBUTORS-LIST:END -->
+
+This project follows the
+[all-contributors](https://github.com/all-contributors/all-contributors)
+specification. Contributions of any kind welcome!
+
+## Contact
+
+You may reach us for help or ask any question you have on:
+
+- [Discord](https://castopod.org/discord) (for direct interaction with
+  developers and the community)
+- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for
+  feature requests & bug reports)
+
+Alternatively, you can follow us on social media platforms to get news about
+Castopod:
+
+- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
+- [Twitter](https://twitter.com/castopod)
+- [LinkedIn](https://linkedin.com/company/castopod)
+- [Facebook](https://www.facebook.com/castopod)
+
+## Sponsors
+
+The ongoing development of Castopod is made possible with the support of its
+backers. If you'd like to help, please consider
+[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
+
+<div class="flex flex-wrap gap-x-16 gap-y-8">
+  <a href="https://adaures.com/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/adaures.svg" alt="Ad Aures Logo" class="h-16" /></a>
+  <a href="https://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="NLnet Logo" class="h-16" /></a>
+</div>
+
+## License
+
+[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
+
+Copyright © 2020-present, [Ad Aures](https://adaures.com/).
+https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
+https://img.shields.io/github/license/ad-aures/castopod?color=blue
+https://img.shields.io/badge/contributions-welcome-brightgreen.svg
+https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
+https://img.shields.io/github/stars/ad-aures/castopod?style=social
+
+[release]: https://code.castopod.org/adaures/castopod/-/releases
+[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md
+[contributions]: https://code.castopod.org/adaures/castopod/-/issues
+[semantic-release]: https://github.com/semantic-release/semantic-release
+[discord]: https://castopod.org/discord
+[stars]: https://github.com/ad-aures/castopod/stargazers
+[crowdin]: https://translate.castopod.org/project/castopod
diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md
index 57a4e6f7ef..8e445b7529 100644
--- a/docs/src/zh-Hans/getting-started/install.md
+++ b/docs/src/zh-Hans/getting-started/install.md
@@ -22,6 +22,8 @@ Castopod 的安装非常简单。 你能在大多数兼容的 PHP-MySQL 的服
 - PHP 8.1 或更高版本
 - MySQL 5.7 或更高版本与 MariaDB 10.2 或更高版本
 - HTTPS 支持
+- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
+  incoming requests
 
 ### PHP 8.1 或更高版本
 
@@ -152,14 +154,45 @@ email.SMTPPass="你的邮件密码"
 | **`SMTPPort`**   | number               | `25`         |
 | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"`      |
 
+### S3
+
+By default, files are stored in the `public/media` folder using the filesystem.
+
+If you prefer storing your media files on an S3 compatible storage, you may
+specify it in your `.env`:
+
+```ini
+# […]
+
+media.fileManager="s3"
+media.s3.endpoint="your_s3_host"
+media.s3.key="your_s3_key"
+media.s3.secret="your_s3_secret"
+media.s3.region="your_s3_region"
+```
+
+#### S3 config options
+
+| Variable name             | Type    | Default     |
+| ------------------------- | ------- | ----------- |
+| **`endpoint`**            | string  | `undefined` |
+| **`key`**                 | string  | `undefined` |
+| **`secret`**              | string  | `undefined` |
+| **`region`**              | string  | `undefined` |
+| **`bucket`**              | string  | `castopod`  |
+| **`protocol`**            | number  | `undefined` |
+| **`path_style_endpoint`** | boolean | `false`     |
+
 ## 社区套餐
 
-如果你不想手动安装 Castopod,可以使用一个 由开源社区创建和维护的软件包。
+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.
 
-### 使用 YunoHost 安装
+### Install with YunoHost
 
-[YunoHost](https://yunohost.org/) 是一个基于 Debian GNU/Linux 的发行版,由免费和
-开源软件包组成。 它可以为你解决自托管的困难。
+[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/modules/Admin/Language/ar/Charts.php b/modules/Admin/Language/ar/Charts.php
index 58bf118941..525085f0fa 100644
--- a/modules/Admin/Language/ar/Charts.php
+++ b/modules/Admin/Language/ar/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'التخزين الشهري (بالميغابايت)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/ar/Episode.php b/modules/Admin/Language/ar/Episode.php
index 088c135533..2c4319f80c 100644
--- a/modules/Admin/Language/ar/Episode.php
+++ b/modules/Admin/Language/ar/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'الحلقة',
         'visibility' => 'الظهور',
+        'downloads' => 'Downloads',
         'comments' => 'التعليقات',
         'actions' => 'الإجراءات',
     ],
diff --git a/modules/Admin/Language/br/Charts.php b/modules/Admin/Language/br/Charts.php
index 7de3c6acd6..e7b7b9f903 100644
--- a/modules/Admin/Language/br/Charts.php
+++ b/modules/Admin/Language/br/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Lec\'hed bann implijet bemdez (e MB)',
     'total_storage_by_month' => 'Kadaviñ bep miz (e MB)',
     'total_bandwidth_by_month' => 'Lec\'hed bann implijet bep miz (e MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php
index 8558fc6fb7..6c793ec9f2 100644
--- a/modules/Admin/Language/br/Episode.php
+++ b/modules/Admin/Language/br/Episode.php
@@ -57,6 +57,7 @@ return [
     }',
         'episode' => 'Rann',
         'visibility' => 'Gwelusted',
+        'downloads' => 'Downloads',
         'comments' => 'Evezhiadennoù',
         'actions' => 'Obererezhioù',
     ],
diff --git a/modules/Admin/Language/ca/AboutCastopod.php b/modules/Admin/Language/ca/AboutCastopod.php
index 3fb62afffe..c8598e130b 100644
--- a/modules/Admin/Language/ca/AboutCastopod.php
+++ b/modules/Admin/Language/ca/AboutCastopod.php
@@ -9,14 +9,14 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => 'About Castopod',
-    'host_name' => 'Host name',
-    'version' => 'Castopod version',
-    'php_version' => 'PHP version',
-    'os' => 'Operating System',
-    'languages' => 'Languages',
-    'update_database' => 'Update database',
+    'title' => 'Sobre Castopod',
+    'host_name' => 'Nom del servidor',
+    'version' => 'Versió de Castopod',
+    'php_version' => 'Versió de PHP',
+    'os' => 'Sistema operatiu',
+    'languages' => 'Idiomes',
+    'update_database' => 'Actualitza la base de dades',
     'messages' => [
-        'databaseUpdateSuccess' => 'Database is up to date!',
+        'databaseUpdateSuccess' => 'La base de dades està actualitzada!',
     ],
 ];
diff --git a/modules/Admin/Language/ca/Breadcrumb.php b/modules/Admin/Language/ca/Breadcrumb.php
index 1805622556..1861a680ea 100644
--- a/modules/Admin/Language/ca/Breadcrumb.php
+++ b/modules/Admin/Language/ca/Breadcrumb.php
@@ -14,25 +14,25 @@ return [
         ->gateway => 'Inici',
     'podcasts' => 'podcasts',
     'episodes' => 'episodis',
-    'subscriptions' => 'subscriptions',
+    'subscriptions' => 'subscripcions',
     'contributors' => 'col·laboradors',
     'pages' => 'pàgines',
     'settings' => 'preferències',
     'theme' => 'tema',
-    'about' => 'about',
+    'about' => 'quant a',
     'add' => 'afegir',
     'new' => 'nova',
     'edit' => 'editar',
     'persons' => 'persones',
     'publish' => 'publicar',
     'publish-edit' => 'editar la publicació',
-    'publish-date-edit' => 'edit publication date',
+    'publish-date-edit' => 'edita la data de publicació',
     'unpublish' => 'desfer la publicació',
     'delete' => 'eliminar',
-    'remove' => 'remove',
+    'remove' => 'suprimeix',
     'fediverse' => 'Fediverse',
-    'blocked-actors' => 'blocked actors',
-    'blocked-domains' => 'blocked domains',
+    'blocked-actors' => 'comptes bloquejats',
+    'blocked-domains' => 'dominis bloquejats',
     'users' => 'usuaris',
     'my-account' => 'el meu compte',
     'change-password' => 'canviar la contrasenya',
@@ -51,5 +51,5 @@ return [
     'video-clips' => 'vídeoclips',
     'embed' => 'reproductor incrustable',
     'notifications' => 'notificacions',
-    'suspend' => 'suspend',
+    'suspend' => 'suspèn',
 ];
diff --git a/modules/Admin/Language/ca/Charts.php b/modules/Admin/Language/ca/Charts.php
index 4873a6ee55..b10851173d 100644
--- a/modules/Admin/Language/ca/Charts.php
+++ b/modules/Admin/Language/ca/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Ample de banda emprat diàriament (en MB)',
     'total_storage_by_month' => 'Emmagatzematge mensual (en MB)',
     'total_bandwidth_by_month' => 'Ample de banda emprat mensualment (en MB)',
+    'total_bandwidth_by_month_limit' => 'Limitat a {totalBandwidth} al mes',
 ];
diff --git a/modules/Admin/Language/ca/Episode.php b/modules/Admin/Language/ca/Episode.php
index f8cde30391..c20eb8e8de 100644
--- a/modules/Admin/Language/ca/Episode.php
+++ b/modules/Admin/Language/ca/Episode.php
@@ -24,14 +24,14 @@ return [
     'edit' => 'Editar',
     'publish' => 'Publicar',
     'publish_edit' => 'Editar la publicació',
-    'publish_date_edit' => 'Edit publication date',
+    'publish_date_edit' => 'Edita la data de publicació',
     '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!',
+    'publish_date_edit_error' => 'L\'episodi encara no s\'ha publicat, no podeu editar-ne la data de publicació.',
+    'publish_date_edit_future_error' => 'La data de publicació de l\'episodi només es pot establir en una data passada! Si voleu reprogramar-lo, cancel·leu-lo primer.',
+    'publish_date_edit_success' => 'La data de publicació de l\'episodi ha estat actualitzada correctament!',
     'unpublish_error' => 'L\'episodi no està publicat.',
     'delete' => 'Eliminar',
     'go_to_page' => 'Anar a la pàgina ',
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episodi',
         'visibility' => 'Visibilitat',
+        'downloads' => 'Downloads',
         'comments' => 'Comentaris',
         'actions' => 'Accions',
     ],
@@ -113,8 +114,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',
+        'premium_title' => 'Prèmium',
+        'premium' => 'L\'episodi ha de ser accessible només per a subscriptors prèmium',
         'parental_advisory' => [
             'label' => 'Avís parental',
             'hint' => 'L\'episodi conté contingut explícit?',
@@ -183,9 +184,9 @@ return [
         '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',
+        'new_publication_date' => 'Nova data de publicació',
+        'new_publication_date_hint' => 'Has de posar una data passada.',
+        'submit' => 'Edita la data de publicació',
     ],
     'unpublish_form' => [
         'disclaimer' =>
diff --git a/modules/Admin/Language/ca/Notifications.php b/modules/Admin/Language/ca/Notifications.php
index bd1849f538..35032ab182 100644
--- a/modules/Admin/Language/ca/Notifications.php
+++ b/modules/Admin/Language/ca/Notifications.php
@@ -13,7 +13,7 @@ return [
     'reply' => '{actor_username} ha respost a la vostra publicació',
     'favourite' => '{actor_username} ha marcat com a preferit la vostra publicació',
     'reblog' => '{actor_username} ha compartit la vostra publicació',
-    'follow' => '{actor_username} started following you',
+    'follow' => '{actor_username} t\'ha començat a seguir',
     'no_notifications' => 'Cap notificació',
     'mark_all_as_read' => 'Marca tot com a llegit',
 ];
diff --git a/modules/Admin/Language/ca/Podcast.php b/modules/Admin/Language/ca/Podcast.php
index 7676d509b9..2e0adad780 100644
--- a/modules/Admin/Language/ca/Podcast.php
+++ b/modules/Admin/Language/ca/Podcast.php
@@ -107,13 +107,13 @@ 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.',
-        'op3' => 'Open Podcast Prefix Project (OP3)',
-        'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.',
-        'op3_enable' => 'Enable OP3 analytics service',
-        'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.',
+        'premium' => 'Prèmium',
+        'premium_by_default' => 'Els episodis s\'han d\'establir com a prèmium de manera predeterminada',
+        'premium_by_default_hint' => 'Els episodis de pòdcast es marcaran com a prèmium de manera predeterminada. Encara podreu escollir configurar alguns episodis, tràilers o bonificacions com a públics.',
+        'op3' => 'Projecte obert de prefix de pòdcast (OP3)',
+        'op3_hint' => 'Valoreu les vostres dades estadístiques amb OP3, un servei d\'anàlisi de tercers de codi obert i de confiança. Compartiu, valideu i compareu les vostres dades d\'anàlisi amb l\'ecosistema de podcasting obert.',
+        'op3_enable' => 'Habilita el servei d\'estadístiques OP3',
+        'op3_enable_hint' => 'Per motius de seguretat, les dades d\'anàlisi dels episodis prèmium no es compartiran amb OP3.',
         '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 e2e57dfbd1..b69962826c 100644
--- a/modules/Admin/Language/ca/PodcastNavigation.php
+++ b/modules/Admin/Language/ca/PodcastNavigation.php
@@ -25,9 +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',
+    'premium' => 'Prèmium',
+    'subscription-list' => 'Totes les subscripcions',
+    'subscription-add' => 'Afegiu una subscripció',
     'contributors' => 'Col·laboradors',
     'contributor-list' => 'Tots els col·laboradors',
     'contributor-add' => 'Afegir un col·laborador',
diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php
index 49841f3734..c5f02651f3 100644
--- a/modules/Admin/Language/de/Breadcrumb.php
+++ b/modules/Admin/Language/de/Breadcrumb.php
@@ -15,7 +15,7 @@ return [
     'podcasts' => 'Podcasts',
     'episodes' => 'Folgen',
     'subscriptions' => 'Abonnements',
-    'contributors' => 'Administratoren',
+    'contributors' => 'Mitwirkende',
     'pages' => 'Seiten',
     'settings' => 'Einstellungen',
     'theme' => 'Erscheinungsbild',
@@ -27,11 +27,11 @@ return [
     'publish' => 'veröffentlichen',
     'publish-edit' => 'Veröffentlichung bearbeiten',
     'publish-date-edit' => 'Veröffentlichungsdatum bearbeiten',
-    'unpublish' => 'Veröffentlichung aufheben',
+    'unpublish' => 'zurückziehen',
     'delete' => 'löschen',
     'remove' => 'Entfernen',
     'fediverse' => 'Fediversum',
-    'blocked-actors' => 'blockierte Akteure',
+    'blocked-actors' => 'blockierte Konten',
     'blocked-domains' => 'Blockierte Domains',
     'users' => 'Benutzer',
     'my-account' => 'Mein Konto',
@@ -40,10 +40,10 @@ return [
     'platforms' => 'Plattformen',
     'social' => 'soziale Netzwerke',
     'funding' => 'Finanzierung',
-    'analytics' => 'Analysen',
+    'analytics' => 'Statistiken',
     'locations' => 'Orte',
     'webpages' => 'Webseiten',
-    'unique-listeners' => 'einzigartige Zuhörer',
+    'unique-listeners' => 'eindeutige Zuhörer',
     'players' => 'Podcast-Player',
     'listening-time' => 'Hörzeit',
     'time-periods' => 'Zeiträume',
diff --git a/modules/Admin/Language/de/Charts.php b/modules/Admin/Language/de/Charts.php
index efbf2ee4d4..89cea21bf6 100644
--- a/modules/Admin/Language/de/Charts.php
+++ b/modules/Admin/Language/de/Charts.php
@@ -15,8 +15,8 @@ return [
     'by_device_weekly' => 'Downloads von Folgen nach Gerät (für die vergangene Woche)',
     'by_os_weekly' => 'Downloads von Folgen nach Betriebssystem (für die vergangene Woche)',
     'podcast_by_region' => 'Downloads von Folgen nach Region (für die vergangene Woche)',
-    'unique_daily_listeners' => 'Tägliche einzigartige Zuhörer',
-    'unique_monthly_listeners' => 'Monatliche einzigartige Zuhörer',
+    'unique_daily_listeners' => 'Tägliche eindeutige Zuhörer',
+    'unique_monthly_listeners' => 'Monatliche eindeutige Zuhörer',
     'by_browser' => 'Nutzung der Webseiten nach Browser (für die vergangene Woche)',
     'podcast_by_day' => 'Tägliche Downloads von Folgen',
     'podcast_by_month' => 'Monatliche Downloads von Folgen',
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Täglich genutzte Bandbreite (in MB)',
     'total_storage_by_month' => 'Monatlicher Speicher (in MB)',
     'total_bandwidth_by_month' => 'Monatlich genutzte Bandbreite (in MB)',
+    'total_bandwidth_by_month_limit' => 'Begrenzt auf {totalBandwidth} pro Monat',
 ];
diff --git a/modules/Admin/Language/de/Common.php b/modules/Admin/Language/de/Common.php
index edb576a44e..0cc5859914 100644
--- a/modules/Admin/Language/de/Common.php
+++ b/modules/Admin/Language/de/Common.php
@@ -21,7 +21,7 @@ return [
     'copied' => 'Kopiert!',
     'home' => 'Startseite',
     'explicit' => 'Anstößig',
-    'powered_by' => 'Betrieben durch {castopod}',
+    'powered_by' => 'Betrieben mit {castopod}',
     'actions' => 'Aktionen',
     'pageInfo' => 'Seite {currentPage} von {pageCount}',
     'go_back' => 'Zurück',
diff --git a/modules/Admin/Language/de/Dashboard.php b/modules/Admin/Language/de/Dashboard.php
index 4817024384..2b539a7185 100644
--- a/modules/Admin/Language/de/Dashboard.php
+++ b/modules/Admin/Language/de/Dashboard.php
@@ -17,7 +17,7 @@ return [
         'last_published' => 'Zuletzt veröffentlicht am {lastPublicationDate}',
     ],
     'episodes' => [
-        'title' => 'Episoden',
+        'title' => 'Folgen',
         'not_found' => 'Keine veröffentlichte Episode',
         'last_published' => 'Zuletzt veröffentlicht am {lastPublicationDate}',
     ],
diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php
index d98870abf1..7b286fb8ab 100644
--- a/modules/Admin/Language/de/Episode.php
+++ b/modules/Admin/Language/de/Episode.php
@@ -13,7 +13,7 @@ return [
     'season_abbr' => 'S{seasonNumber}',
     'number' => 'Folge {episodeNumber}',
     'number_abbr' => 'F. {episodeNumber}',
-    'season_episode' => 'Staffel {seasonNumber} episode {episodeNumber}',
+    'season_episode' => 'Staffel {seasonNumber} Folge {episodeNumber}',
     'season_episode_abbr' => 'S{seasonNumber}F{episodeNumber}',
     'number_of_comments' => '{numberOfComments, plural,
         one {# Kommentar}
@@ -54,8 +54,9 @@ return [
             other {# Folgen}
         }',
         'episode' => 'Folge',
-        'visibility' => 'Sichtweite',
-        'comments' => 'Komemntar',
+        'visibility' => 'Sichtbarkeit',
+        'downloads' => 'Downloads',
+        'comments' => 'Kommentar',
         'actions' => 'Aktionen',
     ],
     'messages' => [
@@ -67,7 +68,7 @@ return [
             with_podcast {Diese Folge wird zeitgleich mit dem Podcast veröffentlicht.}
             other {Diese Folge ist nicht veröffentlicht.}
         }',
-        'publishCancelSuccess' => 'Veröffentlichung der Episode erfolgreich abgebrochen!',
+        'publishCancelSuccess' => 'Veröffentlichung der Episode abgebrochen!',
         'unpublishBeforeDeleteTip' => 'Du musst die Episode zurückziehen, bevor du sie löschst.',
         'scheduleDateError' => 'Veröffentlichungsdatum muss gesetzt sein!',
         'deletePublishedEpisodeError' => 'Bitte ziehe die Episode zurück, bevor du sie löschst.',
diff --git a/modules/Admin/Language/de/Fediverse.php b/modules/Admin/Language/de/Fediverse.php
index 5a22c8dc6c..1c2a060df8 100644
--- a/modules/Admin/Language/de/Fediverse.php
+++ b/modules/Admin/Language/de/Fediverse.php
@@ -12,7 +12,7 @@ return [
     'messages' => [
         'actorNotFound' => 'Das Konto konnte nicht gefunden werden!',
         'blockActorSuccess' => '{actor} wurde blockiert!',
-        'unblockActorSuccess' => 'Darsteller wurde freigegeben!',
+        'unblockActorSuccess' => 'Benutzer wurde entsperrt!',
         'blockDomainSuccess' => '{domain} wurde blockiert!',
         'unblockDomainSuccess' => '{domain} wurde freigegeben!',
     ],
diff --git a/modules/Admin/Language/de/Install.php b/modules/Admin/Language/de/Install.php
index d901d1c53f..89a8b26767 100644
--- a/modules/Admin/Language/de/Install.php
+++ b/modules/Admin/Language/de/Install.php
@@ -20,10 +20,10 @@ return [
             'Um optional CDN und/oder einen externen Analysedienst verwenden zu können, müssen die Daten eingegeben werden.',
         'admin_gateway' => 'Admin-Gateway',
         'admin_gateway_hint' =>
-            'Die Route zum Zugriff auf den Admin-Bereich (z.B. https://example.com/cp-admin). Standardmäßig als cp-admin festgelegt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.',
+            'Der Pfad zum Zugriff auf den Admin-Bereich (z.B. https://example.com/cp-admin). Standardmäßig als cp-admin festgelegt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.',
         'auth_gateway' => 'Auth-Gateway',
         'auth_gateway_hint' =>
-            'Die Route zum Zugriff auf die Authentifizierungsseiten (z. B. https://example.com/cp-auth). Standardmäßig als cp-auth gesetzt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.',
+            'Der Pfad zum Zugriff auf die Authentifizierungsseiten (z. B. https://example.com/cp-auth). Standardmäßig als cp-auth gesetzt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.',
         'database_config' => 'Datenbankkonfiguration',
         'database_config_hint' =>
             'Castopod muss sich mit der MySQL-Datenbank (oder MariaDB) verbinden. Wenn diese erforderlichen Informationen nicht verfügbar sind, wenden Sie sich bitte an Ihren Serveradministrator.',
@@ -31,12 +31,12 @@ return [
         'db_name' => 'Datenbankname',
         'db_username' => 'Datenbankbenutzername',
         'db_password' => 'Datenbankpasswort',
-        'db_prefix' => 'Datenbankpräfix',
+        'db_prefix' => 'Tabellenpräfix',
         'db_prefix_hint' =>
-            "Das Präfix der Castopod-Tabellennamen. Nicht anpassen, wenn nicht gewiss, was damit gemeint ist.",
+            "Das Präfix der Castopod-Tabellennamen. Nicht anpassen, wenn du nicht weißt, was damit gemeint ist.",
         'cache_config' => 'Cachekonfiguration',
         'cache_config_hint' =>
-            'Wählen Sie Ihren bevorzugten Cache-Handler. Standardwert verwenden, wenn nicht gewiss, was damit gemeint ist.',
+            'Wählen Sie Ihren bevorzugten Cache-Handler. Standardwert verwenden, wenn Sie nicht wissen, was damit gemeint ist.',
         'cache_handler' => 'Cache-Handler',
         'cacheHandlerOptions' => [
             'file' => 'Datei',
diff --git a/modules/Admin/Language/de/Page.php b/modules/Admin/Language/de/Page.php
index e5e5febbbf..801ff2e75b 100644
--- a/modules/Admin/Language/de/Page.php
+++ b/modules/Admin/Language/de/Page.php
@@ -18,7 +18,7 @@ return [
     'delete' => 'Seite löschen',
     'form' => [
         'title' => 'Titel',
-        'permalink' => 'Permanenter Link',
+        'permalink' => 'Permalink',
         'content' => 'Inhalt',
         'submit_create' => 'Seite erstellen',
         'submit_edit' => 'Speichern',
diff --git a/modules/Admin/Language/de/Pager.php b/modules/Admin/Language/de/Pager.php
index d2bddfb67a..54c96cbe84 100644
--- a/modules/Admin/Language/de/Pager.php
+++ b/modules/Admin/Language/de/Pager.php
@@ -10,10 +10,10 @@ declare(strict_types=1);
 
 return [
     'pageNavigation' => 'Seiten-Navigation',
-    'first' => 'Erste',
-    'previous' => 'Zurück',
-    'next' => 'Weiter',
-    'last' => 'Letzte',
+    'first' => 'Erste Seite',
+    'previous' => 'Vorherige',
+    'next' => 'Nächste',
+    'last' => 'Letzte Seite',
     'older' => 'Älter',
     'newer' => 'Neuer',
     'invalidTemplate' => '{0} ist kein gültiges Pager Template.',
diff --git a/modules/Admin/Language/de/Person.php b/modules/Admin/Language/de/Person.php
index d0c8de9c35..a9287867dd 100644
--- a/modules/Admin/Language/de/Person.php
+++ b/modules/Admin/Language/de/Person.php
@@ -44,7 +44,7 @@ return [
             'Es können eine oder mehrere Personen mit der gleichen Rolle ausgewählt werden. Die Personen müssen zuerst erstellt werden.',
         'roles' => 'Rollen',
         'roles_hint' =>
-            'Es können sowhol keine, eine als auch mehrere Rollen für eine Person ausgewählt werden.',
+            'Es können sowohl keine, eine als auch mehrere Rollen für eine Person ausgewählt werden.',
         'submit_add' => 'Person:en hinzufügen',
         'remove' => 'Entfernen',
     ],
@@ -57,9 +57,9 @@ return [
             'Es können eine oder mehrere Personen mit der gleichen Rolle ausgewählt werden. Die Personen müssen zuerst erstellt werden.',
         'roles' => 'Rollen',
         'roles_hint' =>
-            'Es können sowhol keine, eine als auch mehrere Rollen für eine Person ausgewählt werden.',
+            'Es können sowohl keine, eine als auch mehrere Rollen für eine Person ausgewählt werden.',
         'submit_add' => 'Person:en hinzufügen',
         'remove' => 'Entfernen',
     ],
-    'credits' => 'Danksagungen',
+    'credits' => 'Credits',
 ];
diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php
index 6cbd82ed9c..62b5e33018 100644
--- a/modules/Admin/Language/de/Podcast.php
+++ b/modules/Admin/Language/de/Podcast.php
@@ -20,7 +20,7 @@ return [
     'publish_edit' => 'Veröffentlichung bearbeiten',
     'delete' => 'Podcast löschen',
     'see_episodes' => 'Episoden ansehen',
-    'see_contributors' => 'Administratoren anzeigen',
+    'see_contributors' => 'Mitwirkende anzeigen',
     'go_to_page' => 'Gehe zur Seite',
     'latest_episodes' => 'Neueste Folgen',
     'see_all_episodes' => 'Alle Folgen anzeigen',
@@ -65,7 +65,7 @@ return [
         'title' => 'Titel',
         'handle' => 'Identifikator',
         'handle_hint' =>
-            'Verwendet um den Podcast zu identifizieren. Großbuchstaben, Kleinbuchstaben, Zahlen und Unterstriche sind erlaubt.',
+            'Wird genutzt, um den Podcast zu identifizieren. Großbuchstaben, Kleinbuchstaben, Zahlen und Unterstriche sind erlaubt.',
         'type' => [
             'label' => 'Typ',
             'episodic' => 'Episodisch',
@@ -85,7 +85,7 @@ return [
             'label' => 'Hinweis an Eltern',
             'hint' => 'Enthält die Folge anstößige Inhalte?',
             'undefined' => 'nicht definiert',
-            'clean' => 'Zurücksetzen',
+            'clean' => 'Sauber',
             'explicit' => 'Anstößig',
         ],
         'author_section_title' => 'Autor',
@@ -101,12 +101,12 @@ return [
             'Die Gruppe, die für die Erstellung des Podcasts verantwortlich ist. Oft bezogen auf die Muttergesellschaft oder das Netzwerk eines Podcasts. Dieses Feld wird manchmal als \'Autor\' bezeichnet.',
         'copyright' => 'Urheberrecht',
         'location_section_title' => 'Standort',
-        'location_section_subtitle' => 'Über welchen Ort handelt dieser Podcast?',
+        'location_section_subtitle' => 'Um welchen Ort geht es in diesem Podcast?',
         'location_name' => 'Standortname oder Adresse',
-        'location_name_hint' => 'Dies kann ein echter Ort oder fiktiv sein',
+        'location_name_hint' => 'Dies kann ein echter oder ein fiktiver Ort sein',
         'monetization_section_title' => 'Monetarisierung',
         'monetization_section_subtitle' =>
-            'Geld dank der Zuhöhrer verdienen.',
+            'Geld dank der Zuhörer verdienen.',
         'premium' => 'Premium',
         'premium_by_default' => 'Episoden müssen standardmäßig als Premium festgelegt werden',
         'premium_by_default_hint' => 'Podcast-Episoden werden standardmäßig als Premium markiert. Sie können dennoch einzelne Episoden, Trailer oder Boni als öffentlich festlegen.',
@@ -119,7 +119,7 @@ return [
             'Hier erhalten Sie dank Monetarisierung Geld',
         'advanced_section_title' => 'Erweiterte Einstellungen',
         'advanced_section_subtitle' =>
-            'Wenn RSS-Tags benötigt werden, die Castopod nicht verwendet, können diese hier gesetz werden.',
+            'Wenn RSS-Tags benötigt werden, die Castopod nicht verwendet, können diese hier gesetzt werden.',
         'custom_rss' => 'Eigene RSS-Tags für den Podcast',
         'custom_rss_hint' => 'Dies wird innerhalb des ❬channel❭ Tags eingefügt.',
         'new_feed_url' => 'Neue Feed-URL',
@@ -133,11 +133,11 @@ return [
         'partner_image_url' => 'Bildadresse',
         'partner_id_hint' => 'Ihre eigene Partner-ID',
         'partner_link_url_hint' => 'Die generische Partnerlink-Adresse',
-        'partner_image_url_hint' => 'Die generische Partnerbild-adresse',
+        'partner_image_url_hint' => 'Die generische Partnerbild-Adresse',
         'status_section_title' => 'Status',
         'block' => 'Podcast soll vor öffentlichen Katalogen versteckt werden',
         'block_hint' =>
-            'Der Podcast zeigt oder versteckt den Status: Beim Einschalten dieser Option wird verhindert, dass der Podcast in Apple Podcasts, Google Podcasts und alle Apps von Drittanbietern, die Inhalte aus diesen Verzeichnissen ziehen, erscheint. (Nicht garantiert)',
+            'Der Podcast zeigt oder versteckt den Status: Beim Einschalten dieser Option wird verhindert, dass der Podcast in Apple Podcasts, Google Podcasts und alle Apps von Drittanbietern, die Inhalte aus diesen Verzeichnissen ziehen, erscheint. (Ohne Garantie!)',
         'complete' => 'Der Podcast wird keine neuen Folgen erhalten',
         'lock' => 'Schütze den Podcast davor kopiert zu werden',
         'lock_hint' =>
@@ -148,8 +148,8 @@ return [
     'category_options' => [
         'uncategorized' => 'unkategorisiert',
         'arts' => 'Kunst',
-        'business' => 'Geschäftlich',
-        'comedy' => 'Komödie',
+        'business' => 'Geschäftliches',
+        'comedy' => 'Comedy',
         'education' => 'Bildung',
         'fiction' => 'Fiktion',
         'government' => 'Regierung',
@@ -172,12 +172,12 @@ return [
         'food' => 'Essen',
         'performing_arts' => 'Darstellende Kunst',
         'visual_arts' => 'Visuelle Kunst',
-        'careers' => 'Karrieren',
-        'entrepreneurship' => 'Entrepreneurship',
+        'careers' => 'Karriere',
+        'entrepreneurship' => 'Unternehmertum',
         'investing' => 'Investment',
         'management' => 'Management',
         'marketing' => 'Marketing',
-        'non_profit' => 'Gemeinnützig',
+        'non_profit' => 'Gemeinnützigkeit',
         'comedy_interviews' => 'Comedy-Interviews',
         'improv' => 'Improvisation',
         'stand_up' => 'Stand-Up',
diff --git a/modules/Admin/Language/de/PodcastImport.php b/modules/Admin/Language/de/PodcastImport.php
index 7eb3d60a22..2592625dd4 100644
--- a/modules/Admin/Language/de/PodcastImport.php
+++ b/modules/Admin/Language/de/PodcastImport.php
@@ -20,9 +20,9 @@ return [
     'advanced_params_section_title' => 'Erweiterte Parameter',
     'advanced_params_section_subtitle' =>
         'Behalten Sie die Standardwerte, wenn Sie keine Ahnung haben, wofür die Felder sind.',
-    'slug_field' => 'Feld zum Berechnen der Episoden-URL (epiode slug)',
+    'slug_field' => 'Feld zum Berechnen der Episoden-URL (episode slug)',
     'description_field' =>
-        'Quellfeld für Episodenbeschreibung verwendet / Notizen anzeigen',
+        'Dieses Feld wird für die Episodenbeschreibung und Shownotes verwendet',
     'force_renumber' => 'Erzwinge Neu-Nummerierung der Folgen',
     'force_renumber_hint' =>
         'Verwende dies, wenn dein Podcast keine Episodennummern hat, aber du diese während des Imports setzen möchtest.',
@@ -30,7 +30,7 @@ return [
     'season_number_hint' =>
         'Benutze dies, wenn dein Podcast keine Staffelnummer hat, aber du eine beim Import setzen möchtest. Lasse es andernfalls leer.',
     'max_episodes' => 'Maximale Anzahl der zu importierenden Episoden',
-    'max_episodes_hint' => 'Leer lassen um alle Episoden zu importieren',
+    'max_episodes_hint' => 'Leer lassen, um alle Episoden zu importieren',
     'lock_import' =>
         'Dieser Feed ist geschützt. Du kannst ihn nicht importieren. Wenn du der Besitzer bist, entferne den Schutz auf der Ursprungsplattform.',
     'submit' => 'Podcast importieren',
diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php
index 4feafcfb50..0ca281f00c 100644
--- a/modules/Admin/Language/de/PodcastNavigation.php
+++ b/modules/Admin/Language/de/PodcastNavigation.php
@@ -17,7 +17,7 @@ return [
     'episodes' => 'Folgen',
     'episode-list' => 'Alle Episoden',
     'episode-create' => 'Neue Episoden',
-    'analytics' => 'Analysen',
+    'analytics' => 'Statistiken',
     'podcast-analytics' => 'Zuhörer-Übersicht',
     'podcast-analytics-webpages' => 'Webseiten-Besuche',
     'podcast-analytics-locations' => 'Standorte',
@@ -28,9 +28,9 @@ return [
     'premium' => 'Premium',
     'subscription-list' => 'Alle Abonnements',
     'subscription-add' => 'Abonnement hinzufügen',
-    'contributors' => 'Administratoren',
+    'contributors' => 'Mitwirkende',
     'contributor-list' => 'Alle Unterstützer',
-    'contributor-add' => 'Administrator hinzufügen',
+    'contributor-add' => 'Mitwirkenden hinzufügen',
     'platforms' => 'Externe Plattformen',
     'platforms-podcasting' => 'Podcasting',
     'platforms-social' => 'Soziale Netzwerke',
diff --git a/modules/Admin/Language/de/Settings.php b/modules/Admin/Language/de/Settings.php
index 551f4070c3..d046a40e0f 100644
--- a/modules/Admin/Language/de/Settings.php
+++ b/modules/Admin/Language/de/Settings.php
@@ -14,7 +14,7 @@ return [
         'title' => 'Instanz',
         'site_icon' => 'Webseiten-Icon',
         'site_icon_delete' => 'Lösche Webseiten-Icon',
-        'site_icon_hint' => 'Webseiten-Icons sind das, was Sie auf Ihrem Browser Tabs, Lesezeichenleiste und wenn Sie eine Website als Verknüpfung auf mobilen Geräten hinzufügen, sehen.',
+        'site_icon_hint' => 'Webseiten-Icons sind das, was Sie in Ihren Browser-Tabs, der Lesezeichenleiste und als Verknüpfung auf mobilen Geräten sehen.',
         'site_icon_helper' => 'Das Icon muss quadratisch und mindestens 512px breit und hoch sein.',
         'site_name' => 'Seitenname',
         'site_description' => 'Seitenbeschreibung',
@@ -38,7 +38,7 @@ return [
         'rename_episodes_files' => 'Audiodateien der Episode umbenennen',
         'rename_episodes_files_hint' => 'Diese Option wird alle Audiodateien der Episode mit einer zufälligen Zeichenkette umbenennen. Benutzen Sie diese Option, wenn einer Ihrer privaten Episoden-Links durchsickert, da diese dadurch versteckt werden.',
         'clear_cache' => 'Alle Caches löschen',
-        'clear_cache_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/cache-Dateien.',
+        'clear_cache_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/Cache-Dateien.',
         'run' => 'Systempflege starten',
         'runSuccess' => 'Die Systempflege wurde erfolgreich durchgeführt!',
     ],
diff --git a/modules/Admin/Language/de/Soundbite.php b/modules/Admin/Language/de/Soundbite.php
index 75f0103d05..e8d6782f45 100644
--- a/modules/Admin/Language/de/Soundbite.php
+++ b/modules/Admin/Language/de/Soundbite.php
@@ -10,22 +10,22 @@ declare(strict_types=1);
 
 return [
     'list' => [
-        'title' => 'Tonschnipsel',
-        'soundbite' => 'Tonschnipsel',
+        'title' => 'Soundbites',
+        'soundbite' => 'Soundbite',
     ],
     'messages' => [
-        'createSuccess' => 'Tonschnipsel wurde erfolgreich erstellt!',
-        'deleteSuccess' => 'Tonschnipsel wurde erfolgreich entfernt!',
+        'createSuccess' => 'Soundbite wurde erfolgreich erstellt!',
+        'deleteSuccess' => 'Soundbite wurde erfolgreich entfernt!',
     ],
     'form' => [
-        'title' => 'Neuer Tonschnipsel',
-        'soundbite_title' => 'Tonschnipsel-Titel',
+        'title' => 'Neues Soundbite',
+        'soundbite_title' => 'Soundbite-Titel',
         'start_time' => 'Beginne bei',
         'duration' => 'Länge',
-        'submit' => 'Tonschnipsel erstellen',
+        'submit' => 'Soundbite erstellen',
     ],
-    'play' => 'Tonschnipsel abspielen',
+    'play' => 'Soundbite abspielen',
     'stop' => 'Tonschnipsel stoppen',
-    'create' => 'Neuer Tonschnipsel',
-    'delete' => 'Tonschnipsel löschen',
+    'create' => 'Neues Soundbite',
+    'delete' => 'Soundbite löschen',
 ];
diff --git a/modules/Admin/Language/de/VideoClip.php b/modules/Admin/Language/de/VideoClip.php
index bffcd16caf..ccf9841b19 100644
--- a/modules/Admin/Language/de/VideoClip.php
+++ b/modules/Admin/Language/de/VideoClip.php
@@ -25,7 +25,7 @@ return [
             'passed_hint' => 'Clip wurde erfolgreich erstellt!',
         ],
         'clip' => 'Clip',
-        'duration' => 'Job Laufzeit',
+        'duration' => 'Laufzeit',
     ],
     'title' => 'Video-Clip: {videoClipLabel}',
     'download_clip' => 'Clip herunterladen',
@@ -33,7 +33,7 @@ return [
     'go_to_page' => 'Zur Clip-Seite gehen',
     'retry' => 'Clip-Generierung wiederholen',
     'delete' => 'Clip löschen',
-    'logs' => 'Job-Logs',
+    'logs' => 'Jobprotokoll',
     'messages' => [
         'alreadyExistingError' => 'Der Videoclip, den Sie zu erstellen versuchen, existiert bereits!',
         'addToQueueSuccess' => 'Videoclip wurde zur Warteschlange hinzugefügt und wartet darauf, erstellt zu werden!',
@@ -57,9 +57,9 @@ return [
         'theme' => 'Wähle ein Design',
         'start_time' => 'Beginne bei',
         'duration' => 'Laufzeit',
-        'trim_start' => 'Trimm-Start',
-        'trim_end' => 'Trimm-Ende',
-        'submit' => 'Erstelle Videoclip',
+        'trim_start' => 'Startpunkt',
+        'trim_end' => 'Ende trimmen',
+        'submit' => 'Neuen Clip erstellen',
     ],
     'requirements' => [
         'title' => 'Fehlende Anforderungen',
diff --git a/modules/Admin/Language/el/Charts.php b/modules/Admin/Language/el/Charts.php
index 4575d14d3f..247a77e7f8 100644
--- a/modules/Admin/Language/el/Charts.php
+++ b/modules/Admin/Language/el/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Ημερήσιο χρησιμοποιούμενο bandwidth (σε MB)',
     'total_storage_by_month' => 'Μηνιαία αποθήκευση (σε MB)',
     'total_bandwidth_by_month' => 'Μηνιαίο χρησιμοποιούμενο εύρος ζώνης (σε MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/el/Episode.php b/modules/Admin/Language/el/Episode.php
index b7e2bbc665..fc9c0e927d 100644
--- a/modules/Admin/Language/el/Episode.php
+++ b/modules/Admin/Language/el/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Επεισόδιο',
         'visibility' => 'Ορατότητα',
+        'downloads' => 'Downloads',
         'comments' => 'Σχόλια',
         'actions' => 'Ενέργειες',
     ],
diff --git a/modules/Admin/Language/es/Charts.php b/modules/Admin/Language/es/Charts.php
index fee7dda4b3..11c714f057 100644
--- a/modules/Admin/Language/es/Charts.php
+++ b/modules/Admin/Language/es/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Ancho de banda diario usado (en MB)',
     'total_storage_by_month' => 'Almacenamiento mensual (en MB)',
     'total_bandwidth_by_month' => 'Ancho de banda mensual usado (en MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/es/Episode.php b/modules/Admin/Language/es/Episode.php
index d586f4204c..84f3267259 100644
--- a/modules/Admin/Language/es/Episode.php
+++ b/modules/Admin/Language/es/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episodio',
         'visibility' => 'Visibilidad',
+        'downloads' => 'Downloads',
         'comments' => 'Comentarios',
         'actions' => 'Acciones',
     ],
diff --git a/modules/Admin/Language/fa/Charts.php b/modules/Admin/Language/fa/Charts.php
index 4b33530ef0..6ede251094 100644
--- a/modules/Admin/Language/fa/Charts.php
+++ b/modules/Admin/Language/fa/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/fa/Episode.php b/modules/Admin/Language/fa/Episode.php
index 713b517b0c..5ed5e3acef 100644
--- a/modules/Admin/Language/fa/Episode.php
+++ b/modules/Admin/Language/fa/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/fr/AboutCastopod.php b/modules/Admin/Language/fr/AboutCastopod.php
index 3fb62afffe..7cd9412bf5 100644
--- a/modules/Admin/Language/fr/AboutCastopod.php
+++ b/modules/Admin/Language/fr/AboutCastopod.php
@@ -9,14 +9,14 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => 'About Castopod',
-    'host_name' => 'Host name',
-    'version' => 'Castopod version',
-    'php_version' => 'PHP version',
-    'os' => 'Operating System',
-    'languages' => 'Languages',
-    'update_database' => 'Update database',
+    'title' => 'À propos de Castopod',
+    'host_name' => 'Nom d’hôte',
+    'version' => 'Version de Castopod',
+    'php_version' => 'Version de PHP',
+    'os' => 'Système d\'exploitation',
+    'languages' => 'Langues',
+    'update_database' => 'Mettre à jour la base de données',
     'messages' => [
-        'databaseUpdateSuccess' => 'Database is up to date!',
+        'databaseUpdateSuccess' => 'La base de données est à jour!',
     ],
 ];
diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php
index a72289fdec..1ddcb23cc9 100644
--- a/modules/Admin/Language/fr/Breadcrumb.php
+++ b/modules/Admin/Language/fr/Breadcrumb.php
@@ -31,8 +31,8 @@ return [
     'delete' => 'supprimer',
     'remove' => 'retirer',
     'fediverse' => 'fédiverse',
-    'blocked-actors' => 'blocked actors',
-    'blocked-domains' => 'blocked domains',
+    'blocked-actors' => 'acteurs bloqués',
+    'blocked-domains' => 'domaines bloqués',
     'users' => 'utilisateurs',
     'my-account' => 'mon compte',
     'change-password' => 'changer le mot de passe',
diff --git a/modules/Admin/Language/fr/Charts.php b/modules/Admin/Language/fr/Charts.php
index 43fb67170a..ee7defd584 100644
--- a/modules/Admin/Language/fr/Charts.php
+++ b/modules/Admin/Language/fr/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Bande passante quotidienne consommée (en Mo)',
     'total_storage_by_month' => 'Stockage mensuel (en Mo)',
     'total_bandwidth_by_month' => 'Bande passante mensuelle utilisée (en Mo)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/fr/Dashboard.php b/modules/Admin/Language/fr/Dashboard.php
index 881073fd26..010761fa3b 100644
--- a/modules/Admin/Language/fr/Dashboard.php
+++ b/modules/Admin/Language/fr/Dashboard.php
@@ -9,20 +9,20 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Admin dashboard',
-    'welcome_message' => 'Welcome to the admin area!',
+    'home' => 'Tableau de bord',
+    'welcome_message' => 'Bienvenue dans l\'espace d\'administration !',
     'podcasts' => [
         'title' => 'Podcasts',
-        'not_found' => 'No published podcast',
-        'last_published' => 'Last published on {lastPublicationDate}',
+        'not_found' => 'Pas de podcast publié',
+        'last_published' => 'Dernière publication le {lastPublicationDate}',
     ],
     'episodes' => [
-        'title' => 'Episodes',
-        'not_found' => 'No published episode',
-        'last_published' => 'Last published on {lastPublicationDate}',
+        'title' => 'Épisodes',
+        'not_found' => 'Aucun épisode publié',
+        'last_published' => 'Dernière publication le {lastPublicationDate}',
     ],
     'storage' => [
-        'title' => 'Storage',
-        'subtitle' => '{totalUploaded} out of {totalStorage}',
+        'title' => 'Espace de stockage',
+        'subtitle' => '{totalUploaded} sur {totalStorage}',
     ],
 ];
diff --git a/modules/Admin/Language/fr/Episode.php b/modules/Admin/Language/fr/Episode.php
index 5cf925c061..55579ee302 100644
--- a/modules/Admin/Language/fr/Episode.php
+++ b/modules/Admin/Language/fr/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Épisode',
         'visibility' => 'Visibilité',
+        'downloads' => 'Downloads',
         'comments' => 'Commentaires',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/fr/Notifications.php b/modules/Admin/Language/fr/Notifications.php
index 42f1149bd0..003b2bbb9e 100644
--- a/modules/Admin/Language/fr/Notifications.php
+++ b/modules/Admin/Language/fr/Notifications.php
@@ -10,10 +10,10 @@ declare(strict_types=1);
 
 return [
     'title' => 'Notifications',
-    'reply' => '{actor_username} replied to your post',
-    'favourite' => '{actor_username} favourited your post',
-    'reblog' => '{actor_username} shared your post',
-    'follow' => '{actor_username} started following you',
+    'reply' => '{actor_username} a répondu à votre message',
+    'favourite' => '{actor_username} a mis en favori votre message',
+    'reblog' => '{actor_username} à partagé votre message',
+    'follow' => '{actor_username} commencé à te suivre',
     'no_notifications' => 'Aucune notification',
     'mark_all_as_read' => 'Tout marquer comme lu',
 ];
diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php
index c976972717..ca69055f86 100644
--- a/modules/Admin/Language/fr/Podcast.php
+++ b/modules/Admin/Language/fr/Podcast.php
@@ -111,9 +111,9 @@ return [
         'premium_by_default' => 'Les épisodes doivent être définis comme premium par défaut',
         'premium_by_default_hint' => 'Les épisodes de Podcast seront marqués comme premium par défaut. Vous pouvez toujours choisir de définir certains épisodes, bandes-annonces ou bonus comme publics.',
         'op3' => 'Open Podcast Prefix Project (OP3)',
-        'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.',
-        'op3_enable' => 'Enable OP3 analytics service',
-        'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.',
+        'op3_hint' => 'Valorisez vos données d\'analyse avec OP3, un service d\'analyse tiers open source et de confiance. Partagez, validez et comparez vos données analytiques avec l\'écosystème de podcasting ouvert.',
+        'op3_enable' => 'Activer le service d\'analyse OP3',
+        'op3_enable_hint' => 'Pour des raisons de sécurité, les données d\'analyse des épisodes premium ne seront pas partagées avec OP3.',
         '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',
@@ -137,7 +137,7 @@ return [
         'status_section_title' => 'Statut',
         'block' => 'L\'épisode doit être masqué dans les catalogues publics',
         'block_hint' =>
-            'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
+            'Le statut d\'affichage ou de masquage du podcast : activer cette option empêche l\'intégralité du podcast d\'apparaître dans les podcasts Apple, Google Podcasts et toutes les applications tierces qui extraient des émissions de ces répertoires. (Pas garantie)',
         'complete' => 'Le podcast n’aura plus de nouveaux épisodes.',
         'lock' => 'Empêcher la copie du podcast',
         'lock_hint' =>
@@ -259,36 +259,36 @@ return [
         'tv_reviews' => 'Critiques TV',
     ],
     'publish_form' => [
-        'back_to_podcast_dashboard' => 'Back to podcast dashboard',
-        'post' => 'Your announcement post',
+        'back_to_podcast_dashboard' => 'Retour au tableau de bord des podcasts',
+        'post' => 'Votre message de publication',
         'post_hint' =>
-            "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.",
-        'message_placeholder' => 'Write your message…',
-        'submit' => 'Publish',
-        'publication_date' => 'Publication date',
+            "Écrivez un message pour annoncer la publication de votre podcast. Le message sera affiché sur la page d'accueil de votre podcast.",
+        'message_placeholder' => 'Rédiger votre message…',
+        'submit' => 'Publier',
+        'publication_date' => 'Date de publication',
         'publication_method' => [
-            'now' => 'Now',
-            'schedule' => 'Schedule',
+            'now' => 'Maintenant',
+            'schedule' => 'Planifier',
         ],
-        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date' => 'Date de publication programmée',
         'scheduled_publication_date_hint' =>
-            'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
-        'submit_edit' => 'Edit publication',
-        'cancel_publication' => 'Cancel publication',
-        'message_warning' => 'You did not write a message for your announcement post!',
-        'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.',
-        'message_warning_submit' => 'Publish anyway',
+            'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication. Ce champ doit être au format YYYY-MM-DD HH:mm',
+        'submit_edit' => 'Modifier la publication',
+        'cancel_publication' => 'Annuler la publication',
+        'message_warning' => 'Vous n’avez pas saisi de message pour l’annonce de votre épisode !',
+        'message_warning_hint' => 'Avoir un message augmente l\'engagement social, résultant en une meilleure visibilité pour votre podcast.',
+        'message_warning_submit' => 'Publier quand même',
     ],
     'publication_status_banner' => [
-        'draft_mode' => 'draft mode',
-        'not_published' => 'This podcast is not yet published.',
-        'scheduled' => 'This podcast is scheduled for publication on {publication_date}.',
+        'draft_mode' => 'Mode brouillon',
+        'not_published' => 'Ce podcast n\'est pas encore publié.',
+        'scheduled' => 'Ce podcast est programmé pour être publié le {publication_date}.',
     ],
     'delete_form' => [
         'disclaimer' =>
-            "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.",
-        'understand' => 'I understand, I want the podcast to be permanently deleted',
-        'submit' => 'Delete',
+            "La suppression du podcast supprimera tous les épisodes, fichiers multimédia, messages et statistiques qui y sont associées. Cette action est irréversible, vous ne pourrez plus les récupérer par la suite.",
+        'understand' => 'Je comprends, je souhaite que le podcast soit définitivement supprimé',
+        'submit' => 'Supprimer',
     ],
     'by' => 'Par {publisher}',
     'season' => 'Saison {seasonNumber}',
diff --git a/modules/Admin/Language/fr/PodcastNavigation.php b/modules/Admin/Language/fr/PodcastNavigation.php
index 86a1bf52f8..d49055b28d 100644
--- a/modules/Admin/Language/fr/PodcastNavigation.php
+++ b/modules/Admin/Language/fr/PodcastNavigation.php
@@ -26,8 +26,8 @@ return [
     'podcast-analytics-listening-time' => 'Durée d’écoute',
     'podcast-analytics-time-periods' => 'Périodes',
     'premium' => 'Premium',
-    'subscription-list' => 'All subscriptions',
-    'subscription-add' => 'Add subscription',
+    'subscription-list' => 'Tous les abonnements',
+    'subscription-add' => 'Ajouter un abonnement',
     '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 e6b0f54732..f32fc3ec7f 100644
--- a/modules/Admin/Language/fr/Settings.php
+++ b/modules/Admin/Language/fr/Settings.php
@@ -35,8 +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.',
+        'rename_episodes_files' => 'Renommer les fichiers audio de l\'épisode',
+        'rename_episodes_files_hint' => 'Cette option renommera tous les fichiers audio des épisodes en une chaîne de caractères aléatoire. Utilisez-le si l\'un de vos liens d\'épisodes privés a été divulgué, car cela le masquera efficacement.',
         '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/fr2/Breadcrumb.php b/modules/Admin/Language/fr2/Breadcrumb.php
new file mode 100644
index 0000000000..c2e761ca01
--- /dev/null
+++ b/modules/Admin/Language/fr2/Breadcrumb.php
@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'label' => 'fil d’Ariane',
+    config('Admin')
+        ->gateway => 'Accueil',
+    'podcasts' => 'podcasts',
+    'episodes' => 'épisodes',
+    'subscriptions' => 'abonnements',
+    'contributors' => 'contributeurs',
+    'pages' => 'pages',
+    'settings' => 'paramètres',
+    'theme' => 'thème',
+    'about' => 'à propos',
+    'add' => 'ajouter',
+    'new' => 'créer',
+    'edit' => 'modifier',
+    'persons' => 'intervenants',
+    'publish' => 'publier',
+    'publish-edit' => 'modifier la publication',
+    'publish-date-edit' => 'modifier la date de publication',
+    'unpublish' => 'dépublier',
+    'delete' => 'supprimer',
+    'remove' => 'retirer',
+    'fediverse' => 'fédiverse',
+    'blocked-actors' => 'utilisateurs bloqués',
+    'blocked-domains' => 'domaines bloqués',
+    'users' => 'utilisateurs',
+    'my-account' => 'mon compte',
+    'change-password' => 'changer le mot de passe',
+    'import' => 'importer un flux',
+    'platforms' => 'plateformes',
+    'social' => 'réseaux sociaux',
+    'funding' => 'financement',
+    'analytics' => 'mesure d’audience',
+    'locations' => 'localisation',
+    'webpages' => 'pages web',
+    'unique-listeners' => 'auditeurs uniques',
+    'players' => 'lecteurs',
+    'listening-time' => 'durée d’écoute',
+    'time-periods' => 'périodes',
+    'soundbites' => 'extraits sonores',
+    'video-clips' => 'extraits vidéo',
+    'embed' => 'lecteur intégré',
+    'notifications' => 'notifications',
+    'suspend' => 'suspendre',
+];
diff --git a/modules/Admin/Language/fr2/Charts.php b/modules/Admin/Language/fr2/Charts.php
new file mode 100644
index 0000000000..2275938964
--- /dev/null
+++ b/modules/Admin/Language/fr2/Charts.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'by_service_weekly' => 'Téléchargements d’épisodes par service (la semaine dernière)',
+    'by_player_weekly' => 'Téléchargements d’épisodes par lecteur (la semaine dernière)',
+    'by_player_yearly' => 'Téléchargements d’épisodes par lecteur (cette année)',
+    'by_device_weekly' => 'Téléchargements d’épisodes par appareil (la semaine dernière)',
+    'by_os_weekly' => 'Téléchargements d’épisodes par OS (la semaine dernière)',
+    'podcast_by_region' => 'Téléchargements d’épisodes par région (la semaine dernière)',
+    'unique_daily_listeners' => 'Auditeurs uniques quotidiens',
+    'unique_monthly_listeners' => 'Auditeurs uniques mensuels',
+    'by_browser' => 'Fréquentation des pages web par navigateur (la semaine dernière)',
+    'podcast_by_day' => 'Téléchargements quotidiens d’épisodes',
+    'podcast_by_month' => 'Téléchargements mensuels d’épisodes',
+    'episode_by_day' => 'Téléchargements quotidiens de l’épisode (les 60 premiers jours)',
+    'episode_by_month' => 'Téléchargements mensuels de l’épisode',
+    'episodes_by_day' =>
+        'Téléchargements des 5 derniers épisodes (lors de leurs 60 premiers jours)',
+    'by_country_weekly' => 'Téléchargements d’épisodes par pays (la dernière semaine)',
+    'by_country_yearly' => 'Téléchargements d’épisodes par pays (l\'année dernière)',
+    'by_domain_weekly' => 'Fréquentation des pages web par origine (la semaine dernière)',
+    'by_domain_yearly' => 'Fréquentation des pages web par origine (la semaine dernière)',
+    'by_entry_page' => 'Fréquentation des pages web par page d’entrée (la semaine dernière)',
+    'podcast_bots' => 'Robots (bots)',
+    'daily_listening_time' => 'Durée quotidienne d’écoute cumulée',
+    'monthly_listening_time' => 'Durée mensuelle d’écoute cumulée',
+    'by_weekday' => 'Par jour de la semaine (les 60 derniers jours)',
+    'by_hour' => 'Par heure de la journée (les 60 derniers jours)',
+    'podcast_by_bandwidth' => 'Bande passante quotidienne consommée (en Mo)',
+    'total_storage_by_month' => 'Stockage mensuel (en Mo)',
+    'total_bandwidth_by_month' => 'Bande passante mensuelle utilisée (en Mo)',
+    'total_bandwidth_by_month_limit' => 'Limité à {totalBandwidth} par mois',
+];
diff --git a/modules/Admin/Language/fr2/Common.php b/modules/Admin/Language/fr2/Common.php
new file mode 100644
index 0000000000..1d92e04886
--- /dev/null
+++ b/modules/Admin/Language/fr2/Common.php
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Oui',
+    'no' => 'Non',
+    'cancel' => 'Annuler',
+    'optional' => 'Optionnel',
+    'more' => 'Plus',
+    'no_data' => 'Aucune donnée trouvée  !',
+    'close' => 'Fermer',
+    'edit' => 'Modifier',
+    'copy' => 'Copier',
+    'copied' => 'Copié  !',
+    'home' => 'Accueil',
+    'explicit' => 'Explicite',
+    'powered_by' => 'Propulsé par {castopod}',
+    'actions' => 'Actions',
+    'pageInfo' => 'Page {currentPage} sur {pageCount}',
+    'go_back' => 'Retour en arrière',
+    'forms' => [
+        'editor' => [
+            'write' => 'Écrire',
+            'preview' => 'Aperçu',
+            'help' => 'Propulsé par markdown',
+        ],
+        'multiSelect' => [
+            'selectText' => 'Cliquez pour selectionner',
+            'loadingText' => 'Chargement…',
+            'noResultsText' => 'Aucun résultat trouvé',
+            'noChoicesText' => 'Aucune sélection possible',
+            'maxItemText' => 'Impossible de rajouter un élément',
+        ],
+        'upload_file' => 'Téléverser un fichier',
+        'remote_url' => 'URL distante',
+    ],
+    'play_episode_button' => [
+        'play' => 'Lire',
+        'playing' => 'En cours',
+    ],
+    'size_limit' => 'Taille maximale : {0}.',
+    'choose_interact' => 'Choisissez le mode d\'interaction',
+    'view' => 'Voir',
+];
diff --git a/modules/Admin/Language/fr2/Countries.php b/modules/Admin/Language/fr2/Countries.php
new file mode 100644
index 0000000000..a0e70692e2
--- /dev/null
+++ b/modules/Admin/Language/fr2/Countries.php
@@ -0,0 +1,264 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * ISO 3166 country codes
+ *
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'AD' => 'Andorre',
+    'AE' => 'Émirats Arabes Unis',
+    'AF' => 'Afghanistan',
+    'AG' => 'Antigua-Et-Barbuda',
+    'AI' => 'Anguilla',
+    'AL' => 'Albanie',
+    'AM' => 'Arménie',
+    'AO' => 'Angola',
+    'AQ' => 'Antarctique',
+    'AR' => 'Argentine',
+    'AS' => 'Samoa Américaines',
+    'AT' => 'Autriche',
+    'AU' => 'Australie',
+    'AW' => 'Aruba',
+    'AX' => 'Åland, Îles',
+    'AZ' => 'Azerbaïdjan',
+    'BA' => 'Bosnie-Herzégovine',
+    'BB' => 'Barbade',
+    'BD' => 'Bangladesh',
+    'BE' => 'Belgique',
+    'BF' => 'Burkina Faso',
+    'BG' => 'Bulgarie',
+    'BH' => 'Bahreïn',
+    'BI' => 'Burundi',
+    'BJ' => 'Bénin',
+    'BL' => 'Saint-Barthélemy',
+    'BM' => 'Bermudes',
+    'BN' => 'Brunéi Darussalam',
+    'BO' => 'Bolivie, État Plurinational De',
+    'BQ' => 'Bonaire, Saint-Eustache Et Saba',
+    'BR' => 'Brésil',
+    'BS' => 'Bahamas',
+    'BT' => 'Bhoutan',
+    'BV' => 'Bouvet, Île',
+    'BW' => 'Botswana',
+    'BY' => 'Bélarus',
+    'BZ' => 'Bélize',
+    'CA' => 'Canada',
+    'CC' => 'Cocos (Keeling), Îles',
+    'CD' => 'Congo, La République Démocratique Du',
+    'CF' => 'Centrafricaine, République',
+    'CG' => 'Congo',
+    'CH' => 'Suisse',
+    'CI' => "Côte D’ivoire",
+    'CK' => 'Cook, Îles',
+    'CL' => 'Chili',
+    'CM' => 'Cameroun',
+    'CN' => 'Chine',
+    'CO' => 'Colombie',
+    'CR' => 'Costa Rica',
+    'CU' => 'Cuba',
+    'CV' => 'Cap-Vert',
+    'CW' => 'Curaçao',
+    'CX' => 'Christmas, Île',
+    'CY' => 'Chypre',
+    'CZ' => 'Tchéquie',
+    'DE' => 'Allemagne',
+    'DJ' => 'Djibouti',
+    'DK' => 'Danemark',
+    'DM' => 'Dominique',
+    'DO' => 'République Dominicaine',
+    'DZ' => 'Algérie',
+    'EC' => 'Équateur',
+    'EE' => 'Estonie',
+    'EG' => 'Égypte',
+    'EH' => 'Sahara Occidental',
+    'ER' => 'Érythrée',
+    'ES' => 'Espagne',
+    'ET' => 'Éthiopie',
+    'FI' => 'Finlande',
+    'FJ' => 'Fidji',
+    'FK' => 'Falkland, Îles (Malvinas)',
+    'FM' => 'Micronésie, États Fédérés De',
+    'FO' => 'Féroé, Îles',
+    'FR' => 'France',
+    'GA' => 'Gabon',
+    'GB' => 'Royaume-Uni',
+    'GD' => 'Grenade',
+    'GE' => 'Géorgie',
+    'GF' => 'Guyane Française',
+    'GG' => 'Guernesey',
+    'GH' => 'Ghana',
+    'GI' => 'Gibraltar',
+    'GL' => 'Groenland',
+    'GM' => 'Gambie',
+    'GN' => 'Guinée',
+    'GP' => 'Guadeloupe',
+    'GQ' => 'Guinée Équatoriale',
+    'GR' => 'Grèce',
+    'GS' => 'Géorgie Du Sud Et Les Îles Sandwich Du Sud',
+    'GT' => 'Guatémala',
+    'GU' => 'Guam',
+    'GW' => 'Guinée-Bissau',
+    'GY' => 'Guyane',
+    'HK' => 'Hong Kong',
+    'HM' => 'Heard Et Macdonald, Îles',
+    'HN' => 'Honduras',
+    'HR' => 'Croatie',
+    'HT' => 'Haïti',
+    'HU' => 'Hongrie',
+    'ID' => 'Indonésie',
+    'IE' => 'Irlande',
+    'IL' => 'Israël',
+    'IM' => 'Île De Man',
+    'IN' => 'Inde',
+    'IO' => 'Océan Indien, Territoire Britannique De L’',
+    'IQ' => 'Irak',
+    'IR' => 'Iran, République Islamique D’',
+    'IS' => 'Islande',
+    'IT' => 'Italie',
+    'JE' => 'Jersey',
+    'JM' => 'Jamaïque',
+    'JO' => 'Jordanie',
+    'JP' => 'Japon',
+    'KE' => 'Kenya',
+    'KG' => 'Kirghizistan',
+    'KH' => 'Cambodge',
+    'KI' => 'Kiribati',
+    'KM' => 'Comores',
+    'KN' => 'Saint-Kitts-Et-Nevis',
+    'KP' => "Corée, République Populaire Démocratique De",
+    'KR' => 'Corée, République De',
+    'KW' => 'Koweït',
+    'KY' => 'Caïmanes, Îles',
+    'KZ' => 'Kazakhstan',
+    'LA' => "Lao, République Démocratique Populaire",
+    'LB' => 'Liban',
+    'LC' => 'Sainte-Lucie',
+    'LI' => 'Liechtenstein',
+    'LK' => 'Sri Lanka',
+    'LR' => 'Libéria',
+    'LS' => 'Lesotho',
+    'LT' => 'Lituanie',
+    'LU' => 'Luxembourg',
+    'LV' => 'Lettonie',
+    'LY' => 'Libye',
+    'MA' => 'Maroc',
+    'MC' => 'Monaco',
+    'MD' => 'Moldavie',
+    'ME' => 'Monténégro',
+    'MF' => 'Saint-Martin (Partie Française)',
+    'MG' => 'Madagascar',
+    'MH' => 'Marshall, Îles',
+    'MK' => 'République De Macédoine',
+    'ML' => 'Mali',
+    'MM' => 'Birmanie',
+    'MN' => 'Mongolie',
+    'MO' => 'Macao',
+    'MP' => 'Mariannes Du Nord, Îles',
+    'MQ' => 'Martinique',
+    'MR' => 'Mauritanie',
+    'MS' => 'Montserrat',
+    'MT' => 'Malte',
+    'MU' => 'Maurice',
+    'MV' => 'Maldives',
+    'MW' => 'Malawi',
+    'MX' => 'Mexique',
+    'MY' => 'Malaisie',
+    'MZ' => 'Mozambique',
+    'N/A' => 'Non Applicable (IP locale…)',
+    'NA' => 'Namibie',
+    'NC' => 'Nouvelle-Calédonie',
+    'NE' => 'Niger',
+    'NF' => 'Norfolk, Île',
+    'NG' => 'Nigéria',
+    'NI' => 'Nicaragua',
+    'NL' => 'Pays-Bas',
+    'NO' => 'Norvège',
+    'NP' => 'Népal',
+    'NR' => 'Nauru',
+    'NU' => 'Niué',
+    'NZ' => 'Nouvelle-Zélande',
+    'OM' => 'Oman',
+    'PA' => 'Panama',
+    'PE' => 'Pérou',
+    'PF' => 'Polynésie Française',
+    'PG' => 'Papouasie-Nouvelle-Guinée',
+    'PH' => 'Philippines',
+    'PK' => 'Pakistan',
+    'PL' => 'Pologne',
+    'PM' => 'Saint-Pierre-Et-Miquelon',
+    'PN' => 'Îles Pitcairn',
+    'PR' => 'Porto Rico',
+    'PS' => 'État De Palestine',
+    'PT' => 'Portugal',
+    'PW' => 'Palaos',
+    'PY' => 'Paraguay',
+    'QA' => 'Qatar',
+    'RE' => 'La Réunion',
+    'RO' => 'Roumanie',
+    'RS' => 'Serbie',
+    'RU' => 'Russie, Fédération De',
+    'RW' => 'Rwanda',
+    'SA' => 'Arabie Saoudite',
+    'SB' => 'Salomon, Îles',
+    'SC' => 'Seychelles',
+    'SD' => 'Soudan',
+    'SE' => 'Suède',
+    'SG' => 'Singapour',
+    'SH' => 'Sainte-Hélène, Ascension Et Tristan Da Cunha',
+    'SI' => 'Slovénie',
+    'SJ' => 'Svalbard Et Île Jan Mayen',
+    'SK' => 'Slovaquie',
+    'SL' => 'Sierra Leone',
+    'SM' => 'Saint-Marin',
+    'SN' => 'Sénégal',
+    'SO' => 'Somalie',
+    'SR' => 'Suriname',
+    'SS' => 'Soudan Du Sud',
+    'ST' => 'Sao Tomé-Et-Principe',
+    'SV' => 'El Salvador',
+    'SX' => 'Saint-Martin (Partie Néerlandaise)',
+    'SY' => 'Syrienne, République Arabe',
+    'SZ' => 'Eswatini',
+    'TC' => 'Turks Et Caïques, Îles',
+    'TD' => 'Tchad',
+    'TF' => 'Terres Australes Françaises',
+    'TG' => 'Togo',
+    'TH' => 'Thaïlande',
+    'TJ' => 'Tadjikistan',
+    'TK' => 'Tokélaou',
+    'TL' => 'Timor oriental',
+    'TM' => 'Turkménistan',
+    'TN' => 'Tunisie',
+    'TO' => 'Tonga',
+    'TR' => 'Turquie',
+    'TT' => 'Trinité-Et-Tobago',
+    'TV' => 'Tuvalu',
+    'TW' => 'Taïwan',
+    'TZ' => 'Tanzanie, République Unie De',
+    'UA' => 'Ukraine',
+    'UG' => 'Ouganda',
+    'UM' => 'Îles Mineures Éloignées Des États-Unis',
+    'US' => 'États-Unis',
+    'UY' => 'Uruguay',
+    'UZ' => 'Ouzbékistan',
+    'VA' => 'Saint-Siège (État de la Cité du Vatican)',
+    'VC' => 'Saint-Vincent-Et-Les-Grenadines',
+    'VE' => 'Venezuela, République Bolivarienne Du',
+    'VG' => 'Îles Vierges Britanniques',
+    'VI' => 'Îles Vierges des États-Unis',
+    'VN' => 'Vietnam',
+    'VU' => 'Vanuatu',
+    'WF' => 'Wallis-Et-Futuna',
+    'WS' => 'Samoa',
+    'YE' => 'Yémen',
+    'YT' => 'Mayotte',
+    'ZA' => 'Afrique Du Sud',
+    'ZM' => 'Zambie',
+    'ZW' => 'Zimbabwe',
+];
diff --git a/modules/Admin/Language/fr2/Episode.php b/modules/Admin/Language/fr2/Episode.php
new file mode 100644
index 0000000000..81a102fe49
--- /dev/null
+++ b/modules/Admin/Language/fr2/Episode.php
@@ -0,0 +1,214 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Saison {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Épisode {episodeNumber}',
+    'number_abbr' => 'Ép. {episodeNumber}',
+    'season_episode' => 'Saison {seasonNumber} épisode {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# commentaire}
+        other {# commentaires}
+    }',
+    'all_podcast_episodes' => 'Tous les épisodes du podcast',
+    'back_to_podcast' => 'Revenir au podcast',
+    'edit' => 'Modifier',
+    'publish' => 'Publier',
+    'publish_edit' => 'Modifier la publication',
+    'publish_date_edit' => 'Modifier la date de publication',
+    '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' => 'L\'épisode n\'a pas encore été publié, vous ne pouvez pas modifier sa date de publication.',
+    'publish_date_edit_future_error' => 'La date de publication de l\'épisode ne peut être définie qu\'à une date antérieure ! Si vous souhaitez la replanifier, dépubliez-le d\'abord.',
+    'publish_date_edit_success' => 'La date de publication de l\'épisode a été mise à jour avec succès !',
+    'unpublish_error' => 'L’épisode n’est pas publié.',
+    'delete' => 'Supprimer',
+    'go_to_page' => 'Voir',
+    'create' => 'Ajouter un épisode',
+    'publication_status' => [
+        'published' => 'Publié',
+        'with_podcast' => 'Publié',
+        'scheduled' => 'Planifié',
+        'not_published' => 'Non publié',
+    ],
+    'with_podcast_hint' => 'Publier en même temps que le podcast',
+    'list' => [
+        'search' => [
+            'placeholder' => 'Rechercher un épisode',
+            'clear' => 'Effacer la recherche',
+            'submit' => 'Recherche',
+        ],
+        'number_of_episodes' => '{numberOfEpisodes, plural,
+            one {# épisode}
+            other {# épisodes}
+        }',
+        'episode' => 'Épisode',
+        'visibility' => 'Visibilité',
+        'downloads' => 'Downloads',
+        'comments' => 'Commentaires',
+        'actions' => 'Actions',
+    ],
+    'messages' => [
+        'createSuccess' => 'L’épisode a été créé avec succès  !',
+        'editSuccess' => 'L’épisode a bien été mis à jour  !',
+        'publishSuccess' => '{publication_status, select,
+            published {Épisode publié avec succès !}
+            scheduled {La publication de l\'épisode est planifiée avec succès !}
+            with_podcast {Cet épisode sera publié en même temps que le podcast.}
+            other {Cet épisode n\'est pas publié.}
+        }',
+        'publishCancelSuccess' => 'La publication de l’épisode a bien été annulée  !',
+        'unpublishBeforeDeleteTip' => 'Vous devez dépublier l\'épisode avant de le supprimer.',
+        'scheduleDateError' => 'La date de planification doit être définie !',
+        'deletePublishedEpisodeError' => 'Vous devez dépublier l\'épisode avant de le supprimer.',
+        'deleteSuccess' => 'L\'épisode a bien été supprimé !',
+        'deleteError' => 'Impossible de supprimer {type, select,
+            transcript {la transcription}
+            chapters {les chapitres}
+            image {la couverture}
+            audio {l\'audio}
+            other {le média}
+        } de l\'épisode.',
+        'deleteFileError' => 'Impossible de supprimer {type, select,
+            transcript {la transcription}
+            chapters {les chapitres}
+            image {la couverture}
+            audio {l\'audio}
+            other {le média}
+        } du fichier {file_path}. Vous pouvez le supprimer manuellement de votre disque.',
+        'sameSlugError' => 'Il existe déjà un épisode avec le slug choisi.',
+    ],
+    'form' => [
+        'file_size_error' =>
+            'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.',
+        'audio_file' => 'Audio file',
+        'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.',
+        'info_section_title' => 'Episode info',
+        'cover' => 'Episode cover',
+        'cover_hint' =>
+            'If you do not set a cover, the podcast cover will be used instead.',
+        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'title' => 'Title',
+        'title_hint' =>
+            'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.',
+        'permalink' => 'Permalink',
+        'season_number' => 'Season',
+        'episode_number' => 'Episode',
+        'type' => [
+            'label' => 'Type',
+            'full' => 'Full',
+            'full_hint' => 'Complete content (the episode)',
+            'trailer' => 'Trailer',
+            'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show',
+            '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?',
+            'undefined' => 'undefined',
+            'clean' => 'Clean',
+            'explicit' => 'Explicit',
+        ],
+        'show_notes_section_title' => 'Show notes',
+        'show_notes_section_subtitle' =>
+            'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
+        'description' => 'Description',
+        'description_footer' => 'Description footer',
+        'description_footer_hint' =>
+            'This text is added at the end of each episode description, it is a good place to input your social links for example.',
+        'additional_files_section_title' => 'Additional files',
+        'additional_files_section_subtitle' =>
+            'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this episode about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real or fictional location',
+        'transcript' => 'Transcript (subtitles / closed captions)',
+        'transcript_hint' => 'Only .srt are allowed.',
+        'transcript_download' => 'Download transcript',
+        'transcript_file' => 'Transcript file (.srt)',
+        'transcript_remote_url' => 'Remote url for transcript',
+        'transcript_file_delete' => 'Delete transcript file',
+        'chapters' => 'Chapitrage',
+        'chapters_hint' => 'Le fichier doit être en format “JSON Chapters”.',
+        'chapters_download' => 'Télécharger le chapitrage',
+        'chapters_file' => 'Fichier de chapitrage',
+        'chapters_remote_url' => 'URL distante pour le fichier de chapitrage',
+        'chapters_file_delete' => 'Supprimer le fichier de chapitrage',
+        'advanced_section_title' => 'Paramètres avancés',
+        'advanced_section_subtitle' =>
+            'Si vous avez besoin d’une balise RSS que Castopod ne couvre pas, définissez-la ici.',
+        'custom_rss' => 'Balises RSS personnalisées pour l’épisode',
+        'custom_rss_hint' => 'Ceci sera injecté dans la balise ❬item❭.',
+        'block' => 'L\'épisode doit être masqué dans les catalogues publics',
+        'block_hint' =>
+            'Statut caché ou visible de l\'épisode : activer ceci empêche l\'épisode d\'apparaître dans les Apple Podcasts, Google Podcasts, et toutes les applications tierces qui utilisent ces répertoires. (Sans garantie)',
+        'submit_create' => 'Créer l’épisode',
+        'submit_edit' => 'Enregistrer l’épisode',
+    ],
+    'publish_form' => [
+        'back_to_episode_dashboard' => 'Retour au tableau de bord de l’épisode',
+        'post' => 'Votre message de publication',
+        'post_hint' =>
+            "Écrivez un message pour annoncer la publication de votre épisode. Ce message sera diffusé à toutes les personnes qui vous suivent dans le fédiverse et mis en évidence sur la page d’accueil de votre podcast.",
+        'message_placeholder' => 'Entrez votre message…',
+        'publication_date' => 'Date de publication',
+        'publication_method' => [
+            'now' => 'Maintenant',
+            'schedule' => 'Planifier',
+            'with_podcast' => 'Publier en même temps que le podcast',
+        ],
+        'scheduled_publication_date' => 'Date de publication programmée',
+        'scheduled_publication_date_clear' => 'Effacer la date de publication',
+        'scheduled_publication_date_hint' =>
+            'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication future. Ce champ doit être au format YYYY-MM-DD HH:mm',
+        'submit' => 'Publier',
+        'submit_edit' => 'Modifier la publication',
+        'cancel_publication' => 'Annuler la publication',
+        'message_warning' => 'Vous n’avez pas saisi de message pour l’annonce de votre épisode  !',
+        'message_warning_hint' => 'Ajouter un message augmente l’engagement sur les réseaux sociaux, donnant une meilleure visibilité à votre épisode.',
+        'message_warning_submit' => 'Publier quand même',
+    ],
+    'publish_date_edit_form' => [
+        'new_publication_date' => 'Nouvelle date de publication',
+        'new_publication_date_hint' => 'Doit être défini à une date antérieure.',
+        'submit' => 'Modifier la date de publication',
+    ],
+    'unpublish_form' => [
+        'disclaimer' =>
+            "Dépublier l'épisode supprimera tous les commentaires et messages qui lui sont associés et le retirera du flux RSS du podcast.",
+        'understand' => 'Je comprends, je veux dépublier l’épisode',
+        'submit' => 'Dépublier',
+    ],
+    'delete_form' => [
+        'disclaimer' =>
+            "La suppression de l'épisode supprimera tous les fichiers multimédia, les commentaires, les clips vidéo et les parties sonores qui y sont associés.",
+        'understand' => 'Je comprends, je veux supprimer l’épisode',
+        'submit' => 'Supprimer',
+    ],
+    'embed' => [
+        'title' => 'Lecteur intégré',
+        'label' =>
+            'Sélectionnez une couleur de thème, copiez le code dans le presse-papier, puis collez-le sur votre site internet.',
+        'clipboard_iframe' => 'Copier le code du lecteur intégré dans le presse papier',
+        'clipboard_url' => 'Copier l’adresse dans le presse papier',
+        'dark' => 'Sombre',
+        'dark-transparent' => 'Sombre transparent',
+        'light' => 'Clair',
+        'light-transparent' => 'Clair transparent',
+    ],
+];
diff --git a/modules/Admin/Language/fr2/EpisodeNavigation.php b/modules/Admin/Language/fr2/EpisodeNavigation.php
new file mode 100644
index 0000000000..2f7ff82908
--- /dev/null
+++ b/modules/Admin/Language/fr2/EpisodeNavigation.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'go_to_page' => 'Aller à la page de l’épisode',
+    'dashboard' => 'Tableau de bord de l’épisode',
+    'episode-view' => 'Accueil',
+    'episode-edit' => 'Modifier l’épisode',
+    'episode-persons-manage' => 'Gérer les intervenants',
+    'embed-add' => 'Lecteur intégré',
+    'clips' => 'Extraits',
+    'video-clips-list' => 'Extraits vidéo',
+    'video-clips-create' => 'Nouvel extrait vidéo',
+    'soundbites-list' => 'Extraits sonores',
+    'soundbites-create' => 'Nouvel extrait sonore',
+];
diff --git a/modules/Admin/Language/fr2/Fediverse.php b/modules/Admin/Language/fr2/Fediverse.php
new file mode 100644
index 0000000000..3e7a0b260f
--- /dev/null
+++ b/modules/Admin/Language/fr2/Fediverse.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'messages' => [
+        'actorNotFound' => 'L’utilisateur n’a pu être trouvé  !',
+        'blockActorSuccess' => '{actor} a été bloqué  !',
+        'unblockActorSuccess' => 'L’utilisateur a été débloqué  !',
+        'blockDomainSuccess' => '{domain} a été bloqué  !',
+        'unblockDomainSuccess' => '{domain} a été débloqué  !',
+    ],
+    'blocked_actors' => 'Utilisateurs bloqués',
+    'blocked_domains' => 'Domaines bloqués',
+    'block_lists_form' => [
+        'handle' => 'Identifiant',
+        'handle_hint' => 'Saisissez l’utilisateur @nom@domaine.',
+        'domain' => 'Nom de domaine',
+        'submit' => 'Bloquer !',
+    ],
+    'list' => [
+        'actor' => 'Utilisateur',
+        'domain' => 'Nom de domaine',
+        'unblock' => 'Débloquer',
+    ],
+];
diff --git a/modules/Admin/Language/fr2/Home.php b/modules/Admin/Language/fr2/Home.php
new file mode 100644
index 0000000000..0ec83396de
--- /dev/null
+++ b/modules/Admin/Language/fr2/Home.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'Tous les podcasts',
+    'no_podcast' => 'Aucun podcast trouvé',
+];
diff --git a/modules/Admin/Language/fr2/Install.php b/modules/Admin/Language/fr2/Install.php
new file mode 100644
index 0000000000..b7d6ea1bbd
--- /dev/null
+++ b/modules/Admin/Language/fr2/Install.php
@@ -0,0 +1,61 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'manual_config' => 'Configuration manuelle',
+    'manual_config_subtitle' =>
+        'Créez un fichier `.env` qui contient tous vos paramètres puis rafraîchissez la page pour continuer l’installation.',
+    'form' => [
+        'instance_config' => 'Paramètres de l’instance',
+        'hostname' => 'Nom d’hôte',
+        'media_base_url' => 'Adresse racine des médias',
+        'media_base_url_hint' =>
+            'Si vous utilisez un CDN et/ou un service de mesure d’audience externe, vous pouvez les définir ici.',
+        'admin_gateway' => 'Adresse d’administration',
+        'admin_gateway_hint' =>
+            'Chemin pour accéder à l’administration (par exemple https://example.com/cp-admin). Il est défini par défaut à cp-admin, nous vous recommandons de le changer par mesure de sécurité.',
+        'auth_gateway' => 'Adresse d’authentification',
+        'auth_gateway_hint' =>
+            'Le chemin des pages d’authentication (par exemple https://example.fr/cp-auth). Il est défini par défaut à cp-auth, nous vous recommandons de le changer par mesure de sécurité.',
+        'database_config' => 'Paramètres de la base de données',
+        'database_config_hint' =>
+            'Castopod doit se connecter à votre base de données MySQL (ou MariaDB). Si vous ne disposez pas de ces informations, merci de contacter l’administrateur du serveur.',
+        'db_hostname' => 'Nom d’hôte (ou IP) de la base de données',
+        'db_name' => 'Nom de la base de données',
+        'db_username' => 'Utilisateur de la base de données',
+        'db_password' => 'Mot de passe de la base de données',
+        'db_prefix' => 'Préfixe des tables',
+        'db_prefix_hint' =>
+            "Le préfixe des noms de tables de Castopod, laissez la valeur par défaut si vous ne savez pas de quoi il s’agit.",
+        'cache_config' => 'Paramètres du cache',
+        'cache_config_hint' =>
+            'Sélectionnez votre gestionnaire de cache préféré. Laissez la valeur par défaut si vous ne savez pas de quoi il s’agit.',
+        'cache_handler' => 'Gestionnaire de cache',
+        'cacheHandlerOptions' => [
+            'file' => 'Fichier',
+            'redis' => 'Redis',
+            'predis' => 'Predis',
+        ],
+        'next' => 'Suivant',
+        'submit' => 'Terminer l’installation',
+        'create_superadmin' => 'Create your superadmin account',
+        'email' => 'Email',
+        'username' => 'Username',
+        'password' => 'Password',
+    ],
+    'messages' => [
+        'createSuperAdminSuccess' =>
+            'Your superadmin account has been created successfully. Login to start podcasting!',
+        'databaseConnectError' =>
+            'Castopod could not connect to your database. Edit your database configuration and try again.',
+        'writeError' =>
+            "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.",
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/AboutCastopod.php b/modules/Admin/Language/fr_CA/AboutCastopod.php
new file mode 100644
index 0000000000..3fb62afffe
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/AboutCastopod.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'About Castopod',
+    'host_name' => 'Host name',
+    'version' => 'Castopod version',
+    'php_version' => 'PHP version',
+    'os' => 'Operating System',
+    'languages' => 'Languages',
+    'update_database' => 'Update database',
+    'messages' => [
+        'databaseUpdateSuccess' => 'Database is up to date!',
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/Breadcrumb.php b/modules/Admin/Language/fr_CA/Breadcrumb.php
new file mode 100644
index 0000000000..558b90f765
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Breadcrumb.php
@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'label' => 'breadcrumb',
+    config('Admin')
+        ->gateway => 'Home',
+    'podcasts' => 'podcasts',
+    'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
+    'contributors' => 'contributors',
+    'pages' => 'pages',
+    'settings' => 'settings',
+    'theme' => 'theme',
+    'about' => 'about',
+    'add' => 'add',
+    'new' => 'new',
+    'edit' => 'edit',
+    'persons' => 'persons',
+    'publish' => 'publish',
+    'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
+    'unpublish' => 'unpublish',
+    'delete' => 'delete',
+    'remove' => 'remove',
+    'fediverse' => 'fediverse',
+    'blocked-actors' => 'blocked actors',
+    'blocked-domains' => 'blocked domains',
+    'users' => 'users',
+    'my-account' => 'my account',
+    'change-password' => 'change password',
+    'import' => 'feed import',
+    'platforms' => 'platforms',
+    'social' => 'social networks',
+    'funding' => 'funding',
+    'analytics' => 'analytics',
+    'locations' => 'locations',
+    'webpages' => 'web pages',
+    'unique-listeners' => 'unique listeners',
+    'players' => 'players',
+    'listening-time' => 'listening time',
+    'time-periods' => 'time periods',
+    'soundbites' => 'soundbites',
+    'video-clips' => 'video clips',
+    'embed' => 'embeddable player',
+    'notifications' => 'notifications',
+    'suspend' => 'suspend',
+];
diff --git a/modules/Admin/Language/fr_CA/Charts.php b/modules/Admin/Language/fr_CA/Charts.php
new file mode 100644
index 0000000000..6ede251094
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Charts.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'by_service_weekly' => 'Episode downloads by service (for the past week)',
+    '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)',
+    'by_os_weekly' => 'Episode downloads by O.S. (for the past week)',
+    'podcast_by_region' => 'Episode downloads by region (for the past week)',
+    'unique_daily_listeners' => 'Daily unique listeners',
+    'unique_monthly_listeners' => 'Monthly unique listeners',
+    'by_browser' => 'Web pages usage by browser (for the past week)',
+    'podcast_by_day' => 'Episode daily downloads',
+    'podcast_by_month' => 'Episode monthly downloads',
+    'episode_by_day' => 'Episode daily downloads (first 60 days)',
+    'episode_by_month' => 'Episode monthly downloads',
+    'episodes_by_day' =>
+        '5 latest episodes downloads (during their first 60 days)',
+    'by_country_weekly' => 'Episode downloads by country (for the past week)',
+    'by_country_yearly' => 'Episode downloads by country (for the past year)',
+    'by_domain_weekly' => 'Web pages visits by source (for the past week)',
+    'by_domain_yearly' => 'Web pages visits by source (for the past year)',
+    'by_entry_page' => 'Web pages visits by landing page (for the past week)',
+    'podcast_bots' => 'Bots (crawlers)',
+    'daily_listening_time' => 'Daily cumulative listening time',
+    'monthly_listening_time' => 'Monthly cumulative listening time',
+    'by_weekday' => 'By week day (for the past 60 days)',
+    'by_hour' => 'By time of day (for the past 60 days)',
+    'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
+    'total_storage_by_month' => 'Monthly storage (in MB)',
+    'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
+];
diff --git a/modules/Admin/Language/fr_CA/Common.php b/modules/Admin/Language/fr_CA/Common.php
new file mode 100644
index 0000000000..596c8bcdec
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Common.php
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Yes',
+    'no' => 'No',
+    'cancel' => 'Cancel',
+    'optional' => 'Optional',
+    'more' => 'More',
+    'no_data' => 'No data found!',
+    'close' => 'Close',
+    'edit' => 'Edit',
+    'copy' => 'Copy',
+    'copied' => 'Copied!',
+    'home' => 'Home',
+    'explicit' => 'Explicit',
+    'powered_by' => 'Powered by {castopod}',
+    'actions' => 'Actions',
+    'pageInfo' => 'Page {currentPage} out of {pageCount}',
+    'go_back' => 'Go back',
+    'forms' => [
+        'editor' => [
+            'write' => 'Write',
+            'preview' => 'Preview',
+            'help' => 'Powered by markdown',
+        ],
+        'multiSelect' => [
+            'selectText' => 'Press to select',
+            'loadingText' => 'Loading…',
+            'noResultsText' => 'No results found',
+            'noChoicesText' => 'No choices to choose from',
+            'maxItemText' => 'Cannot add more items',
+        ],
+        'upload_file' => 'Upload a file',
+        'remote_url' => 'Remote URL',
+    ],
+    'play_episode_button' => [
+        'play' => 'Play',
+        'playing' => 'Playing',
+    ],
+    'size_limit' => 'Size limit: {0}.',
+    'choose_interact' => 'Choose how to interact',
+    'view' => 'View',
+];
diff --git a/modules/Admin/Language/fr_CA/Countries.php b/modules/Admin/Language/fr_CA/Countries.php
new file mode 100644
index 0000000000..4cd5d9c857
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Countries.php
@@ -0,0 +1,264 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * ISO 3166 country codes
+ *
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'AD' => 'Andorra',
+    'AE' => 'United Arab Emirates',
+    'AF' => 'Afghanistan',
+    'AG' => 'Antigua and Barbuda',
+    'AI' => 'Anguilla',
+    'AL' => 'Albania',
+    'AM' => 'Armenia',
+    'AO' => 'Angola',
+    'AQ' => 'Antarctica',
+    'AR' => 'Argentina',
+    'AS' => 'American Samoa',
+    'AT' => 'Austria',
+    'AU' => 'Australia',
+    'AW' => 'Aruba',
+    'AX' => 'Åland Islands',
+    'AZ' => 'Azerbaijan',
+    'BA' => 'Bosnia and Herzegovina',
+    'BB' => 'Barbados',
+    'BD' => 'Bangladesh',
+    'BE' => 'Belgium',
+    'BF' => 'Burkina Faso',
+    'BG' => 'Bulgaria',
+    'BH' => 'Bahrain',
+    'BI' => 'Burundi',
+    'BJ' => 'Benin',
+    'BL' => 'Saint Barthélemy',
+    'BM' => 'Bermuda',
+    'BN' => 'Brunei Darussalam',
+    'BO' => 'Bolivia, Plurinational State of',
+    'BQ' => 'Bonaire, Sint Eustatius and Saba',
+    'BR' => 'Brazil',
+    'BS' => 'Bahamas',
+    'BT' => 'Bhutan',
+    'BV' => 'Bouvet Island',
+    'BW' => 'Botswana',
+    'BY' => 'Belarus',
+    'BZ' => 'Belize',
+    'CA' => 'Canada',
+    'CC' => 'Cocos (Keeling) Islands',
+    'CD' => 'Congo, the Democratic Republic of the',
+    'CF' => 'Central African Republic',
+    'CG' => 'Congo',
+    'CH' => 'Switzerland',
+    'CI' => "Côte d'Ivoire",
+    'CK' => 'Cook Islands',
+    'CL' => 'Chile',
+    'CM' => 'Cameroon',
+    'CN' => 'China',
+    'CO' => 'Colombia',
+    'CR' => 'Costa Rica',
+    'CU' => 'Cuba',
+    'CV' => 'Cape Verde',
+    'CW' => 'Curaçao',
+    'CX' => 'Christmas Island',
+    'CY' => 'Cyprus',
+    'CZ' => 'Czech Republic',
+    'DE' => 'Germany',
+    'DJ' => 'Djibouti',
+    'DK' => 'Denmark',
+    'DM' => 'Dominica',
+    'DO' => 'Dominican Republic',
+    'DZ' => 'Algeria',
+    'EC' => 'Ecuador',
+    'EE' => 'Estonia',
+    'EG' => 'Egypt',
+    'EH' => 'Western Sahara',
+    'ER' => 'Eritrea',
+    'ES' => 'Spain',
+    'ET' => 'Ethiopia',
+    'FI' => 'Finland',
+    'FJ' => 'Fiji',
+    'FK' => 'Falkland Islands (Malvinas)',
+    'FM' => 'Micronesia, Federated States of',
+    'FO' => 'Faroe Islands',
+    'FR' => 'France',
+    'GA' => 'Gabon',
+    'GB' => 'United Kingdom',
+    'GD' => 'Grenada',
+    'GE' => 'Georgia',
+    'GF' => 'French Guiana',
+    'GG' => 'Guernsey',
+    'GH' => 'Ghana',
+    'GI' => 'Gibraltar',
+    'GL' => 'Greenland',
+    'GM' => 'Gambia',
+    'GN' => 'Guinea',
+    'GP' => 'Guadeloupe',
+    'GQ' => 'Equatorial Guinea',
+    'GR' => 'Greece',
+    'GS' => 'South Georgia and the South Sandwich Islands',
+    'GT' => 'Guatemala',
+    'GU' => 'Guam',
+    'GW' => 'Guinea-Bissau',
+    'GY' => 'Guyana',
+    'HK' => 'Hong Kong',
+    'HM' => 'Heard Island and McDonald Islands',
+    'HN' => 'Honduras',
+    'HR' => 'Croatia',
+    'HT' => 'Haiti',
+    'HU' => 'Hungary',
+    'ID' => 'Indonesia',
+    'IE' => 'Ireland',
+    'IL' => 'Israel',
+    'IM' => 'Isle of Man',
+    'IN' => 'India',
+    'IO' => 'British Indian Ocean Territory',
+    'IQ' => 'Iraq',
+    'IR' => 'Iran, Islamic Republic of',
+    'IS' => 'Iceland',
+    'IT' => 'Italy',
+    'JE' => 'Jersey',
+    'JM' => 'Jamaica',
+    'JO' => 'Jordan',
+    'JP' => 'Japan',
+    'KE' => 'Kenya',
+    'KG' => 'Kyrgyzstan',
+    'KH' => 'Cambodia',
+    'KI' => 'Kiribati',
+    'KM' => 'Comoros',
+    'KN' => 'Saint Kitts and Nevis',
+    'KP' => "Korea, Democratic People's Republic of",
+    'KR' => 'Korea, Republic of',
+    'KW' => 'Kuwait',
+    'KY' => 'Cayman Islands',
+    'KZ' => 'Kazakhstan',
+    'LA' => "Lao People's Democratic Republic",
+    'LB' => 'Lebanon',
+    'LC' => 'Saint Lucia',
+    'LI' => 'Liechtenstein',
+    'LK' => 'Sri Lanka',
+    'LR' => 'Liberia',
+    'LS' => 'Lesotho',
+    'LT' => 'Lithuania',
+    'LU' => 'Luxembourg',
+    'LV' => 'Latvia',
+    'LY' => 'Libya',
+    'MA' => 'Morocco',
+    'MC' => 'Monaco',
+    'MD' => 'Moldova, Republic of',
+    'ME' => 'Montenegro',
+    'MF' => 'Saint Martin (French part)',
+    'MG' => 'Madagascar',
+    'MH' => 'Marshall Islands',
+    'MK' => 'Macedonia, the Former Yugoslav Republic of',
+    'ML' => 'Mali',
+    'MM' => 'Myanmar',
+    'MN' => 'Mongolia',
+    'MO' => 'Macao',
+    'MP' => 'Northern Mariana Islands',
+    'MQ' => 'Martinique',
+    'MR' => 'Mauritania',
+    'MS' => 'Montserrat',
+    'MT' => 'Malta',
+    'MU' => 'Mauritius',
+    'MV' => 'Maldives',
+    'MW' => 'Malawi',
+    'MX' => 'Mexico',
+    'MY' => 'Malaysia',
+    'MZ' => 'Mozambique',
+    'N/A' => 'Not Applicable (local IP…)',
+    'NA' => 'Namibia',
+    'NC' => 'New Caledonia',
+    'NE' => 'Niger',
+    'NF' => 'Norfolk Island',
+    'NG' => 'Nigeria',
+    'NI' => 'Nicaragua',
+    'NL' => 'Netherlands',
+    'NO' => 'Norway',
+    'NP' => 'Nepal',
+    'NR' => 'Nauru',
+    'NU' => 'Niue',
+    'NZ' => 'New Zealand',
+    'OM' => 'Oman',
+    'PA' => 'Panama',
+    'PE' => 'Peru',
+    'PF' => 'French Polynesia',
+    'PG' => 'Papua New Guinea',
+    'PH' => 'Philippines',
+    'PK' => 'Pakistan',
+    'PL' => 'Poland',
+    'PM' => 'Saint Pierre and Miquelon',
+    'PN' => 'Pitcairn',
+    'PR' => 'Puerto Rico',
+    'PS' => 'Palestine, State of',
+    'PT' => 'Portugal',
+    'PW' => 'Palau',
+    'PY' => 'Paraguay',
+    'QA' => 'Qatar',
+    'RE' => 'Réunion',
+    'RO' => 'Romania',
+    'RS' => 'Serbia',
+    'RU' => 'Russian Federation',
+    'RW' => 'Rwanda',
+    'SA' => 'Saudi Arabia',
+    'SB' => 'Solomon Islands',
+    'SC' => 'Seychelles',
+    'SD' => 'Sudan',
+    'SE' => 'Sweden',
+    'SG' => 'Singapore',
+    'SH' => 'Saint Helena, Ascension and Tristan da Cunha',
+    'SI' => 'Slovenia',
+    'SJ' => 'Svalbard and Jan Mayen',
+    'SK' => 'Slovakia',
+    'SL' => 'Sierra Leone',
+    'SM' => 'San Marino',
+    'SN' => 'Senegal',
+    'SO' => 'Somalia',
+    'SR' => 'Suriname',
+    'SS' => 'South Sudan',
+    'ST' => 'Sao Tome and Principe',
+    'SV' => 'El Salvador',
+    'SX' => 'Sint Maarten (Dutch part)',
+    'SY' => 'Syrian Arab Republic',
+    'SZ' => 'Swaziland',
+    'TC' => 'Turks and Caicos Islands',
+    'TD' => 'Chad',
+    'TF' => 'French Southern Territories',
+    'TG' => 'Togo',
+    'TH' => 'Thailand',
+    'TJ' => 'Tajikistan',
+    'TK' => 'Tokelau',
+    'TL' => 'Timor-Leste',
+    'TM' => 'Turkmenistan',
+    'TN' => 'Tunisia',
+    'TO' => 'Tonga',
+    'TR' => 'Turkey',
+    'TT' => 'Trinidad and Tobago',
+    'TV' => 'Tuvalu',
+    'TW' => 'Taiwan, Province of China',
+    'TZ' => 'Tanzania, United Republic of',
+    'UA' => 'Ukraine',
+    'UG' => 'Uganda',
+    'UM' => 'United States Minor Outlying Islands',
+    'US' => 'United States',
+    'UY' => 'Uruguay',
+    'UZ' => 'Uzbekistan',
+    'VA' => 'Holy See (Vatican City State)',
+    'VC' => 'Saint Vincent and the Grenadines',
+    'VE' => 'Venezuela, Bolivarian Republic of',
+    'VG' => 'Virgin Islands, British',
+    'VI' => 'Virgin Islands, U.S.',
+    'VN' => 'Viet Nam',
+    'VU' => 'Vanuatu',
+    'WF' => 'Wallis and Futuna',
+    'WS' => 'Samoa',
+    'YE' => 'Yemen',
+    'YT' => 'Mayotte',
+    'ZA' => 'South Africa',
+    'ZM' => 'Zambia',
+    'ZW' => 'Zimbabwe',
+];
diff --git a/modules/Admin/Language/fr_CA/Dashboard.php b/modules/Admin/Language/fr_CA/Dashboard.php
new file mode 100644
index 0000000000..881073fd26
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Dashboard.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
+    'podcasts' => [
+        'title' => 'Podcasts',
+        'not_found' => 'No published podcast',
+        'last_published' => 'Last published on {lastPublicationDate}',
+    ],
+    'episodes' => [
+        'title' => 'Episodes',
+        'not_found' => 'No published episode',
+        'last_published' => 'Last published on {lastPublicationDate}',
+    ],
+    'storage' => [
+        'title' => 'Storage',
+        'subtitle' => '{totalUploaded} out of {totalStorage}',
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/Episode.php b/modules/Admin/Language/fr_CA/Episode.php
new file mode 100644
index 0000000000..98498bee21
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Episode.php
@@ -0,0 +1,214 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Season {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Episode {episodeNumber}',
+    'number_abbr' => 'Ep. {episodeNumber}',
+    'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
+    'number_of_comments' => '{numberOfComments, plural,
+        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',
+    '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',
+    'create' => 'Add an episode',
+    'publication_status' => [
+        'published' => 'Published',
+        'with_podcast' => 'Published',
+        'scheduled' => 'Scheduled',
+        'not_published' => 'Not published',
+    ],
+    'with_podcast_hint' => 'To be published at the same time as the podcast',
+    'list' => [
+        'search' => [
+            'placeholder' => 'Search for an episode',
+            'clear' => 'Clear search',
+            'submit' => 'Search',
+        ],
+        'number_of_episodes' => '{numberOfEpisodes, plural,
+            one {# episode}
+            other {# episodes}
+        }',
+        'episode' => 'Episode',
+        'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
+        'comments' => 'Comments',
+        'actions' => 'Actions',
+    ],
+    'messages' => [
+        'createSuccess' => 'Episode has been successfully created!',
+        'editSuccess' => 'Episode has been successfully updated!',
+        'publishSuccess' => '{publication_status, select,
+            published {Episode successfully published!}
+            scheduled {Episode publication successfully scheduled!}
+            with_podcast {This episode will be published at the same time as the podcast.}
+            other {This episode is not published.}
+        }',
+        'publishCancelSuccess' => 'Episode publication successfully cancelled!',
+        'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.',
+        'scheduleDateError' => 'Schedule date must be set!',
+        'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.',
+        'deleteSuccess' => 'Episode successfully deleted!',
+        'deleteError' => 'Failed to delete episode {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        }.',
+        'deleteFileError' => 'Failed to delete {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        } file {file_path}. You may manually remove it from your disk.',
+        'sameSlugError' => 'An episode with the chosen slug already exists.',
+    ],
+    'form' => [
+        'file_size_error' =>
+            'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.',
+        'audio_file' => 'Audio file',
+        'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.',
+        'info_section_title' => 'Episode info',
+        'cover' => 'Episode cover',
+        'cover_hint' =>
+            'If you do not set a cover, the podcast cover will be used instead.',
+        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'title' => 'Title',
+        'title_hint' =>
+            'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.',
+        'permalink' => 'Permalink',
+        'season_number' => 'Season',
+        'episode_number' => 'Episode',
+        'type' => [
+            'label' => 'Type',
+            'full' => 'Full',
+            'full_hint' => 'Complete content (the episode)',
+            'trailer' => 'Trailer',
+            'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show',
+            '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?',
+            'undefined' => 'undefined',
+            'clean' => 'Clean',
+            'explicit' => 'Explicit',
+        ],
+        'show_notes_section_title' => 'Show notes',
+        'show_notes_section_subtitle' =>
+            'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
+        'description' => 'Description',
+        'description_footer' => 'Description footer',
+        'description_footer_hint' =>
+            'This text is added at the end of each episode description, it is a good place to input your social links for example.',
+        'additional_files_section_title' => 'Additional files',
+        'additional_files_section_subtitle' =>
+            'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this episode about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real or fictional location',
+        'transcript' => 'Transcript (subtitles / closed captions)',
+        'transcript_hint' => 'Only .srt are allowed.',
+        'transcript_download' => 'Download transcript',
+        'transcript_file' => 'Transcript file (.srt)',
+        'transcript_remote_url' => 'Remote url for transcript',
+        'transcript_file_delete' => 'Delete transcript file',
+        'chapters' => 'Chapters',
+        'chapters_hint' => 'File must be in JSON Chapters format.',
+        'chapters_download' => 'Download chapters',
+        'chapters_file' => 'Chapters file',
+        'chapters_remote_url' => 'Remote url for chapters file',
+        'chapters_file_delete' => 'Delete chapters file',
+        'advanced_section_title' => 'Advanced Parameters',
+        'advanced_section_subtitle' =>
+            'If you need RSS tags that Castopod does not handle, set them here.',
+        'custom_rss' => 'Custom RSS tags for the episode',
+        'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.',
+        'block' => 'Episode should be hidden from public catalogues',
+        'block_hint' =>
+            'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
+        'submit_create' => 'Create episode',
+        'submit_edit' => 'Save episode',
+    ],
+    'publish_form' => [
+        'back_to_episode_dashboard' => 'Back to episode dashboard',
+        'post' => 'Your announcement post',
+        'post_hint' =>
+            "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.",
+        'message_placeholder' => 'Write your message…',
+        'publication_date' => 'Publication date',
+        'publication_method' => [
+            'now' => 'Now',
+            'schedule' => 'Schedule',
+            'with_podcast' => 'Publish alongside podcast',
+        ],
+        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date_clear' => 'Clear publication date',
+        'scheduled_publication_date_hint' =>
+            'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
+        'submit' => 'Publish',
+        'submit_edit' => 'Edit publication',
+        'cancel_publication' => 'Cancel publication',
+        'message_warning' => 'You did not write a message for your announcement post!',
+        '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.",
+        'understand' => 'I understand, I want to unpublish the episode',
+        'submit' => 'Unpublish',
+    ],
+    'delete_form' => [
+        'disclaimer' =>
+            "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.",
+        'understand' => 'I understand, I want to delete the episode',
+        'submit' => 'Delete',
+    ],
+    'embed' => [
+        'title' => 'Embeddable player',
+        'label' =>
+            'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.',
+        'clipboard_iframe' => 'Copy embeddable player to clipboard',
+        'clipboard_url' => 'Copy address to clipboard',
+        'dark' => 'Dark',
+        'dark-transparent' => 'Dark transparent',
+        'light' => 'Light',
+        'light-transparent' => 'Light transparent',
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/EpisodeNavigation.php b/modules/Admin/Language/fr_CA/EpisodeNavigation.php
new file mode 100644
index 0000000000..1406e3010e
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/EpisodeNavigation.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'go_to_page' => 'View episode page',
+    'dashboard' => 'Episode dashboard',
+    'episode-view' => 'Home',
+    'episode-edit' => 'Edit episode',
+    'episode-persons-manage' => 'Manage persons',
+    'embed-add' => 'Embeddable player',
+    'clips' => 'Clips',
+    'video-clips-list' => 'Video clips',
+    'video-clips-create' => 'New video clip',
+    'soundbites-list' => 'Soundbites',
+    'soundbites-create' => 'New soundbite',
+];
diff --git a/modules/Admin/Language/fr_CA/Fediverse.php b/modules/Admin/Language/fr_CA/Fediverse.php
new file mode 100644
index 0000000000..0e4ca66d89
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Fediverse.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'messages' => [
+        'actorNotFound' => 'The account could not be found!',
+        'blockActorSuccess' => '{actor} has been blocked!',
+        'unblockActorSuccess' => 'Actor has been unblocked!',
+        'blockDomainSuccess' => '{domain} has been blocked!',
+        'unblockDomainSuccess' => '{domain} has been unblocked!',
+    ],
+    'blocked_actors' => 'Blocked accounts',
+    'blocked_domains' => 'Blocked domains',
+    'block_lists_form' => [
+        'handle' => 'Account handle',
+        'handle_hint' => 'Input @username@domain account.',
+        'domain' => 'Domain name',
+        'submit' => 'Block!',
+    ],
+    'list' => [
+        'actor' => 'Account',
+        'domain' => 'Domain name',
+        'unblock' => 'Unblock',
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/Home.php b/modules/Admin/Language/fr_CA/Home.php
new file mode 100644
index 0000000000..3ff4c04dc8
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Home.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'no_podcast' => 'No podcast found',
+];
diff --git a/modules/Admin/Language/fr_CA/Install.php b/modules/Admin/Language/fr_CA/Install.php
new file mode 100644
index 0000000000..36e373a285
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Install.php
@@ -0,0 +1,61 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'manual_config' => 'Manual configuration',
+    'manual_config_subtitle' =>
+        'Create a `.env` file with your settings and refresh the page to continue installation.',
+    'form' => [
+        'instance_config' => 'Instance configuration',
+        'hostname' => 'Hostname',
+        'media_base_url' => 'Media base URL',
+        'media_base_url_hint' =>
+            'If you use a CDN and/or an external analytics service, you may set them here.',
+        'admin_gateway' => 'Admin gateway',
+        'admin_gateway_hint' =>
+            'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.',
+        'auth_gateway' => 'Auth gateway',
+        'auth_gateway_hint' =>
+            'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.',
+        'database_config' => 'Database configuration',
+        'database_config_hint' =>
+            'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.',
+        'db_hostname' => 'Database hostname',
+        'db_name' => 'Database name',
+        'db_username' => 'Database username',
+        'db_password' => 'Database password',
+        'db_prefix' => 'Database prefix',
+        'db_prefix_hint' =>
+            "The prefix of the Castopod table names, leave as is if you don't know what it means.",
+        'cache_config' => 'Cache configuration',
+        'cache_config_hint' =>
+            'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.',
+        'cache_handler' => 'Cache handler',
+        'cacheHandlerOptions' => [
+            'file' => 'File',
+            'redis' => 'Redis',
+            'predis' => 'Predis',
+        ],
+        'next' => 'Next',
+        'submit' => 'Finish install',
+        'create_superadmin' => 'Create your superadmin account',
+        'email' => 'Email',
+        'username' => 'Username',
+        'password' => 'Password',
+    ],
+    'messages' => [
+        'createSuperAdminSuccess' =>
+            'Your superadmin account has been created successfully. Login to start podcasting!',
+        'databaseConnectError' =>
+            'Castopod could not connect to your database. Edit your database configuration and try again.',
+        'writeError' =>
+            "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.",
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/Navigation.php b/modules/Admin/Language/fr_CA/Navigation.php
new file mode 100644
index 0000000000..610f14345d
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Navigation.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'toggle_sidebar' => 'Toggle sidebar',
+    'go_to_website' => 'Go to website',
+    'go_to_admin' => 'Go to admin',
+    'dashboard' => 'Dashboard',
+    'admin' => 'Home',
+    'podcasts' => 'Podcasts',
+    'podcast-list' => 'All podcasts',
+    'podcast-create' => 'New podcast',
+    'podcast-import' => 'Import a podcast',
+    'persons' => 'Persons',
+    'person-list' => 'All persons',
+    'person-create' => 'New person',
+    'fediverse' => 'Fediverse',
+    'fediverse-blocked-actors' => 'Blocked accounts',
+    'fediverse-blocked-domains' => 'Blocked domains',
+    'users' => 'Users',
+    'user-list' => 'All users',
+    'user-create' => 'New user',
+    'pages' => 'Pages',
+    'page-list' => 'All pages',
+    'page-create' => 'New Page',
+    'settings' => 'Settings',
+    'settings-general' => 'General',
+    'settings-theme' => 'Theme',
+    'about' => 'About',
+    'account' => [
+        'my-account' => 'My account',
+        'change-password' => 'Change password',
+        'logout' => 'Logout',
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/Notifications.php b/modules/Admin/Language/fr_CA/Notifications.php
new file mode 100644
index 0000000000..2b139d5181
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Notifications.php
@@ -0,0 +1,19 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Notifications',
+    'reply' => '{actor_username} replied to your post',
+    'favourite' => '{actor_username} favourited your post',
+    'reblog' => '{actor_username} shared your post',
+    'follow' => '{actor_username} started following you',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/fr_CA/Page.php b/modules/Admin/Language/fr_CA/Page.php
new file mode 100644
index 0000000000..b6f49de574
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Page.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'back_to_home' => 'Back to home',
+    'page' => 'Page',
+    'all_pages' => 'All pages',
+    'create' => 'New page',
+    'go_to_page' => 'Go to page',
+    'edit' => 'Edit page',
+    'delete' => 'Delete page',
+    'form' => [
+        'title' => 'Title',
+        'permalink' => 'Permalink',
+        'content' => 'Content',
+        'submit_create' => 'Create page',
+        'submit_edit' => 'Save',
+    ],
+    'messages' => [
+        'createSuccess' => 'The page “{pageTitle}” was created successfully!',
+        'editSuccess' => 'The page was successfully updated!',
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/Pager.php b/modules/Admin/Language/fr_CA/Pager.php
new file mode 100644
index 0000000000..e25ee63810
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Pager.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'pageNavigation' => 'Page navigation',
+    'first' => 'First',
+    'previous' => 'Previous',
+    'next' => 'Next',
+    'last' => 'Last',
+    'older' => 'Older',
+    'newer' => 'Newer',
+    'invalidTemplate' => '{0} is not a valid Pager template.',
+    'invalidPaginationGroup' => '{0} is not a valid Pagination group.',
+];
diff --git a/modules/Admin/Language/fr_CA/Person.php b/modules/Admin/Language/fr_CA/Person.php
new file mode 100644
index 0000000000..a652be9fda
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Person.php
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'persons' => 'Persons',
+    'all_persons' => 'All persons',
+    'no_person' => 'Nobody found!',
+    'create' => 'Create a person',
+    'view' => 'View person',
+    'edit' => 'Edit person',
+    'delete' => 'Delete person',
+    'messages' => [
+        'createSuccess' => 'Person has been successfully created!',
+        'editSuccess' => 'Person has been successfully updated!',
+        'deleteSuccess' => 'Person has been removed!',
+    ],
+    'form' => [
+        'avatar' => 'Avatar',
+        'avatar_size_hint' =>
+            'Avatar must be squared and at least 400px wide and tall.',
+        'full_name' => 'Full name',
+        'full_name_hint' => 'This is the full name or alias of the person.',
+        'unique_name' => 'Unique name',
+        'unique_name_hint' => 'Used for URLs',
+        'information_url' => 'Information URL',
+        'information_url_hint' =>
+            'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.',
+        'submit_create' => 'Create person',
+        'submit_edit' => 'Save person',
+    ],
+    'podcast_form' => [
+        'title' => 'Manage persons',
+        'add_section_title' => 'Add persons to this podcast',
+        'add_section_subtitle' => 'You may pick several persons and roles.',
+        'persons' => 'Persons',
+        'persons_hint' =>
+            'You may select one or several persons with the same roles. You need to create the persons first.',
+        'roles' => 'Roles',
+        'roles_hint' =>
+            'You may select none, one or several roles for a person.',
+        'submit_add' => 'Add person(s)',
+        'remove' => 'Remove',
+    ],
+    'episode_form' => [
+        'title' => 'Manage persons',
+        'add_section_title' => 'Add persons to this episode',
+        'add_section_subtitle' => 'You may pick several persons and roles.',
+        'persons' => 'Persons',
+        'persons_hint' =>
+            'You may select one or several persons with the same roles. You need to create the persons first.',
+        'roles' => 'Roles',
+        'roles_hint' =>
+            'You may select none, one or several roles for a person.',
+        'submit_add' => 'Add person(s)',
+        'remove' => 'Remove',
+    ],
+    'credits' => 'Credits',
+];
diff --git a/modules/Admin/Language/fr_CA/Platforms.php b/modules/Admin/Language/fr_CA/Platforms.php
new file mode 100644
index 0000000000..ab17d5999b
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Platforms.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Platforms',
+    'home_url' => 'Go to {platformName} website',
+    'submit_url' => 'Submit your podcast on {platformName}',
+    'visible' => 'Display in podcast homepage?',
+    'on_embed' => 'Display on embeddable player?',
+    'remove' => 'Remove {platformName}',
+    'submit' => 'Save',
+    'messages' => [
+        'updateSuccess' => 'Platform links have been successfully updated!',
+        'removeLinkSuccess' => 'The platform link has been removed.',
+        'removeLinkError' =>
+            'The platform link could not be removed. Try again.',
+    ],
+    'description' => [
+        'podcasting' => 'The podcast ID on this platform',
+        'social' => 'The podcast account ID on this platform',
+        'funding' => 'Call to action message',
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/Podcast.php b/modules/Admin/Language/fr_CA/Podcast.php
new file mode 100644
index 0000000000..2d46aff531
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Podcast.php
@@ -0,0 +1,314 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'no_podcast' => 'No podcast found!',
+    'create' => 'Create podcast',
+    'import' => 'Import podcast',
+    'new_episode' => 'New Episode',
+    'view' => 'View podcast',
+    'edit' => 'Edit podcast',
+    'publish' => 'Publish podcast',
+    'publish_edit' => 'Edit publication',
+    'delete' => 'Delete podcast',
+    'see_episodes' => 'See episodes',
+    'see_contributors' => 'See contributors',
+    'go_to_page' => 'Go to page',
+    'latest_episodes' => 'Latest episodes',
+    'see_all_episodes' => 'See all episodes',
+    'draft' => 'Draft',
+    'messages' => [
+        'createSuccess' => 'Podcast successfully created!',
+        'editSuccess' => 'Podcast has been successfully updated!',
+        'importSuccess' => 'Podcast has been successfully imported!',
+        'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!',
+        'deletePodcastMediaError' => 'Failed to delete podcast {type, select,
+            cover {cover}
+            banner {banner}
+            other {media}
+        }.',
+        'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        }.',
+        'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.',
+        'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural,
+            one {# episode was}
+            other {# episodes were}
+        } added to the podcast!',
+        'podcastFeedUpToDate' => 'Podcast is already up to date.',
+        'podcastNotImported' => 'Podcast could not be updated as it was not imported.',
+        'publishError' => 'This podcast is either already published or scheduled for publication.',
+        'publishEditError' => 'This podcast is not scheduled for publication.',
+        'publishCancelSuccess' => 'Podcast publication successfully cancelled!',
+        'scheduleDateError' => 'Schedule date must be set!',
+    ],
+    'form' => [
+        'identity_section_title' => 'Podcast identity',
+        'identity_section_subtitle' => 'These fields allow you to get noticed.',
+        'cover' => 'Podcast cover',
+        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'banner' => 'Podcast banner',
+        'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
+        'banner_delete' => 'Delete podcast banner',
+        'title' => 'Title',
+        'handle' => 'Handle',
+        'handle_hint' =>
+            'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.',
+        'type' => [
+            'label' => 'Type',
+            'episodic' => 'Episodic',
+            'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.',
+            'serial' => 'Serial',
+            'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.',
+        ],
+        'description' => 'Description',
+        'classification_section_title' => 'Classification',
+        'classification_section_subtitle' =>
+            'These fields will impact your audience and competition.',
+        'language' => 'Language',
+        'category' => 'Category',
+        'category_placeholder' => 'Select a category…',
+        'other_categories' => 'Other categories',
+        'parental_advisory' => [
+            'label' => 'Parental advisory',
+            'hint' => 'Does it contain explicit content?',
+            'undefined' => 'undefined',
+            'clean' => 'Clean',
+            'explicit' => 'Explicit',
+        ],
+        'author_section_title' => 'Author',
+        'author_section_subtitle' => 'Who is managing the podcast?',
+        'owner_name' => 'Owner name',
+        'owner_name_hint' =>
+            'For administrative use only. Visible in the public RSS feed.',
+        'owner_email' => 'Owner email',
+        'owner_email_hint' =>
+            'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.',
+        'publisher' => 'Publisher',
+        'publisher_hint' =>
+            'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.',
+        'copyright' => 'Copyright',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this podcast about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real place or fictional',
+        '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.',
+        'op3' => 'Open Podcast Prefix Project (OP3)',
+        'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.',
+        'op3_enable' => 'Enable OP3 analytics service',
+        'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.',
+        'payment_pointer' => 'Payment Pointer for Web Monetization',
+        'payment_pointer_hint' =>
+            'This is your where you will receive money thanks to Web Monetization',
+        'advanced_section_title' => 'Advanced Parameters',
+        'advanced_section_subtitle' =>
+            'If you need RSS tags that Castopod does not handle, set them here.',
+        'custom_rss' => 'Custom RSS tags for the podcast',
+        'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.',
+        'new_feed_url' => 'New feed URL',
+        'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.',
+        'old_feed_url' => 'Old feed URL',
+        'update_feed' => 'Update feed',
+        'update_feed_tip' => 'Import this podcast\'s latest episodes',
+        'partnership' => 'Partnership',
+        'partner_id' => 'ID',
+        'partner_link_url' => 'Link URL',
+        'partner_image_url' => 'Image URL',
+        'partner_id_hint' => 'Your own partner ID',
+        'partner_link_url_hint' => 'The generic partner link address',
+        'partner_image_url_hint' => 'The generic partner image address',
+        'status_section_title' => 'Status',
+        'block' => 'Podcast should be hidden from public catalogues',
+        'block_hint' =>
+            'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
+        'complete' => 'Podcast will not be having new episodes',
+        'lock' => 'Prevent podcast from being copied',
+        'lock_hint' =>
+            'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.',
+        'submit_create' => 'Create podcast',
+        'submit_edit' => 'Save podcast',
+    ],
+    'category_options' => [
+        'uncategorized' => 'uncategorized',
+        'arts' => 'Arts',
+        'business' => 'Business',
+        'comedy' => 'Comedy',
+        'education' => 'Education',
+        'fiction' => 'Fiction',
+        'government' => 'Government',
+        'health_and_fitness' => 'Health &amp Fitness',
+        'history' => 'History',
+        'kids_and_family' => 'Kids &amp Family',
+        'leisure' => 'Leisure',
+        'music' => 'Music',
+        'news' => 'News',
+        'religion_and_spirituality' => 'Religion &amp Spirituality',
+        'science' => 'Science',
+        'society_and_culture' => 'Society &amp Culture',
+        'sports' => 'Sports',
+        'technology' => 'Technology',
+        'true_crime' => 'True Crime',
+        'tv_and_film' => 'TV &amp Film',
+        'books' => 'Books',
+        'design' => 'Design',
+        'fashion_and_beauty' => 'Fashion &amp Beauty',
+        'food' => 'Food',
+        'performing_arts' => 'Performing Arts',
+        'visual_arts' => 'Visual Arts',
+        'careers' => 'Careers',
+        'entrepreneurship' => 'Entrepreneurship',
+        'investing' => 'Investing',
+        'management' => 'Management',
+        'marketing' => 'Marketing',
+        'non_profit' => 'Non-Profit',
+        'comedy_interviews' => 'Comedy Interviews',
+        'improv' => 'Improv',
+        'stand_up' => 'Stand-Up',
+        'courses' => 'Courses',
+        'how_to' => 'How To',
+        'language_learning' => 'Language Learning',
+        'self_improvement' => 'Self-Improvement',
+        'comedy_fiction' => 'Comedy Fiction',
+        'drama' => 'Drama',
+        'science_fiction' => 'Science Fiction',
+        'alternative_health' => 'Alternative Health',
+        'fitness' => 'Fitness',
+        'medicine' => 'Medicine',
+        'mental_health' => 'Mental Health',
+        'nutrition' => 'Nutrition',
+        'sexuality' => 'Sexuality',
+        'education_for_kids' => 'Education for Kids',
+        'parenting' => 'Parenting',
+        'pets_and_animals' => 'Pets &amp Animals',
+        'stories_for_kids' => 'Stories for Kids',
+        'animation_and_manga' => 'Animation &amp Manga',
+        'automotive' => 'Automotive',
+        'aviation' => 'Aviation',
+        'crafts' => 'Crafts',
+        'games' => 'Games',
+        'hobbies' => 'Hobbies',
+        'home_and_garden' => 'Home &amp Garden',
+        'video_games' => 'Video Games',
+        'music_commentary' => 'Music Commentary',
+        'music_history' => 'Music History',
+        'music_interviews' => 'Music Interviews',
+        'business_news' => 'Business News',
+        'daily_news' => 'Daily News',
+        'entertainment_news' => 'Entertainment News',
+        'news_commentary' => 'News Commentary',
+        'politics' => 'Politics',
+        'sports_news' => 'Sports News',
+        'tech_news' => 'Tech News',
+        'buddhism' => 'Buddhism',
+        'christianity' => 'Christianity',
+        'hinduism' => 'Hinduism',
+        'islam' => 'Islam',
+        'judaism' => 'Judaism',
+        'religion' => 'Religion',
+        'spirituality' => 'Spirituality',
+        'astronomy' => 'Astronomy',
+        'chemistry' => 'Chemistry',
+        'earth_sciences' => 'Earth Sciences',
+        'life_sciences' => 'Life Sciences',
+        'mathematics' => 'Mathematics',
+        'natural_sciences' => 'Natural Sciences',
+        'nature' => 'Nature',
+        'physics' => 'Physics',
+        'social_sciences' => 'Social Sciences',
+        'documentary' => 'Documentary',
+        'personal_journals' => 'Personal Journals',
+        'philosophy' => 'Philosophy',
+        'places_and_travel' => 'Places &amp Travel',
+        'relationships' => 'Relationships',
+        'baseball' => 'Baseball',
+        'basketball' => 'Basketball',
+        'cricket' => 'Cricket',
+        'fantasy_sports' => 'Fantasy Sports',
+        'football' => 'Football',
+        'golf' => 'Golf',
+        'hockey' => 'Hockey',
+        'rugby' => 'Rugby',
+        'running' => 'Running',
+        'soccer' => 'Soccer',
+        'swimming' => 'Swimming',
+        'tennis' => 'Tennis',
+        'volleyball' => 'Volleyball',
+        'wilderness' => 'Wilderness',
+        'wrestling' => 'Wrestling',
+        'after_shows' => 'After Shows',
+        'film_history' => 'Film History',
+        'film_interviews' => 'Film Interviews',
+        'film_reviews' => 'Film Reviews',
+        'tv_reviews' => 'TV Reviews',
+    ],
+    'publish_form' => [
+        'back_to_podcast_dashboard' => 'Back to podcast dashboard',
+        'post' => 'Your announcement post',
+        'post_hint' =>
+            "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.",
+        'message_placeholder' => 'Write your message…',
+        'submit' => 'Publish',
+        'publication_date' => 'Publication date',
+        'publication_method' => [
+            'now' => 'Now',
+            'schedule' => 'Schedule',
+        ],
+        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date_hint' =>
+            'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
+        'submit_edit' => 'Edit publication',
+        'cancel_publication' => 'Cancel publication',
+        'message_warning' => 'You did not write a message for your announcement post!',
+        'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.',
+        'message_warning_submit' => 'Publish anyway',
+    ],
+    'publication_status_banner' => [
+        'draft_mode' => 'draft mode',
+        'not_published' => 'This podcast is not yet published.',
+        'scheduled' => 'This podcast is scheduled for publication on {publication_date}.',
+    ],
+    'delete_form' => [
+        'disclaimer' =>
+            "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.",
+        'understand' => 'I understand, I want the podcast to be permanently deleted',
+        'submit' => 'Delete',
+    ],
+    'by' => 'By {publisher}',
+    'season' => 'Season {seasonNumber}',
+    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Season {seasonNumber} episodes ({episodeCount})',
+    'no_episode' => 'No episode found!',
+    'follow' => 'Follow',
+    'followers' => '{numberOfFollowers, plural,
+        one {# follower}
+        other {# followers}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {# post}
+        other {# posts}
+    }',
+    'activity' => 'Activity',
+    'episodes' => 'Episodes',
+    'sponsor' => 'Sponsor',
+    'funding_links' => 'Funding links for {podcastTitle}',
+    'find_on' => 'Find {podcastTitle} on',
+    'listen_on' => 'Listen on',
+];
diff --git a/modules/Admin/Language/fr_CA/PodcastImport.php b/modules/Admin/Language/fr_CA/PodcastImport.php
new file mode 100644
index 0000000000..7c3ef67d1f
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/PodcastImport.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'warning' =>
+        'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.',
+    'old_podcast_section_title' => 'The podcast to import',
+    'old_podcast_section_subtitle' =>
+        'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.',
+    'imported_feed_url' => 'Feed URL',
+    'imported_feed_url_hint' => 'The feed must be in xml or rss format.',
+    'new_podcast_section_title' => 'The new podcast',
+    'advanced_params_section_title' => 'Advanced parameters',
+    'advanced_params_section_subtitle' =>
+        'Keep the default values if you have no idea of what the fields are for.',
+    'slug_field' => 'Field to be used to calculate episode slug',
+    'description_field' =>
+        'Source field used for episode description / show notes',
+    'force_renumber' => 'Force episodes renumbering',
+    'force_renumber_hint' =>
+        'Use this if your podcast does not have episode numbers but wish to set them during import.',
+    'season_number' => 'Season number',
+    'season_number_hint' =>
+        'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.',
+    'max_episodes' => 'Maximum number of episodes to import',
+    'max_episodes_hint' => 'Leave blank to import all episodes',
+    'lock_import' =>
+        'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.',
+    'submit' => 'Import podcast',
+];
diff --git a/modules/Admin/Language/fr_CA/PodcastNavigation.php b/modules/Admin/Language/fr_CA/PodcastNavigation.php
new file mode 100644
index 0000000000..b4d7ddc089
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/PodcastNavigation.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'go_to_page' => 'Go to podcast page',
+    'dashboard' => 'Podcast dashboard',
+    'podcast-view' => 'Home',
+    'podcast-edit' => 'Edit podcast',
+    'podcast-persons-manage' => 'Manage persons',
+    'episodes' => 'Episodes',
+    'episode-list' => 'All episodes',
+    'episode-create' => 'New episode',
+    'analytics' => 'Analytics',
+    'podcast-analytics' => 'Audience overview',
+    'podcast-analytics-webpages' => 'Web pages visits',
+    'podcast-analytics-locations' => 'Locations',
+    'podcast-analytics-unique-listeners' => 'Unique listeners',
+    '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',
+    'platforms' => 'External platforms',
+    'platforms-podcasting' => 'Podcasting',
+    'platforms-social' => 'Social networks',
+    'platforms-funding' => 'Funding',
+];
diff --git a/modules/Admin/Language/fr_CA/Settings.php b/modules/Admin/Language/fr_CA/Settings.php
new file mode 100644
index 0000000000..4a70dcbaa0
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Settings.php
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'General settings',
+    'instance' => [
+        'title' => 'Instance',
+        'site_icon' => 'Site icon',
+        'site_icon_delete' => 'Delete site icon',
+        'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.',
+        'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.',
+        'site_name' => 'Site name',
+        'site_description' => 'Site description',
+        'submit' => 'Save',
+        'editSuccess' => 'Instance has been updated successfully!',
+        'deleteIconSuccess' => 'Site icon has been remove successfully!',
+    ],
+    'images' => [
+        'title' => 'Images',
+        'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.',
+        'regenerate' => 'Regenerate images',
+        'regenerationSuccess' => 'All images have been regenerated successfully!',
+    ],
+    'housekeeping' => [
+        'title' => 'Housekeeping',
+        'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.',
+        'reset_counts' => 'Reset counts',
+        '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',
+        'runSuccess' => 'Housekeeping has been run successfully!',
+    ],
+    'theme' => [
+        'title' => 'Theme',
+        'accent_section_title' => 'Accent color',
+        'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.',
+        'pine' => 'Pine',
+        'crimson' => 'Crimson',
+        'amber' => 'Amber',
+        'lake' => 'Lake',
+        'jacaranda' => 'Jacaranda',
+        'onyx' => 'Onyx',
+        'submit' => 'Save',
+        'setInstanceThemeSuccess' => 'Theme has been updated successfully!',
+    ],
+];
diff --git a/modules/Admin/Language/fr_CA/Soundbite.php b/modules/Admin/Language/fr_CA/Soundbite.php
new file mode 100644
index 0000000000..a3f828fe09
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Soundbite.php
@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'list' => [
+        'title' => 'Soundbites',
+        'soundbite' => 'Soundbite',
+    ],
+    'messages' => [
+        'createSuccess' => 'Soundbite has been successfully created!',
+        'deleteSuccess' => 'Soundbite has been successfully removed!',
+    ],
+    'form' => [
+        'title' => 'New soundbite',
+        'soundbite_title' => 'Soundbite title',
+        'start_time' => 'Start at',
+        'duration' => 'Duration',
+        'submit' => 'Create soundbite',
+    ],
+    'play' => 'Play soundbite',
+    'stop' => 'Stop soundbite',
+    'create' => 'New soundbite',
+    'delete' => 'Delete soundbite',
+];
diff --git a/modules/Admin/Language/fr_CA/Validation.php b/modules/Admin/Language/fr_CA/Validation.php
new file mode 100644
index 0000000000..3bc78cfe18
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/Validation.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'min_dims' =>
+        '{field} is either not an image, or it is not wide or tall enough.',
+    'is_image_ratio' =>
+        '{field} is either not an image or not of the right ratio.',
+];
diff --git a/modules/Admin/Language/fr_CA/VideoClip.php b/modules/Admin/Language/fr_CA/VideoClip.php
new file mode 100644
index 0000000000..638de697bb
--- /dev/null
+++ b/modules/Admin/Language/fr_CA/VideoClip.php
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'list' => [
+        'title' => 'Video clips',
+        'status' => [
+            'label' => 'Status',
+            'queued' => 'queued',
+            'queued_hint' => 'Clip is waiting to be processed.',
+            'pending' => 'pending',
+            'pending_hint' => 'Clip will be generated shortly.',
+            'running' => 'running',
+            'running_hint' => 'Clip is being generated.',
+            'failed' => 'failed',
+            'failed_hint' => 'Clip could not be generated: script failure.',
+            'passed' => 'passed',
+            'passed_hint' => 'Clip was generated successfully!',
+        ],
+        'clip' => 'Clip',
+        'duration' => 'Job duration',
+    ],
+    'title' => 'Video clip: {videoClipLabel}',
+    'download_clip' => 'Download clip',
+    'create' => 'New video clip',
+    'go_to_page' => 'Go to clip page',
+    'retry' => 'Retry clip generation',
+    'delete' => 'Delete clip',
+    'logs' => 'Job logs',
+    'messages' => [
+        'alreadyExistingError' => 'The video clip you are trying to create already exists!',
+        'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!',
+        'deleteSuccess' => 'Video clip has been successfully removed!',
+    ],
+    'format' => [
+        'landscape' => 'Landscape',
+        'portrait' => 'Portrait',
+        'squared' => 'Squared',
+    ],
+    'form' => [
+        'title' => 'New video clip',
+        'params_section_title' => 'Video clip parameters',
+        'clip_title' => 'Clip title',
+        'format' => [
+            'label' => 'Choose a format',
+            'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.',
+            'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.',
+            'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.',
+        ],
+        'theme' => 'Select a theme',
+        'start_time' => 'Start at',
+        'duration' => 'Duration',
+        'trim_start' => 'Trim start',
+        'trim_end' => 'Trim end',
+        'submit' => 'Create video clip',
+    ],
+    'requirements' => [
+        'title' => 'Missing requirements',
+        'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!',
+        'ffmpeg' => 'FFmpeg',
+        'gd' => 'Graphics Draw (GD)',
+        'freetype' => 'Freetype library for GD',
+        'transcript' => 'Transcript file (.srt)',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/AboutCastopod.php b/modules/Admin/Language/fr_trad/AboutCastopod.php
new file mode 100644
index 0000000000..3fb62afffe
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/AboutCastopod.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'About Castopod',
+    'host_name' => 'Host name',
+    'version' => 'Castopod version',
+    'php_version' => 'PHP version',
+    'os' => 'Operating System',
+    'languages' => 'Languages',
+    'update_database' => 'Update database',
+    'messages' => [
+        'databaseUpdateSuccess' => 'Database is up to date!',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/Breadcrumb.php b/modules/Admin/Language/fr_trad/Breadcrumb.php
new file mode 100644
index 0000000000..558b90f765
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Breadcrumb.php
@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'label' => 'breadcrumb',
+    config('Admin')
+        ->gateway => 'Home',
+    'podcasts' => 'podcasts',
+    'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
+    'contributors' => 'contributors',
+    'pages' => 'pages',
+    'settings' => 'settings',
+    'theme' => 'theme',
+    'about' => 'about',
+    'add' => 'add',
+    'new' => 'new',
+    'edit' => 'edit',
+    'persons' => 'persons',
+    'publish' => 'publish',
+    'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
+    'unpublish' => 'unpublish',
+    'delete' => 'delete',
+    'remove' => 'remove',
+    'fediverse' => 'fediverse',
+    'blocked-actors' => 'blocked actors',
+    'blocked-domains' => 'blocked domains',
+    'users' => 'users',
+    'my-account' => 'my account',
+    'change-password' => 'change password',
+    'import' => 'feed import',
+    'platforms' => 'platforms',
+    'social' => 'social networks',
+    'funding' => 'funding',
+    'analytics' => 'analytics',
+    'locations' => 'locations',
+    'webpages' => 'web pages',
+    'unique-listeners' => 'unique listeners',
+    'players' => 'players',
+    'listening-time' => 'listening time',
+    'time-periods' => 'time periods',
+    'soundbites' => 'soundbites',
+    'video-clips' => 'video clips',
+    'embed' => 'embeddable player',
+    'notifications' => 'notifications',
+    'suspend' => 'suspend',
+];
diff --git a/modules/Admin/Language/fr_trad/Charts.php b/modules/Admin/Language/fr_trad/Charts.php
new file mode 100644
index 0000000000..6ede251094
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Charts.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'by_service_weekly' => 'Episode downloads by service (for the past week)',
+    '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)',
+    'by_os_weekly' => 'Episode downloads by O.S. (for the past week)',
+    'podcast_by_region' => 'Episode downloads by region (for the past week)',
+    'unique_daily_listeners' => 'Daily unique listeners',
+    'unique_monthly_listeners' => 'Monthly unique listeners',
+    'by_browser' => 'Web pages usage by browser (for the past week)',
+    'podcast_by_day' => 'Episode daily downloads',
+    'podcast_by_month' => 'Episode monthly downloads',
+    'episode_by_day' => 'Episode daily downloads (first 60 days)',
+    'episode_by_month' => 'Episode monthly downloads',
+    'episodes_by_day' =>
+        '5 latest episodes downloads (during their first 60 days)',
+    'by_country_weekly' => 'Episode downloads by country (for the past week)',
+    'by_country_yearly' => 'Episode downloads by country (for the past year)',
+    'by_domain_weekly' => 'Web pages visits by source (for the past week)',
+    'by_domain_yearly' => 'Web pages visits by source (for the past year)',
+    'by_entry_page' => 'Web pages visits by landing page (for the past week)',
+    'podcast_bots' => 'Bots (crawlers)',
+    'daily_listening_time' => 'Daily cumulative listening time',
+    'monthly_listening_time' => 'Monthly cumulative listening time',
+    'by_weekday' => 'By week day (for the past 60 days)',
+    'by_hour' => 'By time of day (for the past 60 days)',
+    'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
+    'total_storage_by_month' => 'Monthly storage (in MB)',
+    'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
+];
diff --git a/modules/Admin/Language/fr_trad/Common.php b/modules/Admin/Language/fr_trad/Common.php
new file mode 100644
index 0000000000..596c8bcdec
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Common.php
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Yes',
+    'no' => 'No',
+    'cancel' => 'Cancel',
+    'optional' => 'Optional',
+    'more' => 'More',
+    'no_data' => 'No data found!',
+    'close' => 'Close',
+    'edit' => 'Edit',
+    'copy' => 'Copy',
+    'copied' => 'Copied!',
+    'home' => 'Home',
+    'explicit' => 'Explicit',
+    'powered_by' => 'Powered by {castopod}',
+    'actions' => 'Actions',
+    'pageInfo' => 'Page {currentPage} out of {pageCount}',
+    'go_back' => 'Go back',
+    'forms' => [
+        'editor' => [
+            'write' => 'Write',
+            'preview' => 'Preview',
+            'help' => 'Powered by markdown',
+        ],
+        'multiSelect' => [
+            'selectText' => 'Press to select',
+            'loadingText' => 'Loading…',
+            'noResultsText' => 'No results found',
+            'noChoicesText' => 'No choices to choose from',
+            'maxItemText' => 'Cannot add more items',
+        ],
+        'upload_file' => 'Upload a file',
+        'remote_url' => 'Remote URL',
+    ],
+    'play_episode_button' => [
+        'play' => 'Play',
+        'playing' => 'Playing',
+    ],
+    'size_limit' => 'Size limit: {0}.',
+    'choose_interact' => 'Choose how to interact',
+    'view' => 'View',
+];
diff --git a/modules/Admin/Language/fr_trad/Countries.php b/modules/Admin/Language/fr_trad/Countries.php
new file mode 100644
index 0000000000..4cd5d9c857
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Countries.php
@@ -0,0 +1,264 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * ISO 3166 country codes
+ *
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'AD' => 'Andorra',
+    'AE' => 'United Arab Emirates',
+    'AF' => 'Afghanistan',
+    'AG' => 'Antigua and Barbuda',
+    'AI' => 'Anguilla',
+    'AL' => 'Albania',
+    'AM' => 'Armenia',
+    'AO' => 'Angola',
+    'AQ' => 'Antarctica',
+    'AR' => 'Argentina',
+    'AS' => 'American Samoa',
+    'AT' => 'Austria',
+    'AU' => 'Australia',
+    'AW' => 'Aruba',
+    'AX' => 'Åland Islands',
+    'AZ' => 'Azerbaijan',
+    'BA' => 'Bosnia and Herzegovina',
+    'BB' => 'Barbados',
+    'BD' => 'Bangladesh',
+    'BE' => 'Belgium',
+    'BF' => 'Burkina Faso',
+    'BG' => 'Bulgaria',
+    'BH' => 'Bahrain',
+    'BI' => 'Burundi',
+    'BJ' => 'Benin',
+    'BL' => 'Saint Barthélemy',
+    'BM' => 'Bermuda',
+    'BN' => 'Brunei Darussalam',
+    'BO' => 'Bolivia, Plurinational State of',
+    'BQ' => 'Bonaire, Sint Eustatius and Saba',
+    'BR' => 'Brazil',
+    'BS' => 'Bahamas',
+    'BT' => 'Bhutan',
+    'BV' => 'Bouvet Island',
+    'BW' => 'Botswana',
+    'BY' => 'Belarus',
+    'BZ' => 'Belize',
+    'CA' => 'Canada',
+    'CC' => 'Cocos (Keeling) Islands',
+    'CD' => 'Congo, the Democratic Republic of the',
+    'CF' => 'Central African Republic',
+    'CG' => 'Congo',
+    'CH' => 'Switzerland',
+    'CI' => "Côte d'Ivoire",
+    'CK' => 'Cook Islands',
+    'CL' => 'Chile',
+    'CM' => 'Cameroon',
+    'CN' => 'China',
+    'CO' => 'Colombia',
+    'CR' => 'Costa Rica',
+    'CU' => 'Cuba',
+    'CV' => 'Cape Verde',
+    'CW' => 'Curaçao',
+    'CX' => 'Christmas Island',
+    'CY' => 'Cyprus',
+    'CZ' => 'Czech Republic',
+    'DE' => 'Germany',
+    'DJ' => 'Djibouti',
+    'DK' => 'Denmark',
+    'DM' => 'Dominica',
+    'DO' => 'Dominican Republic',
+    'DZ' => 'Algeria',
+    'EC' => 'Ecuador',
+    'EE' => 'Estonia',
+    'EG' => 'Egypt',
+    'EH' => 'Western Sahara',
+    'ER' => 'Eritrea',
+    'ES' => 'Spain',
+    'ET' => 'Ethiopia',
+    'FI' => 'Finland',
+    'FJ' => 'Fiji',
+    'FK' => 'Falkland Islands (Malvinas)',
+    'FM' => 'Micronesia, Federated States of',
+    'FO' => 'Faroe Islands',
+    'FR' => 'France',
+    'GA' => 'Gabon',
+    'GB' => 'United Kingdom',
+    'GD' => 'Grenada',
+    'GE' => 'Georgia',
+    'GF' => 'French Guiana',
+    'GG' => 'Guernsey',
+    'GH' => 'Ghana',
+    'GI' => 'Gibraltar',
+    'GL' => 'Greenland',
+    'GM' => 'Gambia',
+    'GN' => 'Guinea',
+    'GP' => 'Guadeloupe',
+    'GQ' => 'Equatorial Guinea',
+    'GR' => 'Greece',
+    'GS' => 'South Georgia and the South Sandwich Islands',
+    'GT' => 'Guatemala',
+    'GU' => 'Guam',
+    'GW' => 'Guinea-Bissau',
+    'GY' => 'Guyana',
+    'HK' => 'Hong Kong',
+    'HM' => 'Heard Island and McDonald Islands',
+    'HN' => 'Honduras',
+    'HR' => 'Croatia',
+    'HT' => 'Haiti',
+    'HU' => 'Hungary',
+    'ID' => 'Indonesia',
+    'IE' => 'Ireland',
+    'IL' => 'Israel',
+    'IM' => 'Isle of Man',
+    'IN' => 'India',
+    'IO' => 'British Indian Ocean Territory',
+    'IQ' => 'Iraq',
+    'IR' => 'Iran, Islamic Republic of',
+    'IS' => 'Iceland',
+    'IT' => 'Italy',
+    'JE' => 'Jersey',
+    'JM' => 'Jamaica',
+    'JO' => 'Jordan',
+    'JP' => 'Japan',
+    'KE' => 'Kenya',
+    'KG' => 'Kyrgyzstan',
+    'KH' => 'Cambodia',
+    'KI' => 'Kiribati',
+    'KM' => 'Comoros',
+    'KN' => 'Saint Kitts and Nevis',
+    'KP' => "Korea, Democratic People's Republic of",
+    'KR' => 'Korea, Republic of',
+    'KW' => 'Kuwait',
+    'KY' => 'Cayman Islands',
+    'KZ' => 'Kazakhstan',
+    'LA' => "Lao People's Democratic Republic",
+    'LB' => 'Lebanon',
+    'LC' => 'Saint Lucia',
+    'LI' => 'Liechtenstein',
+    'LK' => 'Sri Lanka',
+    'LR' => 'Liberia',
+    'LS' => 'Lesotho',
+    'LT' => 'Lithuania',
+    'LU' => 'Luxembourg',
+    'LV' => 'Latvia',
+    'LY' => 'Libya',
+    'MA' => 'Morocco',
+    'MC' => 'Monaco',
+    'MD' => 'Moldova, Republic of',
+    'ME' => 'Montenegro',
+    'MF' => 'Saint Martin (French part)',
+    'MG' => 'Madagascar',
+    'MH' => 'Marshall Islands',
+    'MK' => 'Macedonia, the Former Yugoslav Republic of',
+    'ML' => 'Mali',
+    'MM' => 'Myanmar',
+    'MN' => 'Mongolia',
+    'MO' => 'Macao',
+    'MP' => 'Northern Mariana Islands',
+    'MQ' => 'Martinique',
+    'MR' => 'Mauritania',
+    'MS' => 'Montserrat',
+    'MT' => 'Malta',
+    'MU' => 'Mauritius',
+    'MV' => 'Maldives',
+    'MW' => 'Malawi',
+    'MX' => 'Mexico',
+    'MY' => 'Malaysia',
+    'MZ' => 'Mozambique',
+    'N/A' => 'Not Applicable (local IP…)',
+    'NA' => 'Namibia',
+    'NC' => 'New Caledonia',
+    'NE' => 'Niger',
+    'NF' => 'Norfolk Island',
+    'NG' => 'Nigeria',
+    'NI' => 'Nicaragua',
+    'NL' => 'Netherlands',
+    'NO' => 'Norway',
+    'NP' => 'Nepal',
+    'NR' => 'Nauru',
+    'NU' => 'Niue',
+    'NZ' => 'New Zealand',
+    'OM' => 'Oman',
+    'PA' => 'Panama',
+    'PE' => 'Peru',
+    'PF' => 'French Polynesia',
+    'PG' => 'Papua New Guinea',
+    'PH' => 'Philippines',
+    'PK' => 'Pakistan',
+    'PL' => 'Poland',
+    'PM' => 'Saint Pierre and Miquelon',
+    'PN' => 'Pitcairn',
+    'PR' => 'Puerto Rico',
+    'PS' => 'Palestine, State of',
+    'PT' => 'Portugal',
+    'PW' => 'Palau',
+    'PY' => 'Paraguay',
+    'QA' => 'Qatar',
+    'RE' => 'Réunion',
+    'RO' => 'Romania',
+    'RS' => 'Serbia',
+    'RU' => 'Russian Federation',
+    'RW' => 'Rwanda',
+    'SA' => 'Saudi Arabia',
+    'SB' => 'Solomon Islands',
+    'SC' => 'Seychelles',
+    'SD' => 'Sudan',
+    'SE' => 'Sweden',
+    'SG' => 'Singapore',
+    'SH' => 'Saint Helena, Ascension and Tristan da Cunha',
+    'SI' => 'Slovenia',
+    'SJ' => 'Svalbard and Jan Mayen',
+    'SK' => 'Slovakia',
+    'SL' => 'Sierra Leone',
+    'SM' => 'San Marino',
+    'SN' => 'Senegal',
+    'SO' => 'Somalia',
+    'SR' => 'Suriname',
+    'SS' => 'South Sudan',
+    'ST' => 'Sao Tome and Principe',
+    'SV' => 'El Salvador',
+    'SX' => 'Sint Maarten (Dutch part)',
+    'SY' => 'Syrian Arab Republic',
+    'SZ' => 'Swaziland',
+    'TC' => 'Turks and Caicos Islands',
+    'TD' => 'Chad',
+    'TF' => 'French Southern Territories',
+    'TG' => 'Togo',
+    'TH' => 'Thailand',
+    'TJ' => 'Tajikistan',
+    'TK' => 'Tokelau',
+    'TL' => 'Timor-Leste',
+    'TM' => 'Turkmenistan',
+    'TN' => 'Tunisia',
+    'TO' => 'Tonga',
+    'TR' => 'Turkey',
+    'TT' => 'Trinidad and Tobago',
+    'TV' => 'Tuvalu',
+    'TW' => 'Taiwan, Province of China',
+    'TZ' => 'Tanzania, United Republic of',
+    'UA' => 'Ukraine',
+    'UG' => 'Uganda',
+    'UM' => 'United States Minor Outlying Islands',
+    'US' => 'United States',
+    'UY' => 'Uruguay',
+    'UZ' => 'Uzbekistan',
+    'VA' => 'Holy See (Vatican City State)',
+    'VC' => 'Saint Vincent and the Grenadines',
+    'VE' => 'Venezuela, Bolivarian Republic of',
+    'VG' => 'Virgin Islands, British',
+    'VI' => 'Virgin Islands, U.S.',
+    'VN' => 'Viet Nam',
+    'VU' => 'Vanuatu',
+    'WF' => 'Wallis and Futuna',
+    'WS' => 'Samoa',
+    'YE' => 'Yemen',
+    'YT' => 'Mayotte',
+    'ZA' => 'South Africa',
+    'ZM' => 'Zambia',
+    'ZW' => 'Zimbabwe',
+];
diff --git a/modules/Admin/Language/fr_trad/Dashboard.php b/modules/Admin/Language/fr_trad/Dashboard.php
new file mode 100644
index 0000000000..881073fd26
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Dashboard.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
+    'podcasts' => [
+        'title' => 'Podcasts',
+        'not_found' => 'No published podcast',
+        'last_published' => 'Last published on {lastPublicationDate}',
+    ],
+    'episodes' => [
+        'title' => 'Episodes',
+        'not_found' => 'No published episode',
+        'last_published' => 'Last published on {lastPublicationDate}',
+    ],
+    'storage' => [
+        'title' => 'Storage',
+        'subtitle' => '{totalUploaded} out of {totalStorage}',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/Episode.php b/modules/Admin/Language/fr_trad/Episode.php
new file mode 100644
index 0000000000..91313a7c5a
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Episode.php
@@ -0,0 +1,213 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Season {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Episode {episodeNumber}',
+    'number_abbr' => 'Ep. {episodeNumber}',
+    'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
+    'number_of_comments' => '{numberOfComments, plural,
+        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',
+    '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',
+    'create' => 'Add an episode',
+    'publication_status' => [
+        'published' => 'Published',
+        'with_podcast' => 'Published',
+        'scheduled' => 'Scheduled',
+        'not_published' => 'Not published',
+    ],
+    'with_podcast_hint' => 'To be published at the same time as the podcast',
+    'list' => [
+        'search' => [
+            'placeholder' => 'Search for an episode',
+            'clear' => 'Clear search',
+            'submit' => 'Search',
+        ],
+        'number_of_episodes' => '{numberOfEpisodes, plural,
+            one {# episode}
+            other {# episodes}
+        }',
+        'episode' => 'Episode',
+        'visibility' => 'Visibility',
+        'comments' => 'Comments',
+        'actions' => 'Actions',
+    ],
+    'messages' => [
+        'createSuccess' => 'Episode has been successfully created!',
+        'editSuccess' => 'Episode has been successfully updated!',
+        'publishSuccess' => '{publication_status, select,
+            published {Episode successfully published!}
+            scheduled {Episode publication successfully scheduled!}
+            with_podcast {This episode will be published at the same time as the podcast.}
+            other {This episode is not published.}
+        }',
+        'publishCancelSuccess' => 'Episode publication successfully cancelled!',
+        'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.',
+        'scheduleDateError' => 'Schedule date must be set!',
+        'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.',
+        'deleteSuccess' => 'Episode successfully deleted!',
+        'deleteError' => 'Failed to delete episode {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        }.',
+        'deleteFileError' => 'Failed to delete {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        } file {file_path}. You may manually remove it from your disk.',
+        'sameSlugError' => 'An episode with the chosen slug already exists.',
+    ],
+    'form' => [
+        'file_size_error' =>
+            'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.',
+        'audio_file' => 'Audio file',
+        'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.',
+        'info_section_title' => 'Episode info',
+        'cover' => 'Episode cover',
+        'cover_hint' =>
+            'If you do not set a cover, the podcast cover will be used instead.',
+        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'title' => 'Title',
+        'title_hint' =>
+            'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.',
+        'permalink' => 'Permalink',
+        'season_number' => 'Season',
+        'episode_number' => 'Episode',
+        'type' => [
+            'label' => 'Type',
+            'full' => 'Full',
+            'full_hint' => 'Complete content (the episode)',
+            'trailer' => 'Trailer',
+            'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show',
+            '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?',
+            'undefined' => 'undefined',
+            'clean' => 'Clean',
+            'explicit' => 'Explicit',
+        ],
+        'show_notes_section_title' => 'Show notes',
+        'show_notes_section_subtitle' =>
+            'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
+        'description' => 'Description',
+        'description_footer' => 'Description footer',
+        'description_footer_hint' =>
+            'This text is added at the end of each episode description, it is a good place to input your social links for example.',
+        'additional_files_section_title' => 'Additional files',
+        'additional_files_section_subtitle' =>
+            'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this episode about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real or fictional location',
+        'transcript' => 'Transcript (subtitles / closed captions)',
+        'transcript_hint' => 'Only .srt are allowed.',
+        'transcript_download' => 'Download transcript',
+        'transcript_file' => 'Transcript file (.srt)',
+        'transcript_remote_url' => 'Remote url for transcript',
+        'transcript_file_delete' => 'Delete transcript file',
+        'chapters' => 'Chapters',
+        'chapters_hint' => 'File must be in JSON Chapters format.',
+        'chapters_download' => 'Download chapters',
+        'chapters_file' => 'Chapters file',
+        'chapters_remote_url' => 'Remote url for chapters file',
+        'chapters_file_delete' => 'Delete chapters file',
+        'advanced_section_title' => 'Advanced Parameters',
+        'advanced_section_subtitle' =>
+            'If you need RSS tags that Castopod does not handle, set them here.',
+        'custom_rss' => 'Custom RSS tags for the episode',
+        'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.',
+        'block' => 'Episode should be hidden from public catalogues',
+        'block_hint' =>
+            'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
+        'submit_create' => 'Create episode',
+        'submit_edit' => 'Save episode',
+    ],
+    'publish_form' => [
+        'back_to_episode_dashboard' => 'Back to episode dashboard',
+        'post' => 'Your announcement post',
+        'post_hint' =>
+            "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.",
+        'message_placeholder' => 'Write your message…',
+        'publication_date' => 'Publication date',
+        'publication_method' => [
+            'now' => 'Now',
+            'schedule' => 'Schedule',
+            'with_podcast' => 'Publish alongside podcast',
+        ],
+        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date_clear' => 'Clear publication date',
+        'scheduled_publication_date_hint' =>
+            'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
+        'submit' => 'Publish',
+        'submit_edit' => 'Edit publication',
+        'cancel_publication' => 'Cancel publication',
+        'message_warning' => 'You did not write a message for your announcement post!',
+        '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.",
+        'understand' => 'I understand, I want to unpublish the episode',
+        'submit' => 'Unpublish',
+    ],
+    'delete_form' => [
+        'disclaimer' =>
+            "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.",
+        'understand' => 'I understand, I want to delete the episode',
+        'submit' => 'Delete',
+    ],
+    'embed' => [
+        'title' => 'Embeddable player',
+        'label' =>
+            'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.',
+        'clipboard_iframe' => 'Copy embeddable player to clipboard',
+        'clipboard_url' => 'Copy address to clipboard',
+        'dark' => 'Dark',
+        'dark-transparent' => 'Dark transparent',
+        'light' => 'Light',
+        'light-transparent' => 'Light transparent',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/EpisodeNavigation.php b/modules/Admin/Language/fr_trad/EpisodeNavigation.php
new file mode 100644
index 0000000000..1406e3010e
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/EpisodeNavigation.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'go_to_page' => 'View episode page',
+    'dashboard' => 'Episode dashboard',
+    'episode-view' => 'Home',
+    'episode-edit' => 'Edit episode',
+    'episode-persons-manage' => 'Manage persons',
+    'embed-add' => 'Embeddable player',
+    'clips' => 'Clips',
+    'video-clips-list' => 'Video clips',
+    'video-clips-create' => 'New video clip',
+    'soundbites-list' => 'Soundbites',
+    'soundbites-create' => 'New soundbite',
+];
diff --git a/modules/Admin/Language/fr_trad/Fediverse.php b/modules/Admin/Language/fr_trad/Fediverse.php
new file mode 100644
index 0000000000..0e4ca66d89
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Fediverse.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'messages' => [
+        'actorNotFound' => 'The account could not be found!',
+        'blockActorSuccess' => '{actor} has been blocked!',
+        'unblockActorSuccess' => 'Actor has been unblocked!',
+        'blockDomainSuccess' => '{domain} has been blocked!',
+        'unblockDomainSuccess' => '{domain} has been unblocked!',
+    ],
+    'blocked_actors' => 'Blocked accounts',
+    'blocked_domains' => 'Blocked domains',
+    'block_lists_form' => [
+        'handle' => 'Account handle',
+        'handle_hint' => 'Input @username@domain account.',
+        'domain' => 'Domain name',
+        'submit' => 'Block!',
+    ],
+    'list' => [
+        'actor' => 'Account',
+        'domain' => 'Domain name',
+        'unblock' => 'Unblock',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/Home.php b/modules/Admin/Language/fr_trad/Home.php
new file mode 100644
index 0000000000..3ff4c04dc8
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Home.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'no_podcast' => 'No podcast found',
+];
diff --git a/modules/Admin/Language/fr_trad/Install.php b/modules/Admin/Language/fr_trad/Install.php
new file mode 100644
index 0000000000..36e373a285
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Install.php
@@ -0,0 +1,61 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'manual_config' => 'Manual configuration',
+    'manual_config_subtitle' =>
+        'Create a `.env` file with your settings and refresh the page to continue installation.',
+    'form' => [
+        'instance_config' => 'Instance configuration',
+        'hostname' => 'Hostname',
+        'media_base_url' => 'Media base URL',
+        'media_base_url_hint' =>
+            'If you use a CDN and/or an external analytics service, you may set them here.',
+        'admin_gateway' => 'Admin gateway',
+        'admin_gateway_hint' =>
+            'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.',
+        'auth_gateway' => 'Auth gateway',
+        'auth_gateway_hint' =>
+            'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.',
+        'database_config' => 'Database configuration',
+        'database_config_hint' =>
+            'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.',
+        'db_hostname' => 'Database hostname',
+        'db_name' => 'Database name',
+        'db_username' => 'Database username',
+        'db_password' => 'Database password',
+        'db_prefix' => 'Database prefix',
+        'db_prefix_hint' =>
+            "The prefix of the Castopod table names, leave as is if you don't know what it means.",
+        'cache_config' => 'Cache configuration',
+        'cache_config_hint' =>
+            'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.',
+        'cache_handler' => 'Cache handler',
+        'cacheHandlerOptions' => [
+            'file' => 'File',
+            'redis' => 'Redis',
+            'predis' => 'Predis',
+        ],
+        'next' => 'Next',
+        'submit' => 'Finish install',
+        'create_superadmin' => 'Create your superadmin account',
+        'email' => 'Email',
+        'username' => 'Username',
+        'password' => 'Password',
+    ],
+    'messages' => [
+        'createSuperAdminSuccess' =>
+            'Your superadmin account has been created successfully. Login to start podcasting!',
+        'databaseConnectError' =>
+            'Castopod could not connect to your database. Edit your database configuration and try again.',
+        'writeError' =>
+            "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.",
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/Navigation.php b/modules/Admin/Language/fr_trad/Navigation.php
new file mode 100644
index 0000000000..610f14345d
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Navigation.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'toggle_sidebar' => 'Toggle sidebar',
+    'go_to_website' => 'Go to website',
+    'go_to_admin' => 'Go to admin',
+    'dashboard' => 'Dashboard',
+    'admin' => 'Home',
+    'podcasts' => 'Podcasts',
+    'podcast-list' => 'All podcasts',
+    'podcast-create' => 'New podcast',
+    'podcast-import' => 'Import a podcast',
+    'persons' => 'Persons',
+    'person-list' => 'All persons',
+    'person-create' => 'New person',
+    'fediverse' => 'Fediverse',
+    'fediverse-blocked-actors' => 'Blocked accounts',
+    'fediverse-blocked-domains' => 'Blocked domains',
+    'users' => 'Users',
+    'user-list' => 'All users',
+    'user-create' => 'New user',
+    'pages' => 'Pages',
+    'page-list' => 'All pages',
+    'page-create' => 'New Page',
+    'settings' => 'Settings',
+    'settings-general' => 'General',
+    'settings-theme' => 'Theme',
+    'about' => 'About',
+    'account' => [
+        'my-account' => 'My account',
+        'change-password' => 'Change password',
+        'logout' => 'Logout',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/Notifications.php b/modules/Admin/Language/fr_trad/Notifications.php
new file mode 100644
index 0000000000..2b139d5181
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Notifications.php
@@ -0,0 +1,19 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Notifications',
+    'reply' => '{actor_username} replied to your post',
+    'favourite' => '{actor_username} favourited your post',
+    'reblog' => '{actor_username} shared your post',
+    'follow' => '{actor_username} started following you',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/fr_trad/Page.php b/modules/Admin/Language/fr_trad/Page.php
new file mode 100644
index 0000000000..b6f49de574
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Page.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'back_to_home' => 'Back to home',
+    'page' => 'Page',
+    'all_pages' => 'All pages',
+    'create' => 'New page',
+    'go_to_page' => 'Go to page',
+    'edit' => 'Edit page',
+    'delete' => 'Delete page',
+    'form' => [
+        'title' => 'Title',
+        'permalink' => 'Permalink',
+        'content' => 'Content',
+        'submit_create' => 'Create page',
+        'submit_edit' => 'Save',
+    ],
+    'messages' => [
+        'createSuccess' => 'The page “{pageTitle}” was created successfully!',
+        'editSuccess' => 'The page was successfully updated!',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/Pager.php b/modules/Admin/Language/fr_trad/Pager.php
new file mode 100644
index 0000000000..e25ee63810
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Pager.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'pageNavigation' => 'Page navigation',
+    'first' => 'First',
+    'previous' => 'Previous',
+    'next' => 'Next',
+    'last' => 'Last',
+    'older' => 'Older',
+    'newer' => 'Newer',
+    'invalidTemplate' => '{0} is not a valid Pager template.',
+    'invalidPaginationGroup' => '{0} is not a valid Pagination group.',
+];
diff --git a/modules/Admin/Language/fr_trad/Person.php b/modules/Admin/Language/fr_trad/Person.php
new file mode 100644
index 0000000000..a652be9fda
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Person.php
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'persons' => 'Persons',
+    'all_persons' => 'All persons',
+    'no_person' => 'Nobody found!',
+    'create' => 'Create a person',
+    'view' => 'View person',
+    'edit' => 'Edit person',
+    'delete' => 'Delete person',
+    'messages' => [
+        'createSuccess' => 'Person has been successfully created!',
+        'editSuccess' => 'Person has been successfully updated!',
+        'deleteSuccess' => 'Person has been removed!',
+    ],
+    'form' => [
+        'avatar' => 'Avatar',
+        'avatar_size_hint' =>
+            'Avatar must be squared and at least 400px wide and tall.',
+        'full_name' => 'Full name',
+        'full_name_hint' => 'This is the full name or alias of the person.',
+        'unique_name' => 'Unique name',
+        'unique_name_hint' => 'Used for URLs',
+        'information_url' => 'Information URL',
+        'information_url_hint' =>
+            'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.',
+        'submit_create' => 'Create person',
+        'submit_edit' => 'Save person',
+    ],
+    'podcast_form' => [
+        'title' => 'Manage persons',
+        'add_section_title' => 'Add persons to this podcast',
+        'add_section_subtitle' => 'You may pick several persons and roles.',
+        'persons' => 'Persons',
+        'persons_hint' =>
+            'You may select one or several persons with the same roles. You need to create the persons first.',
+        'roles' => 'Roles',
+        'roles_hint' =>
+            'You may select none, one or several roles for a person.',
+        'submit_add' => 'Add person(s)',
+        'remove' => 'Remove',
+    ],
+    'episode_form' => [
+        'title' => 'Manage persons',
+        'add_section_title' => 'Add persons to this episode',
+        'add_section_subtitle' => 'You may pick several persons and roles.',
+        'persons' => 'Persons',
+        'persons_hint' =>
+            'You may select one or several persons with the same roles. You need to create the persons first.',
+        'roles' => 'Roles',
+        'roles_hint' =>
+            'You may select none, one or several roles for a person.',
+        'submit_add' => 'Add person(s)',
+        'remove' => 'Remove',
+    ],
+    'credits' => 'Credits',
+];
diff --git a/modules/Admin/Language/fr_trad/Platforms.php b/modules/Admin/Language/fr_trad/Platforms.php
new file mode 100644
index 0000000000..ab17d5999b
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Platforms.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Platforms',
+    'home_url' => 'Go to {platformName} website',
+    'submit_url' => 'Submit your podcast on {platformName}',
+    'visible' => 'Display in podcast homepage?',
+    'on_embed' => 'Display on embeddable player?',
+    'remove' => 'Remove {platformName}',
+    'submit' => 'Save',
+    'messages' => [
+        'updateSuccess' => 'Platform links have been successfully updated!',
+        'removeLinkSuccess' => 'The platform link has been removed.',
+        'removeLinkError' =>
+            'The platform link could not be removed. Try again.',
+    ],
+    'description' => [
+        'podcasting' => 'The podcast ID on this platform',
+        'social' => 'The podcast account ID on this platform',
+        'funding' => 'Call to action message',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/Podcast.php b/modules/Admin/Language/fr_trad/Podcast.php
new file mode 100644
index 0000000000..2d46aff531
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Podcast.php
@@ -0,0 +1,314 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'no_podcast' => 'No podcast found!',
+    'create' => 'Create podcast',
+    'import' => 'Import podcast',
+    'new_episode' => 'New Episode',
+    'view' => 'View podcast',
+    'edit' => 'Edit podcast',
+    'publish' => 'Publish podcast',
+    'publish_edit' => 'Edit publication',
+    'delete' => 'Delete podcast',
+    'see_episodes' => 'See episodes',
+    'see_contributors' => 'See contributors',
+    'go_to_page' => 'Go to page',
+    'latest_episodes' => 'Latest episodes',
+    'see_all_episodes' => 'See all episodes',
+    'draft' => 'Draft',
+    'messages' => [
+        'createSuccess' => 'Podcast successfully created!',
+        'editSuccess' => 'Podcast has been successfully updated!',
+        'importSuccess' => 'Podcast has been successfully imported!',
+        'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!',
+        'deletePodcastMediaError' => 'Failed to delete podcast {type, select,
+            cover {cover}
+            banner {banner}
+            other {media}
+        }.',
+        'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        }.',
+        'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.',
+        'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural,
+            one {# episode was}
+            other {# episodes were}
+        } added to the podcast!',
+        'podcastFeedUpToDate' => 'Podcast is already up to date.',
+        'podcastNotImported' => 'Podcast could not be updated as it was not imported.',
+        'publishError' => 'This podcast is either already published or scheduled for publication.',
+        'publishEditError' => 'This podcast is not scheduled for publication.',
+        'publishCancelSuccess' => 'Podcast publication successfully cancelled!',
+        'scheduleDateError' => 'Schedule date must be set!',
+    ],
+    'form' => [
+        'identity_section_title' => 'Podcast identity',
+        'identity_section_subtitle' => 'These fields allow you to get noticed.',
+        'cover' => 'Podcast cover',
+        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'banner' => 'Podcast banner',
+        'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
+        'banner_delete' => 'Delete podcast banner',
+        'title' => 'Title',
+        'handle' => 'Handle',
+        'handle_hint' =>
+            'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.',
+        'type' => [
+            'label' => 'Type',
+            'episodic' => 'Episodic',
+            'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.',
+            'serial' => 'Serial',
+            'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.',
+        ],
+        'description' => 'Description',
+        'classification_section_title' => 'Classification',
+        'classification_section_subtitle' =>
+            'These fields will impact your audience and competition.',
+        'language' => 'Language',
+        'category' => 'Category',
+        'category_placeholder' => 'Select a category…',
+        'other_categories' => 'Other categories',
+        'parental_advisory' => [
+            'label' => 'Parental advisory',
+            'hint' => 'Does it contain explicit content?',
+            'undefined' => 'undefined',
+            'clean' => 'Clean',
+            'explicit' => 'Explicit',
+        ],
+        'author_section_title' => 'Author',
+        'author_section_subtitle' => 'Who is managing the podcast?',
+        'owner_name' => 'Owner name',
+        'owner_name_hint' =>
+            'For administrative use only. Visible in the public RSS feed.',
+        'owner_email' => 'Owner email',
+        'owner_email_hint' =>
+            'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.',
+        'publisher' => 'Publisher',
+        'publisher_hint' =>
+            'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.',
+        'copyright' => 'Copyright',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this podcast about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real place or fictional',
+        '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.',
+        'op3' => 'Open Podcast Prefix Project (OP3)',
+        'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.',
+        'op3_enable' => 'Enable OP3 analytics service',
+        'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.',
+        'payment_pointer' => 'Payment Pointer for Web Monetization',
+        'payment_pointer_hint' =>
+            'This is your where you will receive money thanks to Web Monetization',
+        'advanced_section_title' => 'Advanced Parameters',
+        'advanced_section_subtitle' =>
+            'If you need RSS tags that Castopod does not handle, set them here.',
+        'custom_rss' => 'Custom RSS tags for the podcast',
+        'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.',
+        'new_feed_url' => 'New feed URL',
+        'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.',
+        'old_feed_url' => 'Old feed URL',
+        'update_feed' => 'Update feed',
+        'update_feed_tip' => 'Import this podcast\'s latest episodes',
+        'partnership' => 'Partnership',
+        'partner_id' => 'ID',
+        'partner_link_url' => 'Link URL',
+        'partner_image_url' => 'Image URL',
+        'partner_id_hint' => 'Your own partner ID',
+        'partner_link_url_hint' => 'The generic partner link address',
+        'partner_image_url_hint' => 'The generic partner image address',
+        'status_section_title' => 'Status',
+        'block' => 'Podcast should be hidden from public catalogues',
+        'block_hint' =>
+            'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
+        'complete' => 'Podcast will not be having new episodes',
+        'lock' => 'Prevent podcast from being copied',
+        'lock_hint' =>
+            'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.',
+        'submit_create' => 'Create podcast',
+        'submit_edit' => 'Save podcast',
+    ],
+    'category_options' => [
+        'uncategorized' => 'uncategorized',
+        'arts' => 'Arts',
+        'business' => 'Business',
+        'comedy' => 'Comedy',
+        'education' => 'Education',
+        'fiction' => 'Fiction',
+        'government' => 'Government',
+        'health_and_fitness' => 'Health &amp Fitness',
+        'history' => 'History',
+        'kids_and_family' => 'Kids &amp Family',
+        'leisure' => 'Leisure',
+        'music' => 'Music',
+        'news' => 'News',
+        'religion_and_spirituality' => 'Religion &amp Spirituality',
+        'science' => 'Science',
+        'society_and_culture' => 'Society &amp Culture',
+        'sports' => 'Sports',
+        'technology' => 'Technology',
+        'true_crime' => 'True Crime',
+        'tv_and_film' => 'TV &amp Film',
+        'books' => 'Books',
+        'design' => 'Design',
+        'fashion_and_beauty' => 'Fashion &amp Beauty',
+        'food' => 'Food',
+        'performing_arts' => 'Performing Arts',
+        'visual_arts' => 'Visual Arts',
+        'careers' => 'Careers',
+        'entrepreneurship' => 'Entrepreneurship',
+        'investing' => 'Investing',
+        'management' => 'Management',
+        'marketing' => 'Marketing',
+        'non_profit' => 'Non-Profit',
+        'comedy_interviews' => 'Comedy Interviews',
+        'improv' => 'Improv',
+        'stand_up' => 'Stand-Up',
+        'courses' => 'Courses',
+        'how_to' => 'How To',
+        'language_learning' => 'Language Learning',
+        'self_improvement' => 'Self-Improvement',
+        'comedy_fiction' => 'Comedy Fiction',
+        'drama' => 'Drama',
+        'science_fiction' => 'Science Fiction',
+        'alternative_health' => 'Alternative Health',
+        'fitness' => 'Fitness',
+        'medicine' => 'Medicine',
+        'mental_health' => 'Mental Health',
+        'nutrition' => 'Nutrition',
+        'sexuality' => 'Sexuality',
+        'education_for_kids' => 'Education for Kids',
+        'parenting' => 'Parenting',
+        'pets_and_animals' => 'Pets &amp Animals',
+        'stories_for_kids' => 'Stories for Kids',
+        'animation_and_manga' => 'Animation &amp Manga',
+        'automotive' => 'Automotive',
+        'aviation' => 'Aviation',
+        'crafts' => 'Crafts',
+        'games' => 'Games',
+        'hobbies' => 'Hobbies',
+        'home_and_garden' => 'Home &amp Garden',
+        'video_games' => 'Video Games',
+        'music_commentary' => 'Music Commentary',
+        'music_history' => 'Music History',
+        'music_interviews' => 'Music Interviews',
+        'business_news' => 'Business News',
+        'daily_news' => 'Daily News',
+        'entertainment_news' => 'Entertainment News',
+        'news_commentary' => 'News Commentary',
+        'politics' => 'Politics',
+        'sports_news' => 'Sports News',
+        'tech_news' => 'Tech News',
+        'buddhism' => 'Buddhism',
+        'christianity' => 'Christianity',
+        'hinduism' => 'Hinduism',
+        'islam' => 'Islam',
+        'judaism' => 'Judaism',
+        'religion' => 'Religion',
+        'spirituality' => 'Spirituality',
+        'astronomy' => 'Astronomy',
+        'chemistry' => 'Chemistry',
+        'earth_sciences' => 'Earth Sciences',
+        'life_sciences' => 'Life Sciences',
+        'mathematics' => 'Mathematics',
+        'natural_sciences' => 'Natural Sciences',
+        'nature' => 'Nature',
+        'physics' => 'Physics',
+        'social_sciences' => 'Social Sciences',
+        'documentary' => 'Documentary',
+        'personal_journals' => 'Personal Journals',
+        'philosophy' => 'Philosophy',
+        'places_and_travel' => 'Places &amp Travel',
+        'relationships' => 'Relationships',
+        'baseball' => 'Baseball',
+        'basketball' => 'Basketball',
+        'cricket' => 'Cricket',
+        'fantasy_sports' => 'Fantasy Sports',
+        'football' => 'Football',
+        'golf' => 'Golf',
+        'hockey' => 'Hockey',
+        'rugby' => 'Rugby',
+        'running' => 'Running',
+        'soccer' => 'Soccer',
+        'swimming' => 'Swimming',
+        'tennis' => 'Tennis',
+        'volleyball' => 'Volleyball',
+        'wilderness' => 'Wilderness',
+        'wrestling' => 'Wrestling',
+        'after_shows' => 'After Shows',
+        'film_history' => 'Film History',
+        'film_interviews' => 'Film Interviews',
+        'film_reviews' => 'Film Reviews',
+        'tv_reviews' => 'TV Reviews',
+    ],
+    'publish_form' => [
+        'back_to_podcast_dashboard' => 'Back to podcast dashboard',
+        'post' => 'Your announcement post',
+        'post_hint' =>
+            "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.",
+        'message_placeholder' => 'Write your message…',
+        'submit' => 'Publish',
+        'publication_date' => 'Publication date',
+        'publication_method' => [
+            'now' => 'Now',
+            'schedule' => 'Schedule',
+        ],
+        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date_hint' =>
+            'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
+        'submit_edit' => 'Edit publication',
+        'cancel_publication' => 'Cancel publication',
+        'message_warning' => 'You did not write a message for your announcement post!',
+        'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.',
+        'message_warning_submit' => 'Publish anyway',
+    ],
+    'publication_status_banner' => [
+        'draft_mode' => 'draft mode',
+        'not_published' => 'This podcast is not yet published.',
+        'scheduled' => 'This podcast is scheduled for publication on {publication_date}.',
+    ],
+    'delete_form' => [
+        'disclaimer' =>
+            "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.",
+        'understand' => 'I understand, I want the podcast to be permanently deleted',
+        'submit' => 'Delete',
+    ],
+    'by' => 'By {publisher}',
+    'season' => 'Season {seasonNumber}',
+    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Season {seasonNumber} episodes ({episodeCount})',
+    'no_episode' => 'No episode found!',
+    'follow' => 'Follow',
+    'followers' => '{numberOfFollowers, plural,
+        one {# follower}
+        other {# followers}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {# post}
+        other {# posts}
+    }',
+    'activity' => 'Activity',
+    'episodes' => 'Episodes',
+    'sponsor' => 'Sponsor',
+    'funding_links' => 'Funding links for {podcastTitle}',
+    'find_on' => 'Find {podcastTitle} on',
+    'listen_on' => 'Listen on',
+];
diff --git a/modules/Admin/Language/fr_trad/PodcastImport.php b/modules/Admin/Language/fr_trad/PodcastImport.php
new file mode 100644
index 0000000000..7c3ef67d1f
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/PodcastImport.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'warning' =>
+        'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.',
+    'old_podcast_section_title' => 'The podcast to import',
+    'old_podcast_section_subtitle' =>
+        'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.',
+    'imported_feed_url' => 'Feed URL',
+    'imported_feed_url_hint' => 'The feed must be in xml or rss format.',
+    'new_podcast_section_title' => 'The new podcast',
+    'advanced_params_section_title' => 'Advanced parameters',
+    'advanced_params_section_subtitle' =>
+        'Keep the default values if you have no idea of what the fields are for.',
+    'slug_field' => 'Field to be used to calculate episode slug',
+    'description_field' =>
+        'Source field used for episode description / show notes',
+    'force_renumber' => 'Force episodes renumbering',
+    'force_renumber_hint' =>
+        'Use this if your podcast does not have episode numbers but wish to set them during import.',
+    'season_number' => 'Season number',
+    'season_number_hint' =>
+        'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.',
+    'max_episodes' => 'Maximum number of episodes to import',
+    'max_episodes_hint' => 'Leave blank to import all episodes',
+    'lock_import' =>
+        'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.',
+    'submit' => 'Import podcast',
+];
diff --git a/modules/Admin/Language/fr_trad/PodcastNavigation.php b/modules/Admin/Language/fr_trad/PodcastNavigation.php
new file mode 100644
index 0000000000..b4d7ddc089
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/PodcastNavigation.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'go_to_page' => 'Go to podcast page',
+    'dashboard' => 'Podcast dashboard',
+    'podcast-view' => 'Home',
+    'podcast-edit' => 'Edit podcast',
+    'podcast-persons-manage' => 'Manage persons',
+    'episodes' => 'Episodes',
+    'episode-list' => 'All episodes',
+    'episode-create' => 'New episode',
+    'analytics' => 'Analytics',
+    'podcast-analytics' => 'Audience overview',
+    'podcast-analytics-webpages' => 'Web pages visits',
+    'podcast-analytics-locations' => 'Locations',
+    'podcast-analytics-unique-listeners' => 'Unique listeners',
+    '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',
+    'platforms' => 'External platforms',
+    'platforms-podcasting' => 'Podcasting',
+    'platforms-social' => 'Social networks',
+    'platforms-funding' => 'Funding',
+];
diff --git a/modules/Admin/Language/fr_trad/Settings.php b/modules/Admin/Language/fr_trad/Settings.php
new file mode 100644
index 0000000000..4a70dcbaa0
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Settings.php
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'General settings',
+    'instance' => [
+        'title' => 'Instance',
+        'site_icon' => 'Site icon',
+        'site_icon_delete' => 'Delete site icon',
+        'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.',
+        'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.',
+        'site_name' => 'Site name',
+        'site_description' => 'Site description',
+        'submit' => 'Save',
+        'editSuccess' => 'Instance has been updated successfully!',
+        'deleteIconSuccess' => 'Site icon has been remove successfully!',
+    ],
+    'images' => [
+        'title' => 'Images',
+        'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.',
+        'regenerate' => 'Regenerate images',
+        'regenerationSuccess' => 'All images have been regenerated successfully!',
+    ],
+    'housekeeping' => [
+        'title' => 'Housekeeping',
+        'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.',
+        'reset_counts' => 'Reset counts',
+        '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',
+        'runSuccess' => 'Housekeeping has been run successfully!',
+    ],
+    'theme' => [
+        'title' => 'Theme',
+        'accent_section_title' => 'Accent color',
+        'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.',
+        'pine' => 'Pine',
+        'crimson' => 'Crimson',
+        'amber' => 'Amber',
+        'lake' => 'Lake',
+        'jacaranda' => 'Jacaranda',
+        'onyx' => 'Onyx',
+        'submit' => 'Save',
+        'setInstanceThemeSuccess' => 'Theme has been updated successfully!',
+    ],
+];
diff --git a/modules/Admin/Language/fr_trad/Soundbite.php b/modules/Admin/Language/fr_trad/Soundbite.php
new file mode 100644
index 0000000000..a3f828fe09
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Soundbite.php
@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'list' => [
+        'title' => 'Soundbites',
+        'soundbite' => 'Soundbite',
+    ],
+    'messages' => [
+        'createSuccess' => 'Soundbite has been successfully created!',
+        'deleteSuccess' => 'Soundbite has been successfully removed!',
+    ],
+    'form' => [
+        'title' => 'New soundbite',
+        'soundbite_title' => 'Soundbite title',
+        'start_time' => 'Start at',
+        'duration' => 'Duration',
+        'submit' => 'Create soundbite',
+    ],
+    'play' => 'Play soundbite',
+    'stop' => 'Stop soundbite',
+    'create' => 'New soundbite',
+    'delete' => 'Delete soundbite',
+];
diff --git a/modules/Admin/Language/fr_trad/Validation.php b/modules/Admin/Language/fr_trad/Validation.php
new file mode 100644
index 0000000000..3bc78cfe18
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/Validation.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'min_dims' =>
+        '{field} is either not an image, or it is not wide or tall enough.',
+    'is_image_ratio' =>
+        '{field} is either not an image or not of the right ratio.',
+];
diff --git a/modules/Admin/Language/fr_trad/VideoClip.php b/modules/Admin/Language/fr_trad/VideoClip.php
new file mode 100644
index 0000000000..638de697bb
--- /dev/null
+++ b/modules/Admin/Language/fr_trad/VideoClip.php
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'list' => [
+        'title' => 'Video clips',
+        'status' => [
+            'label' => 'Status',
+            'queued' => 'queued',
+            'queued_hint' => 'Clip is waiting to be processed.',
+            'pending' => 'pending',
+            'pending_hint' => 'Clip will be generated shortly.',
+            'running' => 'running',
+            'running_hint' => 'Clip is being generated.',
+            'failed' => 'failed',
+            'failed_hint' => 'Clip could not be generated: script failure.',
+            'passed' => 'passed',
+            'passed_hint' => 'Clip was generated successfully!',
+        ],
+        'clip' => 'Clip',
+        'duration' => 'Job duration',
+    ],
+    'title' => 'Video clip: {videoClipLabel}',
+    'download_clip' => 'Download clip',
+    'create' => 'New video clip',
+    'go_to_page' => 'Go to clip page',
+    'retry' => 'Retry clip generation',
+    'delete' => 'Delete clip',
+    'logs' => 'Job logs',
+    'messages' => [
+        'alreadyExistingError' => 'The video clip you are trying to create already exists!',
+        'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!',
+        'deleteSuccess' => 'Video clip has been successfully removed!',
+    ],
+    'format' => [
+        'landscape' => 'Landscape',
+        'portrait' => 'Portrait',
+        'squared' => 'Squared',
+    ],
+    'form' => [
+        'title' => 'New video clip',
+        'params_section_title' => 'Video clip parameters',
+        'clip_title' => 'Clip title',
+        'format' => [
+            'label' => 'Choose a format',
+            'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.',
+            'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.',
+            'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.',
+        ],
+        'theme' => 'Select a theme',
+        'start_time' => 'Start at',
+        'duration' => 'Duration',
+        'trim_start' => 'Trim start',
+        'trim_end' => 'Trim end',
+        'submit' => 'Create video clip',
+    ],
+    'requirements' => [
+        'title' => 'Missing requirements',
+        'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!',
+        'ffmpeg' => 'FFmpeg',
+        'gd' => 'Graphics Draw (GD)',
+        'freetype' => 'Freetype library for GD',
+        'transcript' => 'Transcript file (.srt)',
+    ],
+];
diff --git a/modules/Admin/Language/gd/Charts.php b/modules/Admin/Language/gd/Charts.php
index 4b33530ef0..6ede251094 100644
--- a/modules/Admin/Language/gd/Charts.php
+++ b/modules/Admin/Language/gd/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/gd/Episode.php b/modules/Admin/Language/gd/Episode.php
index 713b517b0c..5ed5e3acef 100644
--- a/modules/Admin/Language/gd/Episode.php
+++ b/modules/Admin/Language/gd/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/gl/Charts.php b/modules/Admin/Language/gl/Charts.php
index edd2f8af1f..0e232ad42e 100644
--- a/modules/Admin/Language/gl/Charts.php
+++ b/modules/Admin/Language/gl/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Ancho de banda diario utilizado (en MB)',
     'total_storage_by_month' => 'Almacenaxe mensual (en MB)',
     'total_bandwidth_by_month' => 'Ancho de banda mensual utilizado (en MB)',
+    'total_bandwidth_by_month_limit' => 'Limitado a {totalBandwidth} ao mes',
 ];
diff --git a/modules/Admin/Language/gl/Countries.php b/modules/Admin/Language/gl/Countries.php
index 587c4d49a5..6731e92307 100644
--- a/modules/Admin/Language/gl/Countries.php
+++ b/modules/Admin/Language/gl/Countries.php
@@ -15,22 +15,22 @@ return [
     'AE' => 'Emiratos Árabes Unidos',
     'AF' => 'Afganistán',
     'AG' => 'Antigua e Barbuda',
-    'AI' => 'Anguilla',
+    'AI' => 'Anguila',
     'AL' => 'Albania',
     'AM' => 'Armenia',
     'AO' => 'Angola',
-    'AQ' => 'Antarctica',
-    'AR' => 'Argentina',
-    'AS' => 'American Samoa',
+    'AQ' => 'Antártida',
+    'AR' => 'Arxentina',
+    'AS' => 'Samoa Americana',
     'AT' => 'Austria',
     'AU' => 'Australia',
     'AW' => 'Aruba',
-    'AX' => 'Åland Islands',
-    'AZ' => 'Azerbaijan',
-    'BA' => 'Bosnia and Herzegovina',
+    'AX' => 'Illas Åland',
+    'AZ' => 'Acerbaixán',
+    'BA' => 'Bosnia e Hercegovina',
     'BB' => 'Barbados',
     'BD' => 'Bangladesh',
-    'BE' => 'Belgium',
+    'BE' => 'Bélxica',
     'BF' => 'Burkina Faso',
     'BG' => 'Bulgaria',
     'BH' => 'Bahrain',
diff --git a/modules/Admin/Language/gl/Episode.php b/modules/Admin/Language/gl/Episode.php
index 7e28539cc2..3d7c5c7688 100644
--- a/modules/Admin/Language/gl/Episode.php
+++ b/modules/Admin/Language/gl/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episodio',
         'visibility' => 'Visibilidade',
+        'downloads' => 'Downloads',
         'comments' => 'Comentarios',
         'actions' => 'Accións',
     ],
diff --git a/modules/Admin/Language/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php
index db7d7d0707..821a8ec4a7 100644
--- a/modules/Admin/Language/gl/Podcast.php
+++ b/modules/Admin/Language/gl/Podcast.php
@@ -48,39 +48,39 @@ return [
             other {# episodios foron engadidos}
         } ao podcast!',
         'podcastFeedUpToDate' => 'O podcast xa está ao día.',
-        'podcastNotImported' => 'Podcast could not be updated as it was not imported.',
-        'publishError' => 'This podcast is either already published or scheduled for publication.',
-        'publishEditError' => 'This podcast is not scheduled for publication.',
-        'publishCancelSuccess' => 'Podcast publication successfully cancelled!',
-        'scheduleDateError' => 'Schedule date must be set!',
+        'podcastNotImported' => 'Non se actualizou o podcast porque non fora importado.',
+        'publishError' => 'Este podcast ou ben xa foi publicado ou está programada a súa publicación.',
+        'publishEditError' => 'Este podcast non ten a publicación programada.',
+        'publishCancelSuccess' => 'Cancelouse correctamente a publicación do podcast!',
+        'scheduleDateError' => 'Hai que establecer a data da publicación!',
     ],
     'form' => [
-        'identity_section_title' => 'Podcast identity',
-        'identity_section_subtitle' => 'These fields allow you to get noticed.',
-        'cover' => 'Podcast cover',
-        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
-        'banner' => 'Podcast banner',
-        'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
-        'banner_delete' => 'Delete podcast banner',
-        'title' => 'Title',
-        'handle' => 'Handle',
+        'identity_section_title' => 'Identidade do podcast',
+        'identity_section_subtitle' => 'Estes campos permítenche recibir notificacións.',
+        'cover' => 'Portada do podcast',
+        'cover_size_hint' => 'A portada ten que ser cadrada e como mínimo de 1400px de alto e ancho.',
+        'banner' => 'Cabeceira do podcast',
+        'banner_size_hint' => 'A imaxe de cabeceira debe ter proporción 3:1 e 1500px. como mínimo.',
+        'banner_delete' => 'Eliminar cabeceira do podcast',
+        'title' => 'Título',
+        'handle' => 'Identificador',
         'handle_hint' =>
-            'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.',
+            'Utilizado para identificar o podcast. Permítense maiúsculas, minúsculas, números e trazo baixo.',
         'type' => [
-            'label' => 'Type',
-            'episodic' => 'Episodic',
-            'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.',
-            'serial' => 'Serial',
-            'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.',
+            'label' => 'Tipo',
+            'episodic' => 'Recurrente',
+            'episodic_hint' => 'Se os episodios non teñen unha orde predeterminada para ser escoitados. Os novos episodios serán mostrados antes.',
+            'serial' => 'Serie',
+            'serial_hint' => 'Se os episodios teñen unha orde secuencial establecida. Os episodios máis antigos aparecerán primeiro.',
         ],
-        'description' => 'Description',
-        'classification_section_title' => 'Classification',
+        'description' => 'Descrición',
+        'classification_section_title' => 'Clasificación',
         'classification_section_subtitle' =>
-            'These fields will impact your audience and competition.',
-        'language' => 'Language',
-        'category' => 'Category',
-        'category_placeholder' => 'Select a category…',
-        'other_categories' => 'Other categories',
+            'Estos campos terán impacto na túa audiencia e competencia.',
+        'language' => 'Idioma',
+        'category' => 'Categoría',
+        'category_placeholder' => 'Elixe unha categoría…',
+        'other_categories' => 'Outras categorías',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does it contain explicit content?',
diff --git a/modules/Admin/Language/id/Charts.php b/modules/Admin/Language/id/Charts.php
index 4b33530ef0..6ede251094 100644
--- a/modules/Admin/Language/id/Charts.php
+++ b/modules/Admin/Language/id/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/id/Episode.php b/modules/Admin/Language/id/Episode.php
index 713b517b0c..5ed5e3acef 100644
--- a/modules/Admin/Language/id/Episode.php
+++ b/modules/Admin/Language/id/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/it/Charts.php b/modules/Admin/Language/it/Charts.php
index 383d7bf8e9..88455fc286 100644
--- a/modules/Admin/Language/it/Charts.php
+++ b/modules/Admin/Language/it/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/it/Episode.php b/modules/Admin/Language/it/Episode.php
index 2e5a267315..a05f6147ca 100644
--- a/modules/Admin/Language/it/Episode.php
+++ b/modules/Admin/Language/it/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/ko/Charts.php b/modules/Admin/Language/ko/Charts.php
index 4b33530ef0..6ede251094 100644
--- a/modules/Admin/Language/ko/Charts.php
+++ b/modules/Admin/Language/ko/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/ko/Episode.php b/modules/Admin/Language/ko/Episode.php
index 713b517b0c..5ed5e3acef 100644
--- a/modules/Admin/Language/ko/Episode.php
+++ b/modules/Admin/Language/ko/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/nl/Charts.php b/modules/Admin/Language/nl/Charts.php
index 6f2b1ea50e..0071e69f42 100644
--- a/modules/Admin/Language/nl/Charts.php
+++ b/modules/Admin/Language/nl/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Dagelijks gebruikte bandbreedte (in MB)',
     'total_storage_by_month' => 'Maandelijkse opslagruimte (in MB)',
     'total_bandwidth_by_month' => 'Maandelijkse gebruikte bandbreedte (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/nl/Episode.php b/modules/Admin/Language/nl/Episode.php
index 7b3f428c52..ffd05f72ae 100644
--- a/modules/Admin/Language/nl/Episode.php
+++ b/modules/Admin/Language/nl/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Aflevering',
         'visibility' => 'Zichtbaarheid',
+        'downloads' => 'Downloads',
         'comments' => 'Reacties',
         'actions' => 'Acties',
     ],
diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php
index b7f9485f69..3f1753d39a 100644
--- a/modules/Admin/Language/nn-NO/Breadcrumb.php
+++ b/modules/Admin/Language/nn-NO/Breadcrumb.php
@@ -14,19 +14,19 @@ return [
         ->gateway => 'Heim',
     'podcasts' => 'podkastar',
     'episodes' => 'episodar',
-    'subscriptions' => 'subscriptions',
+    'subscriptions' => 'tingingar',
     'contributors' => 'bidragsytarar',
     'pages' => 'sider',
     'settings' => 'innstillingar',
     'theme' => 'bunad',
-    'about' => 'about',
+    'about' => 'om',
     'add' => 'legg til',
     'new' => 'ny',
     'edit' => 'rediger',
     'persons' => 'personar',
     'publish' => 'legg ut',
     'publish-edit' => 'rediger publiseringa',
-    'publish-date-edit' => 'edit publication date',
+    'publish-date-edit' => 'rediger publiseringsdato',
     'unpublish' => 'avpubliser',
     'delete' => 'slett',
     'remove' => 'remove',
diff --git a/modules/Admin/Language/nn-NO/Charts.php b/modules/Admin/Language/nn-NO/Charts.php
index c0880f32ae..0070600d50 100644
--- a/modules/Admin/Language/nn-NO/Charts.php
+++ b/modules/Admin/Language/nn-NO/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Dagleg bandbreidde (i MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/nn-NO/Episode.php b/modules/Admin/Language/nn-NO/Episode.php
index ab6ebe91e5..cbd0205512 100644
--- a/modules/Admin/Language/nn-NO/Episode.php
+++ b/modules/Admin/Language/nn-NO/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Synlegheit',
+        'downloads' => 'Downloads',
         'comments' => 'Kommentarar',
         'actions' => 'Handlingar',
     ],
diff --git a/modules/Admin/Language/oc/Charts.php b/modules/Admin/Language/oc/Charts.php
index 4b33530ef0..6ede251094 100644
--- a/modules/Admin/Language/oc/Charts.php
+++ b/modules/Admin/Language/oc/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/oc/Episode.php b/modules/Admin/Language/oc/Episode.php
index 713b517b0c..5ed5e3acef 100644
--- a/modules/Admin/Language/oc/Episode.php
+++ b/modules/Admin/Language/oc/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/pl/AboutCastopod.php b/modules/Admin/Language/pl/AboutCastopod.php
index 3fb62afffe..5e53f38951 100644
--- a/modules/Admin/Language/pl/AboutCastopod.php
+++ b/modules/Admin/Language/pl/AboutCastopod.php
@@ -9,14 +9,14 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => 'About Castopod',
-    'host_name' => 'Host name',
-    'version' => 'Castopod version',
-    'php_version' => 'PHP version',
-    'os' => 'Operating System',
-    'languages' => 'Languages',
-    'update_database' => 'Update database',
+    'title' => 'O CastoPod',
+    'host_name' => 'Nazwa hosta',
+    'version' => 'Wersja Castopod',
+    'php_version' => 'Wersja PHP',
+    'os' => 'System operacyjny',
+    'languages' => 'Języki',
+    'update_database' => 'Aktualizuj bazę danych',
     'messages' => [
-        'databaseUpdateSuccess' => 'Database is up to date!',
+        'databaseUpdateSuccess' => 'Baza danych jest aktualna!',
     ],
 ];
diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php
index ba120541c2..78249d87ab 100644
--- a/modules/Admin/Language/pl/Breadcrumb.php
+++ b/modules/Admin/Language/pl/Breadcrumb.php
@@ -14,25 +14,25 @@ return [
         ->gateway => 'Początek',
     'podcasts' => 'podcasty',
     'episodes' => 'odcinki',
-    'subscriptions' => 'subscriptions',
+    'subscriptions' => 'subskrypcja',
     'contributors' => 'kontrybutorzy',
     'pages' => 'strony',
     'settings' => 'ustawienia',
     'theme' => 'motyw',
-    'about' => 'about',
+    'about' => 'informacje',
     'add' => 'dodaj',
     'new' => 'nowy',
     'edit' => 'edytuj',
     'persons' => 'osoby',
     'publish' => 'publikuj',
     'publish-edit' => 'edytuj publikację',
-    'publish-date-edit' => 'edit publication date',
+    'publish-date-edit' => 'edytuj datę publikacji',
     'unpublish' => 'cofnij publikację',
     'delete' => 'usuń',
-    'remove' => 'remove',
+    'remove' => 'usuń',
     'fediverse' => 'fediverse',
-    'blocked-actors' => 'blocked actors',
-    'blocked-domains' => 'blocked domains',
+    'blocked-actors' => 'zablokowani aktorzy',
+    'blocked-domains' => 'zablokowane domeny',
     'users' => 'użytkownicy',
     'my-account' => 'moje konto',
     'change-password' => 'zmień hasło',
@@ -50,6 +50,6 @@ return [
     'soundbites' => 'zajawki',
     'video-clips' => 'klipy wideo',
     'embed' => 'odtwarzacz do osadzenia',
-    'notifications' => 'notifications',
-    'suspend' => 'suspend',
+    'notifications' => 'powiadomienia',
+    'suspend' => 'wstrzymaj',
 ];
diff --git a/modules/Admin/Language/pl/Charts.php b/modules/Admin/Language/pl/Charts.php
index 32eb4e20dc..28b8e92d86 100644
--- a/modules/Admin/Language/pl/Charts.php
+++ b/modules/Admin/Language/pl/Charts.php
@@ -35,6 +35,7 @@ return [
     'by_weekday' => 'Według dnia tygodnia (dla minionych 60 dni)',
     'by_hour' => 'Według pory dnia (dla minionych 60 dni)',
     'podcast_by_bandwidth' => 'Dzienna przepustowość (w MB)',
-    'total_storage_by_month' => 'Monthly storage (in MB)',
-    'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_storage_by_month' => 'Miesięczne przechowywanie (w MB)',
+    'total_bandwidth_by_month' => 'Miesięczne zużycie transferu (w MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/pl/Common.php b/modules/Admin/Language/pl/Common.php
index 183399eeec..8fcbc322e5 100644
--- a/modules/Admin/Language/pl/Common.php
+++ b/modules/Admin/Language/pl/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'Odtwarzanie',
     ],
     'size_limit' => 'Limit rozmiaru: {0}.',
-    'choose_interact' => 'Choose how to interact',
-    'view' => 'View',
+    'choose_interact' => 'Wybierz sposób interakcji',
+    'view' => 'Podgląd',
 ];
diff --git a/modules/Admin/Language/pl/Countries.php b/modules/Admin/Language/pl/Countries.php
index 78a89f0b4f..53f104a8f7 100644
--- a/modules/Admin/Language/pl/Countries.php
+++ b/modules/Admin/Language/pl/Countries.php
@@ -11,7 +11,7 @@ declare(strict_types=1);
  */
 
 return [
-    'AD' => 'Andorra',
+    'AD' => 'Andora',
     'AE' => 'Zjednoczone Emiraty Arabskie',
     'AF' => 'Afganistan',
     'AG' => 'Antigua i Barbuda',
@@ -63,7 +63,7 @@ return [
     'CR' => 'Kostaryka',
     'CU' => 'Kuba',
     'CV' => 'Republika Zielonego Przylądka',
-    'CW' => 'Curaçao',
+    'CW' => 'Curacao',
     'CX' => 'Wyspa Bożego Narodzenia',
     'CY' => 'Cypr',
     'CZ' => 'Czechy',
@@ -121,7 +121,7 @@ return [
     'IR' => 'Iran',
     'IS' => 'Islandia',
     'IT' => 'Włochy',
-    'JE' => 'Jersey',
+    'JE' => 'Wyspa Jersey',
     'JM' => 'Jamajka',
     'JO' => 'Jordania',
     'JP' => 'Japonia',
@@ -146,12 +146,12 @@ return [
     'LT' => 'Litwa',
     'LU' => 'Luksemburg',
     'LV' => 'Łotwa',
-    'LY' => 'Libya',
+    'LY' => 'Libia',
     'MA' => 'Maroko',
     'MC' => 'Monako',
     'MD' => 'Mołdawia',
     'ME' => 'Czarnogóra',
-    'MF' => 'Saint Martin (French part)',
+    'MF' => 'Saint-Martin (Francja)',
     'MG' => 'Madagaskar',
     'MH' => 'Wyspy Marshalla',
     'MK' => 'Macedonia Północna',
@@ -224,7 +224,7 @@ return [
     'SV' => 'Salwador',
     'SX' => 'Sint Maarten',
     'SY' => 'Syria',
-    'SZ' => 'Swaziland',
+    'SZ' => 'Suazi',
     'TC' => 'Turks i Caicos',
     'TD' => 'Czad',
     'TF' => 'Francuskie Terytoria Południowe i Antarktyczne',
diff --git a/modules/Admin/Language/pl/Dashboard.php b/modules/Admin/Language/pl/Dashboard.php
index 881073fd26..b50d444df6 100644
--- a/modules/Admin/Language/pl/Dashboard.php
+++ b/modules/Admin/Language/pl/Dashboard.php
@@ -9,20 +9,20 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Admin dashboard',
-    'welcome_message' => 'Welcome to the admin area!',
+    'home' => 'Pulpit administratora',
+    'welcome_message' => 'Witamy w panelu administracyjnym!',
     'podcasts' => [
-        'title' => 'Podcasts',
-        'not_found' => 'No published podcast',
-        'last_published' => 'Last published on {lastPublicationDate}',
+        'title' => 'Podcasty',
+        'not_found' => 'Brak opublikowanych podcastów',
+        'last_published' => 'Ostatnio opublikowane {lastPublicationDate}',
     ],
     'episodes' => [
-        'title' => 'Episodes',
-        'not_found' => 'No published episode',
-        'last_published' => 'Last published on {lastPublicationDate}',
+        'title' => 'Odcinki',
+        'not_found' => 'Brak opublikowanych odcinków',
+        'last_published' => 'Ostatnio opublikowane {lastPublicationDate}',
     ],
     'storage' => [
-        'title' => 'Storage',
-        'subtitle' => '{totalUploaded} out of {totalStorage}',
+        'title' => 'Pamięć',
+        'subtitle' => '{totalUploaded} z {totalStorage}',
     ],
 ];
diff --git a/modules/Admin/Language/pl/Episode.php b/modules/Admin/Language/pl/Episode.php
index 4cb167b367..2527d37faa 100644
--- a/modules/Admin/Language/pl/Episode.php
+++ b/modules/Admin/Language/pl/Episode.php
@@ -25,37 +25,39 @@ return [
     'edit' => 'Edytuj',
     'publish' => 'Publikuj',
     'publish_edit' => 'Edytuj publikację',
-    'publish_date_edit' => 'Edit publication date',
+    'publish_date_edit' => 'Edytuj datę publikacji',
     '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!',
+    'publish_date_edit_error' => 'Odcinek nie został jeszcze opublikowany, nie możesz edytować daty jego publikacji.',
+    'publish_date_edit_future_error' => 'Data publikacji odcinka może być ustawiona tylko na przeszłą datę! Jeśli chcesz ją ponownie zaplanować, należy najpierw ją odpublikować.',
+    'publish_date_edit_success' => 'Data publikacji odcinka została pomyślnie zaktualizowana!',
     'unpublish_error' => 'Odcinek nie jest opublikowany.',
     'delete' => 'Usuń',
     'go_to_page' => 'Przejdź do strony',
     'create' => 'Dodaj odcinek',
     'publication_status' => [
         'published' => 'Opublikowany',
-        'with_podcast' => 'Published',
+        'with_podcast' => 'Opublikowano',
         'scheduled' => 'Zaplanowany',
         'not_published' => 'Nieopublikowany',
     ],
-    'with_podcast_hint' => 'To be published at the same time as the podcast',
+    'with_podcast_hint' => 'Opublikowany w tym samym czasie co podcast',
     'list' => [
         'search' => [
-            'placeholder' => 'Search for an episode',
-            'clear' => 'Clear search',
-            'submit' => 'Search',
+            'placeholder' => 'Szukaj odcinka',
+            'clear' => 'Wyczyść wyszukiwanie',
+            'submit' => 'Szukaj',
         ],
         'number_of_episodes' => '{numberOfEpisodes, plural,
-            one {# episode}
-            other {# episodes}
-        }',
+        one {# osoba}
+        few {# osoby}
+        other {# osób}
+    }',
         'episode' => 'Odcinek',
         'visibility' => 'Widoczność',
+        'downloads' => 'Downloads',
         'comments' => 'Komentarze',
         'actions' => 'Działania',
     ],
@@ -63,31 +65,31 @@ return [
         'createSuccess' => 'Odcinek został pomyślnie utworzony!',
         'editSuccess' => 'Odcinek został pomyślnie zaktualizowany!',
         'publishSuccess' => '{publication_status, select,
-            published {Episode successfully published!}
-            scheduled {Episode publication successfully scheduled!}
-            with_podcast {This episode will be published at the same time as the podcast.}
-            other {This episode is not published.}
+            published {Odcinek został pomyślnie opublikowany!}
+            scheduled {Publikacja odcinka pomyślnie zaplanowana!}
+            with_podcast {Ten odcinek zostanie opublikowany w tym samym czasie co podcast.}
+            other {Ten odcinek nie jest opublikowany.}
         }',
-        'publishCancelSuccess' => 'Episode publication successfully cancelled!',
-        'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.',
-        'scheduleDateError' => 'Schedule date must be set!',
-        'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.',
-        'deleteSuccess' => 'Episode successfully deleted!',
-        'deleteError' => 'Failed to delete episode {type, select,
-            transcript {transcript}
-            chapters {chapters}
-            image {cover}
+        'publishCancelSuccess' => 'Publikacja odcinka pomyślnie anulowana!',
+        'unpublishBeforeDeleteTip' => 'Musisz cofnąć publikację odcinka przed jego usunięciem.',
+        'scheduleDateError' => 'Zaplanowana data musi być ustawiona!',
+        'deletePublishedEpisodeError' => 'Musisz cofnąć publikację odcinka przed jego usunięciem.',
+        'deleteSuccess' => 'Odcinek pomyślnie usunięty!',
+        'deleteError' => 'Nie udało się usunąć {type, select,
+            transcript {transkrypcji}
+            chapters {rozdziału}
+            image {okładki}
             audio {audio}
-            other {media}
-        }.',
-        'deleteFileError' => 'Failed to delete {type, select,
-            transcript {transcript}
-            chapters {chapters}
-            image {cover}
+            other {mediów}
+        } odcinka.',
+        'deleteFileError' => 'Nie udało się usunąć {type, select,
+            transcript {transkryptu}
+            chapters {rozdziały}
+            image {okładka}
             audio {audio}
             other {media}
-        } file {file_key}. You may manually remove it from your disk.',
-        'sameSlugError' => 'An episode with the chosen slug already exists.',
+        } plik {file_key}. Możesz ręcznie usunąć go ze swojego dysku.',
+        'sameSlugError' => 'Odcinek z wybranym slugiem już istnieje.',
     ],
     'form' => [
         'file_size_error' =>
@@ -98,7 +100,7 @@ return [
         'cover' => 'Okładka odcinka',
         'cover_hint' =>
             'Jeśli nie ustawisz okładki, zamiast niej zostanie użyta okładka podcastu.',
-        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'cover_size_hint' => 'Okładka musi być kwadratowa o szerokości i wysokości co najmniej 1400 pikseli.',
         'title' => 'Tytuł',
         'title_hint' =>
             'Powinien zawierać jasną i zwięzłą nazwę odcinka. Nie podawaj tutaj numerów odcinków ani sezonów.',
@@ -115,7 +117,7 @@ return [
             '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',
+        'premium' => 'Odcinek musi być dostępny wyłącznie dla subskrybentów premium',
         'parental_advisory' => [
             'label' => 'Kontrola rodzicielska',
             'hint' => 'Czy odcinek zawiera treści dla dorosłych?',
@@ -132,7 +134,7 @@ return [
             'Ten tekst jest dodawany na końcu każdego opisu odcinka; jest to dobre miejsce do wpisania np. linków społecznościowych.',
         'additional_files_section_title' => 'Dodatkowe pliki',
         'additional_files_section_subtitle' =>
-            'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.',
+            'Pliki te mogą być używane przez inne platformy, aby zapewnić lepsze wrażenia odbiorcom. Więcej informacji znajdziesz w {podcastNamespaceLink}.',
         'location_section_title' => 'Lokalizacja',
         'location_section_subtitle' => 'O jakim miejscu jest ten odcinek?',
         'location_name' => 'Nazwa lub adres lokalizacji',
@@ -154,9 +156,9 @@ return [
             'Jeśli potrzebujesz tagów RSS, których Castopod nie obsługuje, ustaw je tutaj.',
         'custom_rss' => 'Własne tagi RSS dla odcinka',
         'custom_rss_hint' => 'Zostaną wstawione w tagu ❬item❭.',
-        'block' => 'Episode should be hidden from public catalogues',
+        'block' => 'Odcinek powinien być ukryty w publicznych katalogach',
         'block_hint' =>
-            'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
+            'Pokazywanie lub ukrywanie odcinka: przełączanie tej funkcji zapobiega pojawieniu się odcinka w podcastach Apple\'a, Google Podcasts, a także aplikacje innych firm, które pobierają z tych katalogów. (Nie sugerowane)',
         'submit_create' => 'Stwórz odcinek',
         'submit_edit' => 'Zapisz odcinek',
     ],
@@ -170,7 +172,7 @@ return [
         'publication_method' => [
             'now' => 'Teraz',
             'schedule' => 'Zaplanuj',
-            'with_podcast' => 'Publish alongside podcast',
+            'with_podcast' => 'Opublikuj obok podcastu',
         ],
         'scheduled_publication_date' => 'Planowana data publikacji',
         'scheduled_publication_date_clear' => 'Wyczyść datę publikacji',
@@ -184,21 +186,21 @@ return [
         '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',
+        'new_publication_date' => 'Nowa data publikacji',
+        'new_publication_date_hint' => 'Musi być ustawiona przeszła data.',
+        'submit' => 'Edytuj datę publikacji',
     ],
     '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.",
+            "Cofnięcie publikacji odcinka spowoduje usunięcie wszystkich powiązanych z nim wpisów i usunięcie go z kanału RSS podcastu.",
         'understand' => 'Rozumiem, chcę cofnąć publikację odcinka',
         'submit' => 'Cofnij publikację',
     ],
     'delete_form' => [
         'disclaimer' =>
-            "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.",
+            "Usunięcie odcinka spowoduje usunięcie wszystkich plików multimedialnych, komentarzy, klipów wideo i powiązanych z nimi dźwięków.",
         'understand' => 'Rozumiem, chcę usunąć odcinek',
-        'submit' => 'Delete',
+        'submit' => 'Usuń',
     ],
     'embed' => [
         'title' => 'Odtwarzacz osadzalny',
diff --git a/modules/Admin/Language/pl/Fediverse.php b/modules/Admin/Language/pl/Fediverse.php
index e35653ae46..2d79854f57 100644
--- a/modules/Admin/Language/pl/Fediverse.php
+++ b/modules/Admin/Language/pl/Fediverse.php
@@ -10,7 +10,7 @@ declare(strict_types=1);
 
 return [
     'messages' => [
-        'actorNotFound' => 'The account could not be found!',
+        'actorNotFound' => 'Nie udało się znaleźć użytkownika!',
         'blockActorSuccess' => '{actor} został zablokowany!',
         'unblockActorSuccess' => 'Actor został odblokowany!',
         'blockDomainSuccess' => '{domain} została zablokowana!',
diff --git a/modules/Admin/Language/pl/Navigation.php b/modules/Admin/Language/pl/Navigation.php
index 3b2b74ca2e..f28a261560 100644
--- a/modules/Admin/Language/pl/Navigation.php
+++ b/modules/Admin/Language/pl/Navigation.php
@@ -33,7 +33,7 @@ return [
     'settings' => 'Ustawienia',
     'settings-general' => 'Ogólne',
     'settings-theme' => 'Motyw',
-    'about' => 'About',
+    'about' => 'Informacje',
     'account' => [
         'my-account' => 'Moje konto',
         'change-password' => 'Zmień hasło',
diff --git a/modules/Admin/Language/pl/Person.php b/modules/Admin/Language/pl/Person.php
index baf670946b..b1143eb70b 100644
--- a/modules/Admin/Language/pl/Person.php
+++ b/modules/Admin/Language/pl/Person.php
@@ -24,7 +24,7 @@ return [
     'form' => [
         'avatar' => 'Awatar',
         'avatar_size_hint' =>
-            'Avatar must be squared and at least 400px wide and tall.',
+            'Awatar musi być kwadratowy o szerokości i wysokości co najmniej 400 pikseli.',
         'full_name' => 'Pełne imię i nazwisko',
         'full_name_hint' => 'To jest pełne imię i nazwisko lub pseudonim osoby.',
         'unique_name' => 'Unikalna nazwa',
diff --git a/modules/Admin/Language/pl/Podcast.php b/modules/Admin/Language/pl/Podcast.php
index 730e30b195..62f674c5c9 100644
--- a/modules/Admin/Language/pl/Podcast.php
+++ b/modules/Admin/Language/pl/Podcast.php
@@ -16,38 +16,38 @@ return [
     'new_episode' => 'Nowy Odcinek',
     'view' => 'Wyświetl podcast',
     'edit' => 'Edytuj podcast',
-    'publish' => 'Publish podcast',
-    'publish_edit' => 'Edit publication',
+    'publish' => 'Opublikuj podcast',
+    'publish_edit' => 'Edytuj publikację',
     'delete' => 'Usuń podcast',
     'see_episodes' => 'Zobacz odcinki',
     'see_contributors' => 'Zobacz kontrybutorów',
     'go_to_page' => 'Idź do strony',
     'latest_episodes' => 'Najnowsze odcinki',
     'see_all_episodes' => 'Zobacz wszystkie odcinki',
-    'draft' => 'Draft',
+    'draft' => 'Wersja robocza',
     'messages' => [
-        'createSuccess' => 'Podcast successfully created!',
+        'createSuccess' => 'Podcast został pomyślnie utworzony!',
         'editSuccess' => 'Podcast został pomyślnie zaktualizowany!',
         'importSuccess' => 'Podcast został pomyślnie zaimportowany!',
-        'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!',
-        'deletePodcastMediaError' => 'Failed to delete podcast {type, select,
-            cover {cover}
-            banner {banner}
-            other {media}
-        }.',
-        'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select,
-            transcript {transcript}
-            chapters {chapters}
-            image {cover}
+        'deleteSuccess' => 'Podcast @{podcast_handle} został pomyślnie usunięty!',
+        'deletePodcastMediaError' => 'Nie udało się usunąć {type, select,
+            cover {okładki}
+            banner {baneru}
+            other {mediów}
+        } podcastu.',
+        'deleteEpisodeMediaError' => 'Nie udało się usunąć {episode_slug} {type, select,
+            transcript {transkrypcji}
+            chapters {rozdziału}
+            image {okładki}
             audio {audio}
-            other {media}
-        }.',
-        'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.',
+            other {mediów}
+        } odcinka.',
+        'deletePodcastMediaFolderError' => 'Nie udało się usunąć folderu podcast {folder_path}. Możesz go ręcznie usunąć ze swojego dysku.',
         'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural,
             one {# episode was}
             other {# episodes were}
         } added to the podcast!',
-        'podcastFeedUpToDate' => 'Podcast is already up to date.',
+        'podcastFeedUpToDate' => 'Podcast jest już aktualny.',
         'podcastNotImported' => 'Podcast could not be updated as it was not imported.',
         'publishError' => 'This podcast is either already published or scheduled for publication.',
         'publishEditError' => 'This podcast is not scheduled for publication.',
diff --git a/modules/Admin/Language/pl/PodcastImport.php b/modules/Admin/Language/pl/PodcastImport.php
index a68c6d0ab5..eeceb4fd16 100644
--- a/modules/Admin/Language/pl/PodcastImport.php
+++ b/modules/Admin/Language/pl/PodcastImport.php
@@ -10,7 +10,7 @@ declare(strict_types=1);
 
 return [
     'warning' =>
-        'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.',
+        'Ta procedura może zająć dużo czasu. Ponieważ bieżąca wersja nie pokazuje żadnego postępu podczas działania, nie zobaczysz żadnych aktualizacji dopóki nie zostanie wykonana. W przypadku błędu przekroczenia limitu czasu, zwiększ wartość `max_execution_time`.',
     'old_podcast_section_title' => 'Podcast do zaimportowania',
     'old_podcast_section_subtitle' =>
         'Upewnij się, że masz prawa do tego podcastu zanim go zaimportujesz. Kopiowanie i nadawanie podcastu bez odpowiednich praw jest piractwem i podlega ściganiu.',
diff --git a/modules/Admin/Language/pl/PodcastNavigation.php b/modules/Admin/Language/pl/PodcastNavigation.php
index 7f3327f157..0309c726b2 100644
--- a/modules/Admin/Language/pl/PodcastNavigation.php
+++ b/modules/Admin/Language/pl/PodcastNavigation.php
@@ -26,8 +26,8 @@ return [
     'podcast-analytics-listening-time' => 'Czas odsłuchu',
     'podcast-analytics-time-periods' => 'Okresy czasu',
     'premium' => 'Premium',
-    'subscription-list' => 'All subscriptions',
-    'subscription-add' => 'Add subscription',
+    'subscription-list' => 'Wszystkie subskrypcje',
+    'subscription-add' => 'Dodaj subskrypcję',
     '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 09bcfde0c4..4bb258f3e0 100644
--- a/modules/Admin/Language/pl/Settings.php
+++ b/modules/Admin/Language/pl/Settings.php
@@ -15,7 +15,7 @@ return [
         'site_icon' => 'Ikona witryny',
         'site_icon_delete' => 'Usuń ikonę witryny',
         'site_icon_hint' => 'Ikony witryny są widoczne na kartach przeglądarki, paskach zakładek oraz po dodaniu witryny jako skrótu na urządzeniach mobilnych.',
-        'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.',
+        'site_icon_helper' => 'Ikona musi być kwadratowa o szerokości i wysokości co najmniej 512 pikseli.',
         'site_name' => 'Nazwa strony',
         'site_description' => 'Opis strony',
         'submit' => 'Zapisz',
@@ -35,8 +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.',
+        'rename_episodes_files' => 'Zmień nazwę plików audio odcinka',
+        'rename_episodes_files_hint' => 'Ta opcja zmieni nazwę wszystkich odcinków plików audio na losowy ciąg znaków. Użyj tego, jeśli jeden z Twoich prywatnych odcinków został ujawniony, ponieważ to skutecznie go ukryje.',
         '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/pl/VideoClip.php b/modules/Admin/Language/pl/VideoClip.php
index 6ff0975255..c4616ace56 100644
--- a/modules/Admin/Language/pl/VideoClip.php
+++ b/modules/Admin/Language/pl/VideoClip.php
@@ -65,7 +65,7 @@ return [
         'title' => 'Brakujące wymagania',
         'missing' => 'Brakuje wymagań. Upewnij się, że dodałeś wszystkie wymagane elementy, aby móc tworzyć wideo do tego odcinka!',
         'ffmpeg' => 'FFmpeg',
-        'gd' => 'Graphics Draw (GD)',
+        'gd' => 'Rysunek graficzny (GD)',
         'freetype' => 'Freetype library dla GD',
         'transcript' => 'Plik z transkrypcją (.srt)',
     ],
diff --git a/modules/Admin/Language/pt-BR/Charts.php b/modules/Admin/Language/pt-BR/Charts.php
index ff2e91d16d..b019648837 100644
--- a/modules/Admin/Language/pt-BR/Charts.php
+++ b/modules/Admin/Language/pt-BR/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Largura de banda usada diária (em MB)',
     'total_storage_by_month' => 'Armazenamento mensal (em MB)',
     'total_bandwidth_by_month' => 'Largura de banda usada mensalmente (em MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-BR/Episode.php
index fbd6d601b5..9d46874325 100644
--- a/modules/Admin/Language/pt-BR/Episode.php
+++ b/modules/Admin/Language/pt-BR/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episódio',
         'visibility' => 'Visibilidade',
+        'downloads' => 'Downloads',
         'comments' => 'Comentários',
         'actions' => 'Ações',
     ],
diff --git a/modules/Admin/Language/pt-BR/PodcastNavigation.php b/modules/Admin/Language/pt-BR/PodcastNavigation.php
index 91e416557d..29e4b78624 100644
--- a/modules/Admin/Language/pt-BR/PodcastNavigation.php
+++ b/modules/Admin/Language/pt-BR/PodcastNavigation.php
@@ -26,8 +26,8 @@ return [
     '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',
+    'subscription-list' => 'Todas as assinaturas',
+    'subscription-add' => 'Adicionar assinatura',
     '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 841460019c..f326a094bd 100644
--- a/modules/Admin/Language/pt-BR/Settings.php
+++ b/modules/Admin/Language/pt-BR/Settings.php
@@ -35,8 +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.',
+        'rename_episodes_files' => 'Renomear os arquivos de áudio de episódios',
+        'rename_episodes_files_hint' => 'Esta opção irá renomear todos os episódios de arquivos de áudio para uma sequência aleatória de caracteres. Use isto se o link de seus episódios privados foi vazado, pois isso irá escondê-los efetivamente.',
         '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/Charts.php b/modules/Admin/Language/pt/Charts.php
index 4b33530ef0..6ede251094 100644
--- a/modules/Admin/Language/pt/Charts.php
+++ b/modules/Admin/Language/pt/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/pt/Episode.php b/modules/Admin/Language/pt/Episode.php
index 713b517b0c..5ed5e3acef 100644
--- a/modules/Admin/Language/pt/Episode.php
+++ b/modules/Admin/Language/pt/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/ro/Charts.php b/modules/Admin/Language/ro/Charts.php
index 4b33530ef0..6ede251094 100644
--- a/modules/Admin/Language/ro/Charts.php
+++ b/modules/Admin/Language/ro/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/ro/Episode.php b/modules/Admin/Language/ro/Episode.php
index 713b517b0c..5ed5e3acef 100644
--- a/modules/Admin/Language/ro/Episode.php
+++ b/modules/Admin/Language/ro/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/ru/Charts.php b/modules/Admin/Language/ru/Charts.php
index 4b33530ef0..6ede251094 100644
--- a/modules/Admin/Language/ru/Charts.php
+++ b/modules/Admin/Language/ru/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
     'total_storage_by_month' => 'Monthly storage (in MB)',
     'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/ru/Episode.php b/modules/Admin/Language/ru/Episode.php
index 713b517b0c..5ed5e3acef 100644
--- a/modules/Admin/Language/ru/Episode.php
+++ b/modules/Admin/Language/ru/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Episode',
         'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
         'comments' => 'Comments',
         'actions' => 'Actions',
     ],
diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php
index 6447345430..f837c95b04 100644
--- a/modules/Admin/Language/sk/Breadcrumb.php
+++ b/modules/Admin/Language/sk/Breadcrumb.php
@@ -31,8 +31,8 @@ return [
     'delete' => 'vymazať',
     'remove' => 'odstrániť',
     'fediverse' => 'fediverse',
-    'blocked-actors' => 'blocked actors',
-    'blocked-domains' => 'blocked domains',
+    'blocked-actors' => 'zablokovaní aktéri',
+    'blocked-domains' => 'zablokované domény',
     'users' => 'používatelia',
     'my-account' => 'môj účet',
     'change-password' => 'zmeniť heslo',
diff --git a/modules/Admin/Language/sk/Charts.php b/modules/Admin/Language/sk/Charts.php
index 8c29dff3ba..17c1187e41 100644
--- a/modules/Admin/Language/sk/Charts.php
+++ b/modules/Admin/Language/sk/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Denný prenos údajov (v MB)',
     'total_storage_by_month' => 'Mesačné úložisko (v MB)',
     'total_bandwidth_by_month' => 'Mesačný prenos údajov (v MB)',
+    'total_bandwidth_by_month_limit' => 'Obmedzený na {totalBandwidth} za mesiac',
 ];
diff --git a/modules/Admin/Language/sk/Countries.php b/modules/Admin/Language/sk/Countries.php
index 870a5a5ba9..305fa5d2c1 100644
--- a/modules/Admin/Language/sk/Countries.php
+++ b/modules/Admin/Language/sk/Countries.php
@@ -187,12 +187,12 @@ Laoská ľudovodemokratická Republika",
     'MW' => 'Malawi',
     'MX' => 'Mexiko',
     'MY' => 'Malajzia',
-    'MZ' => 'Mozambique',
+    'MZ' => 'Mozambik',
     'N/A' => 'Not Applicable (local IP…)',
-    'NA' => 'Namibia',
+    'NA' => 'Namíbia',
     'NC' => 'Nová Kaledónia',
     'NE' => 'Niger',
-    'NF' => 'Norfolk Island',
+    'NF' => 'Ostrov Norfolk',
     'NG' => 'Nigéria',
     'NI' => 'Nikaragua',
     'NL' => 'Holandsko',
@@ -204,58 +204,58 @@ Laoská ľudovodemokratická Republika",
     'OM' => 'Omán',
     'PA' => 'Panama',
     'PE' => 'Peru',
-    'PF' => 'French Polynesia',
-    'PG' => 'Papua New Guinea',
-    'PH' => 'Philippines',
+    'PF' => 'Francúzska Polynézia',
+    'PG' => 'Papua-Nová Guinea',
+    'PH' => 'Filipíny',
     'PK' => 'Pakistan',
-    'PL' => 'Poland',
-    'PM' => 'Saint Pierre and Miquelon',
-    'PN' => 'Pitcairn',
-    'PR' => 'Puerto Rico',
+    'PL' => 'Poľsko',
+    'PM' => 'Svätý Peter a Michal',
+    'PN' => 'Pitcairnove ostrovy',
+    'PR' => 'Portoriko',
     'PS' => 'Palestínske okupované územia',
     'PT' => 'Portugalsko',
     'PW' => 'Palau',
-    'PY' => 'Paraguay',
-    'QA' => 'Qatar',
+    'PY' => 'Paraguaj',
+    'QA' => 'Katar',
     'RE' => 'Réunion',
-    'RO' => 'Romania',
-    'RS' => 'Serbia',
+    'RO' => 'Rumunsko',
+    'RS' => 'Srbsko',
     'RU' => 'Ruská Federácia',
     'RW' => 'Rwanda',
-    'SA' => 'Saudi Arabia',
-    'SB' => 'Solomon Islands',
-    'SC' => 'Seychelles',
-    'SD' => 'Sudan',
-    'SE' => 'Sweden',
-    'SG' => 'Singapore',
-    'SH' => 'Saint Helena, Ascension and Tristan da Cunha',
+    'SA' => 'Saudská Arábia',
+    'SB' => 'Šalamúnove ostrovy',
+    'SC' => 'Seychely',
+    'SD' => 'Sudán',
+    'SE' => 'Švédsko',
+    'SG' => 'Singapur',
+    'SH' => 'Svätá Helena, Ascension a Tristan da Cunha',
     'SI' => 'Slovinsko',
-    'SJ' => 'Svalbard and Jan Mayen',
+    'SJ' => 'Špicbergy a Jan Mayen',
     'SK' => 'Slovensko',
     'SL' => 'Sierra Leone',
-    'SM' => 'San Marino',
+    'SM' => 'San Maríno',
     'SN' => 'Senegal',
     'SO' => 'Somálsko',
-    'SR' => 'Suriname',
+    'SR' => 'Surinam',
     'SS' => 'Južný Sudán',
-    'ST' => 'Sao Tome and Principe',
+    'ST' => 'Svätý Tomáš a Principov ostrov',
     'SV' => 'Salvádor',
     'SX' => 'Sint Maarten (Dutch part)',
-    'SY' => 'Syrian Arab Republic',
+    'SY' => 'Sýrska Arabská Republika',
     'SZ' => 'Svazijsko',
     'TC' => 'Turks and Caicos Islands',
-    'TD' => 'Chad',
+    'TD' => 'Čad',
     'TF' => 'Francúzske južné územia',
     'TG' => 'Togo',
     'TH' => 'Thajsko',
     'TJ' => 'Tadžikistan',
     'TK' => 'Tokelau',
-    'TL' => 'Timor-Leste',
+    'TL' => 'Východný Timor',
     'TM' => 'Turkménsko',
     'TN' => 'Tunisko',
     'TO' => 'Tonga',
     'TR' => 'Turecko',
-    'TT' => 'Trinidad and Tobago',
+    'TT' => 'Trinidad a Tobago',
     'TV' => 'Tuvalu',
     'TW' => 'Taiwan, provincia Číny',
     'TZ' => 'Tanzánia',
diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php
index f44c663aa9..58531d51b6 100644
--- a/modules/Admin/Language/sk/Episode.php
+++ b/modules/Admin/Language/sk/Episode.php
@@ -59,6 +59,7 @@ return [
         }',
         'episode' => 'Epizóda',
         'visibility' => 'Viditeľnosť',
+        'downloads' => 'Downloads',
         'comments' => 'Komentáre',
         'actions' => 'Úkony',
     ],
diff --git a/modules/Admin/Language/sk/EpisodeNavigation.php b/modules/Admin/Language/sk/EpisodeNavigation.php
index 6283072b5e..ccf727da75 100644
--- a/modules/Admin/Language/sk/EpisodeNavigation.php
+++ b/modules/Admin/Language/sk/EpisodeNavigation.php
@@ -13,11 +13,11 @@ return [
     'dashboard' => 'Nástenka epizódy',
     'episode-view' => 'Domov',
     'episode-edit' => 'Upraviť časť',
-    'episode-persons-manage' => 'Manage persons',
+    'episode-persons-manage' => 'Spravovať osobnosti',
     'embed-add' => 'Vnorený prehrávač',
     'clips' => 'Klipy',
     'video-clips-list' => 'Video clips',
     'video-clips-create' => 'New video clip',
     'soundbites-list' => 'Soundbites',
-    'soundbites-create' => 'New soundbite',
+    'soundbites-create' => 'Nová zvučka',
 ];
diff --git a/modules/Admin/Language/sk/Fediverse.php b/modules/Admin/Language/sk/Fediverse.php
index 1a5e0a27e6..01b853277b 100644
--- a/modules/Admin/Language/sk/Fediverse.php
+++ b/modules/Admin/Language/sk/Fediverse.php
@@ -11,22 +11,22 @@ declare(strict_types=1);
 return [
     'messages' => [
         'actorNotFound' => 'Účet nieje možné nájsť!',
-        'blockActorSuccess' => '{actor} has been blocked!',
-        'unblockActorSuccess' => 'Actor has been unblocked!',
+        'blockActorSuccess' => '{actor} bol/i zablokovaný!',
+        'unblockActorSuccess' => 'Aktér bol odblokovaný!',
         'blockDomainSuccess' => '{domain} has been blocked!',
         'unblockDomainSuccess' => '{domain} has been unblocked!',
     ],
-    'blocked_actors' => 'Zablokované účty',
+    'blocked_actors' => 'Blokované účty',
     'blocked_domains' => 'Zablokované domény',
     'block_lists_form' => [
         'handle' => 'Account handle',
         'handle_hint' => 'Input @username@domain account.',
-        'domain' => 'Domain name',
-        'submit' => 'Block!',
+        'domain' => 'Názov domény',
+        'submit' => 'Blokovať!',
     ],
     'list' => [
         'actor' => 'Účet',
-        'domain' => 'Domain name',
-        'unblock' => 'Unblock',
+        'domain' => 'Názov domény',
+        'unblock' => 'Odblokovať',
     ],
 ];
diff --git a/modules/Admin/Language/sk/Install.php b/modules/Admin/Language/sk/Install.php
index 6282e10b95..b3bb16b65b 100644
--- a/modules/Admin/Language/sk/Install.php
+++ b/modules/Admin/Language/sk/Install.php
@@ -13,8 +13,8 @@ return [
     'manual_config_subtitle' =>
         'Create a `.env` file with your settings and refresh the page to continue installation.',
     'form' => [
-        'instance_config' => 'Instance configuration',
-        'hostname' => 'Hostname',
+        'instance_config' => 'Nastavenie inštancie',
+        'hostname' => 'Názov hostiteľa',
         'media_base_url' => 'Media base URL',
         'media_base_url_hint' =>
             'If you use a CDN and/or an external analytics service, you may set them here.',
@@ -24,17 +24,17 @@ return [
         'auth_gateway' => 'Auth gateway',
         'auth_gateway_hint' =>
             'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.',
-        'database_config' => 'Database configuration',
+        'database_config' => 'Nastavenie databázy',
         'database_config_hint' =>
             'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.',
         'db_hostname' => 'Database hostname',
-        'db_name' => 'Database name',
-        'db_username' => 'Database username',
-        'db_password' => 'Database password',
-        'db_prefix' => 'Database prefix',
+        'db_name' => 'Názov databázy',
+        'db_username' => 'Prihlasovacie meno do databázy',
+        'db_password' => 'Heslo databázy',
+        'db_prefix' => 'Prefix databázy',
         'db_prefix_hint' =>
             "The prefix of the Castopod table names, leave as is if you don't know what it means.",
-        'cache_config' => 'Cache configuration',
+        'cache_config' => 'Nastavenie cache',
         'cache_config_hint' =>
             'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.',
         'cache_handler' => 'Obslužný mechanizmus vyrovnávacej pamäte',
diff --git a/modules/Admin/Language/sk/Navigation.php b/modules/Admin/Language/sk/Navigation.php
index 45badfd7f9..b9ef4b1858 100644
--- a/modules/Admin/Language/sk/Navigation.php
+++ b/modules/Admin/Language/sk/Navigation.php
@@ -33,7 +33,7 @@ return [
     'settings' => 'Nastavenia',
     'settings-general' => 'Všeobecné',
     'settings-theme' => 'Vzhľad',
-    'about' => 'About',
+    'about' => 'O',
     'account' => [
         'my-account' => 'Môj účet',
         'change-password' => 'Zmeniť heslo',
diff --git a/modules/Admin/Language/sk/Page.php b/modules/Admin/Language/sk/Page.php
index 72892ebf99..8122ca8113 100644
--- a/modules/Admin/Language/sk/Page.php
+++ b/modules/Admin/Language/sk/Page.php
@@ -15,13 +15,13 @@ return [
     'create' => 'Nová stránka',
     'go_to_page' => 'Prejsť na stránku',
     'edit' => 'Upraviť stránku',
-    'delete' => 'Delete page',
+    'delete' => 'Vymazať stránku',
     'form' => [
-        'title' => 'Title',
-        'permalink' => 'Permalink',
-        'content' => 'Content',
-        'submit_create' => 'Create page',
-        'submit_edit' => 'Save',
+        'title' => 'Názov',
+        'permalink' => 'Trvalý odkaz',
+        'content' => 'Obsah',
+        'submit_create' => 'Vytvoriť stránku',
+        'submit_edit' => 'Uložiť',
     ],
     'messages' => [
         'createSuccess' => 'The page “{pageTitle}” was created successfully!',
diff --git a/modules/Admin/Language/sk/Pager.php b/modules/Admin/Language/sk/Pager.php
index e25ee63810..41adf3d7c3 100644
--- a/modules/Admin/Language/sk/Pager.php
+++ b/modules/Admin/Language/sk/Pager.php
@@ -10,12 +10,12 @@ declare(strict_types=1);
 
 return [
     'pageNavigation' => 'Page navigation',
-    'first' => 'First',
-    'previous' => 'Previous',
-    'next' => 'Next',
-    'last' => 'Last',
-    'older' => 'Older',
-    'newer' => 'Newer',
+    'first' => 'Prvá',
+    'previous' => 'Predošlá',
+    'next' => 'Ďalšia',
+    'last' => 'Posledná',
+    'older' => 'Staršia',
+    'newer' => 'Novšia',
     'invalidTemplate' => '{0} is not a valid Pager template.',
     'invalidPaginationGroup' => '{0} is not a valid Pagination group.',
 ];
diff --git a/modules/Admin/Language/sk/Person.php b/modules/Admin/Language/sk/Person.php
index 5ce1e02f45..38e1f073ec 100644
--- a/modules/Admin/Language/sk/Person.php
+++ b/modules/Admin/Language/sk/Person.php
@@ -9,48 +9,48 @@ declare(strict_types=1);
  */
 
 return [
-    'persons' => 'Persons',
-    'all_persons' => 'All persons',
-    'no_person' => 'Nobody found!',
-    'create' => 'Create a person',
-    'view' => 'View person',
-    'edit' => 'Edit person',
-    'delete' => 'Delete person',
+    'persons' => 'Osobnosti',
+    'all_persons' => 'Všetky osobnosti',
+    'no_person' => 'Nikto nenájdený!',
+    'create' => 'Vytvoriť osobnosť',
+    'view' => 'Ukázať osobnosť',
+    'edit' => 'Upraviť osobnosť',
+    'delete' => 'Vymazať osobnosť',
     'messages' => [
         'createSuccess' => 'Person has been successfully created!',
         'editSuccess' => 'Person has been successfully updated!',
-        'deleteSuccess' => 'Person has been removed!',
+        'deleteSuccess' => 'Osobnosť bol/a odstránená!',
     ],
     'form' => [
         'avatar' => 'Avatar',
         'avatar_size_hint' =>
             'Avatar must be squared and at least 400px wide and tall.',
-        'full_name' => 'Full name',
+        'full_name' => 'Celé meno',
         'full_name_hint' => 'This is the full name or alias of the person.',
-        'unique_name' => 'Unique name',
-        'unique_name_hint' => 'Used for URLs',
+        'unique_name' => 'Unikátne meno',
+        'unique_name_hint' => 'Použité pre URL odkazy',
         'information_url' => 'Information URL',
         'information_url_hint' =>
             'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.',
-        'submit_create' => 'Create person',
-        'submit_edit' => 'Save person',
+        'submit_create' => 'Vytvoriť osobnosť',
+        'submit_edit' => 'Uložiť osobnosť',
     ],
     'podcast_form' => [
-        'title' => 'Manage persons',
-        'add_section_title' => 'Add persons to this podcast',
+        'title' => 'Spravovať osobnosti',
+        'add_section_title' => 'Pridať osobnosti k tomuto podcastu',
         'add_section_subtitle' => 'You may pick several persons and roles.',
-        'persons' => 'Persons',
+        'persons' => 'Osobnosti',
         'persons_hint' =>
             'You may select one or several persons with the same roles. You need to create the persons first.',
-        'roles' => 'Roles',
+        'roles' => 'Úlohy',
         'roles_hint' =>
             'You may select none, one or several roles for a person.',
-        'submit_add' => 'Add person(s)',
-        'remove' => 'Remove',
+        'submit_add' => 'Pridať osob(y)',
+        'remove' => 'Odstrániť',
     ],
     'episode_form' => [
         'title' => 'Spravovať osobnosti',
-        'add_section_title' => 'Add persons to this episode',
+        'add_section_title' => 'Pridať osobnosti k tejto epizóde',
         'add_section_subtitle' => 'You may pick several persons and roles.',
         'persons' => 'Osobnosti',
         'persons_hint' =>
diff --git a/modules/Admin/Language/sk/Platforms.php b/modules/Admin/Language/sk/Platforms.php
index 678bdcbf8c..bd52fd097f 100644
--- a/modules/Admin/Language/sk/Platforms.php
+++ b/modules/Admin/Language/sk/Platforms.php
@@ -15,7 +15,7 @@ return [
     'visible' => 'Zobraziť na úvodnej stránke podcastu?',
     'on_embed' => 'Zobraziť na vnorenom prehrávači?',
     'remove' => 'Remove {platformName}',
-    'submit' => 'Save',
+    'submit' => 'Uložiť',
     'messages' => [
         'updateSuccess' => 'Platform links have been successfully updated!',
         'removeLinkSuccess' => 'The platform link has been removed.',
diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php
index 082d77d0b3..f1c27de20d 100644
--- a/modules/Admin/Language/sk/Podcast.php
+++ b/modules/Admin/Language/sk/Podcast.php
@@ -9,24 +9,24 @@ declare(strict_types=1);
  */
 
 return [
-    'all_podcasts' => 'All podcasts',
-    'no_podcast' => 'No podcast found!',
-    'create' => 'Create podcast',
-    'import' => 'Import podcast',
+    'all_podcasts' => 'Všetky podcasty',
+    'no_podcast' => 'Žiadny podcast nenájdený!',
+    'create' => 'Vytvoriť podcast',
+    'import' => 'Importovať podcast',
     'new_episode' => 'Nová časť',
-    'view' => 'View podcast',
-    'edit' => 'Edit podcast',
-    'publish' => 'Publish podcast',
-    'publish_edit' => 'Edit publication',
-    'delete' => 'Delete podcast',
-    'see_episodes' => 'See episodes',
-    'see_contributors' => 'See contributors',
-    'go_to_page' => 'Go to page',
+    'view' => 'Zobraziť podcast',
+    'edit' => 'Upraviť podcast',
+    'publish' => 'Zverejniť podcast',
+    'publish_edit' => 'Upraviť zverejnené',
+    'delete' => 'Vymazať podcast',
+    'see_episodes' => 'Ukázať časti',
+    'see_contributors' => 'Pozrieť prispievateľov',
+    'go_to_page' => 'Prejsť na stránku',
     'latest_episodes' => 'Posledné časti',
     'see_all_episodes' => 'Pozrieť všetky časti',
-    'draft' => 'Draft',
+    'draft' => 'Koncept',
     'messages' => [
-        'createSuccess' => 'Podcast successfully created!',
+        'createSuccess' => 'Podcast úspešne vytvorený!',
         'editSuccess' => 'Podcast has been successfully updated!',
         'importSuccess' => 'Podcast has been successfully imported!',
         'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!',
@@ -62,25 +62,25 @@ return [
         'banner' => 'Podcast banner',
         'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
         'banner_delete' => 'Delete podcast banner',
-        'title' => 'Title',
+        'title' => 'Názov',
         'handle' => 'Handle',
         'handle_hint' =>
             'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.',
         'type' => [
-            'label' => 'Type',
-            'episodic' => 'Episodic',
+            'label' => 'Typ',
+            'episodic' => 'Epizodický',
             'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.',
             'serial' => 'Serial',
             'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.',
         ],
-        'description' => 'Description',
-        'classification_section_title' => 'Classification',
+        'description' => 'Popis',
+        'classification_section_title' => 'Zaradenie',
         'classification_section_subtitle' =>
             'These fields will impact your audience and competition.',
-        'language' => 'Language',
-        'category' => 'Category',
-        'category_placeholder' => 'Select a category…',
-        'other_categories' => 'Other categories',
+        'language' => 'Jazyk',
+        'category' => 'Kategória',
+        'category_placeholder' => 'Vybrať kategóriu…',
+        'other_categories' => 'Ostatné kategórie',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does it contain explicit content?',
@@ -96,11 +96,11 @@ return [
         'owner_email' => 'Owner email',
         'owner_email_hint' =>
             'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.',
-        'publisher' => 'Publisher',
+        'publisher' => 'Vydavateľ',
         'publisher_hint' =>
             'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.',
         'copyright' => 'Copyright',
-        'location_section_title' => 'Location',
+        'location_section_title' => 'Umiestnenie',
         'location_section_subtitle' => 'What place is this podcast about?',
         'location_name' => 'Location name or address',
         'location_name_hint' => 'This can be a real place or fictional',
@@ -129,12 +129,12 @@ return [
         'update_feed_tip' => 'Import this podcast\'s latest episodes',
         'partnership' => 'Partnership',
         'partner_id' => 'ID',
-        'partner_link_url' => 'Link URL',
-        'partner_image_url' => 'Image URL',
+        'partner_link_url' => 'URL adresa odkazu',
+        'partner_image_url' => 'URL adresa obrázka',
         'partner_id_hint' => 'Your own partner ID',
         'partner_link_url_hint' => 'The generic partner link address',
         'partner_image_url_hint' => 'The generic partner image address',
-        'status_section_title' => 'Status',
+        'status_section_title' => 'Stav',
         'block' => 'Podcast should be hidden from public catalogues',
         'block_hint' =>
             'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
@@ -173,15 +173,15 @@ return [
         'performing_arts' => 'Performing Arts',
         'visual_arts' => 'Visual Arts',
         'careers' => 'Careers',
-        'entrepreneurship' => 'Entrepreneurship',
-        'investing' => 'Investing',
+        'entrepreneurship' => 'Podnikateľský',
+        'investing' => 'Investičný',
         'management' => 'Management',
         'marketing' => 'Marketing',
-        'non_profit' => 'Non-Profit',
+        'non_profit' => 'Neziskový',
         'comedy_interviews' => 'Comedy Interviews',
         'improv' => 'Improv',
         'stand_up' => 'Stand-Up',
-        'courses' => 'Courses',
+        'courses' => 'Kurzy',
         'how_to' => 'How To',
         'language_learning' => 'Language Learning',
         'self_improvement' => 'Self-Improvement',
@@ -190,14 +190,14 @@ return [
         'science_fiction' => 'Science Fiction',
         'alternative_health' => 'Alternative Health',
         'fitness' => 'Fitness',
-        'medicine' => 'Medicine',
+        'medicine' => 'Medicínsky',
         'mental_health' => 'Mental Health',
         'nutrition' => 'Nutrition',
-        'sexuality' => 'Sexuality',
+        'sexuality' => 'Sexualita',
         'education_for_kids' => 'Education for Kids',
         'parenting' => 'Parenting',
         'pets_and_animals' => 'Pets &amp Animals',
-        'stories_for_kids' => 'Stories for Kids',
+        'stories_for_kids' => 'Príbehy pre deti',
         'animation_and_manga' => 'Animation &amp Manga',
         'automotive' => 'Automotive',
         'aviation' => 'Aviation',
@@ -229,14 +229,14 @@ return [
         'life_sciences' => 'Life Sciences',
         'mathematics' => 'Mathematics',
         'natural_sciences' => 'Natural Sciences',
-        'nature' => 'Nature',
-        'physics' => 'Physics',
+        'nature' => 'Príroda',
+        'physics' => 'Fyzika',
         'social_sciences' => 'Social Sciences',
-        'documentary' => 'Documentary',
+        'documentary' => 'Dokumentárny',
         'personal_journals' => 'Personal Journals',
-        'philosophy' => 'Philosophy',
+        'philosophy' => 'Filozofia',
         'places_and_travel' => 'Places &amp Travel',
-        'relationships' => 'Relationships',
+        'relationships' => 'Vzťahy',
         'baseball' => 'Baseball',
         'basketball' => 'Basketball',
         'cricket' => 'Cricket',
@@ -247,19 +247,19 @@ return [
         'rugby' => 'Rugby',
         'running' => 'Running',
         'soccer' => 'Soccer',
-        'swimming' => 'Swimming',
-        'tennis' => 'Tennis',
+        'swimming' => 'Plávanie',
+        'tennis' => 'Tenis',
         'volleyball' => 'Volleyball',
-        'wilderness' => 'Wilderness',
-        'wrestling' => 'Wrestling',
+        'wilderness' => 'Divočina',
+        'wrestling' => 'Zápasnícky',
         'after_shows' => 'After Shows',
-        'film_history' => 'Film History',
-        'film_interviews' => 'Film Interviews',
-        'film_reviews' => 'Film Reviews',
-        'tv_reviews' => 'TV Reviews',
+        'film_history' => 'Filmová história',
+        'film_interviews' => 'Filmové rozhovory',
+        'film_reviews' => 'Filmové recenzie',
+        'tv_reviews' => 'TV recenzie',
     ],
     'publish_form' => [
-        'back_to_podcast_dashboard' => 'Back to podcast dashboard',
+        'back_to_podcast_dashboard' => 'Späť na podcastovú nástenku',
         'post' => 'Your announcement post',
         'post_hint' =>
             "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.",
diff --git a/modules/Admin/Language/sr_Latn/Breadcrumb.php b/modules/Admin/Language/sr_Latn/Breadcrumb.php
index 558b90f765..f9e57ca130 100644
--- a/modules/Admin/Language/sr_Latn/Breadcrumb.php
+++ b/modules/Admin/Language/sr_Latn/Breadcrumb.php
@@ -9,47 +9,47 @@ declare(strict_types=1);
  */
 
 return [
-    'label' => 'breadcrumb',
+    'label' => 'breadcrumb polja',
     config('Admin')
-        ->gateway => 'Home',
-    'podcasts' => 'podcasts',
-    'episodes' => 'episodes',
-    'subscriptions' => 'subscriptions',
-    'contributors' => 'contributors',
-    'pages' => 'pages',
-    'settings' => 'settings',
-    'theme' => 'theme',
-    'about' => 'about',
-    'add' => 'add',
-    'new' => 'new',
-    'edit' => 'edit',
-    'persons' => 'persons',
-    'publish' => 'publish',
-    'publish-edit' => 'edit publication',
-    'publish-date-edit' => 'edit publication date',
-    'unpublish' => 'unpublish',
-    'delete' => 'delete',
-    'remove' => 'remove',
+        ->gateway => 'Početna',
+    'podcasts' => 'podkasti',
+    'episodes' => 'epizode',
+    'subscriptions' => 'pretplate',
+    'contributors' => 'saradnici',
+    'pages' => 'stranice',
+    'settings' => 'podešavanja',
+    'theme' => 'tema',
+    'about' => 'osnovni podaci',
+    'add' => 'dodaj',
+    'new' => 'nov',
+    'edit' => 'izmeni',
+    'persons' => 'osobe',
+    'publish' => 'objavi',
+    'publish-edit' => 'uredi objavu',
+    'publish-date-edit' => 'uredi datum objave',
+    'unpublish' => 'ukolni objavu',
+    'delete' => 'obriši',
+    'remove' => 'ukloni',
     'fediverse' => 'fediverse',
-    'blocked-actors' => 'blocked actors',
-    'blocked-domains' => 'blocked domains',
-    'users' => 'users',
-    'my-account' => 'my account',
-    'change-password' => 'change password',
-    'import' => 'feed import',
-    'platforms' => 'platforms',
-    'social' => 'social networks',
-    'funding' => 'funding',
-    'analytics' => 'analytics',
-    'locations' => 'locations',
-    'webpages' => 'web pages',
-    'unique-listeners' => 'unique listeners',
-    'players' => 'players',
-    'listening-time' => 'listening time',
-    'time-periods' => 'time periods',
-    'soundbites' => 'soundbites',
-    'video-clips' => 'video clips',
-    'embed' => 'embeddable player',
-    'notifications' => 'notifications',
-    'suspend' => 'suspend',
+    'blocked-actors' => 'blokirani nalozi',
+    'blocked-domains' => 'blokirani domeni',
+    'users' => 'korisnici',
+    'my-account' => 'moj nalog',
+    'change-password' => 'promenite lozinku',
+    'import' => 'importuj feed',
+    'platforms' => 'platforme',
+    'social' => 'društvene mreže',
+    'funding' => 'finansiranje',
+    'analytics' => 'analitika',
+    'locations' => 'lokacije',
+    'webpages' => 'veb strane',
+    'unique-listeners' => 'jedinstveni slušaoci',
+    'players' => 'plejeri',
+    'listening-time' => 'ukupno vreme slušanja',
+    'time-periods' => 'vremenski periodi',
+    'soundbites' => 'zvučni isečci',
+    'video-clips' => 'video isečci',
+    'embed' => 'embedovan plejer',
+    'notifications' => 'obaveštenja',
+    'suspend' => 'obustavi',
 ];
diff --git a/modules/Admin/Language/sr_Latn/Charts.php b/modules/Admin/Language/sr_Latn/Charts.php
index 4b33530ef0..cb90b13b87 100644
--- a/modules/Admin/Language/sr_Latn/Charts.php
+++ b/modules/Admin/Language/sr_Latn/Charts.php
@@ -9,32 +9,33 @@ declare(strict_types=1);
  */
 
 return [
-    'by_service_weekly' => 'Episode downloads by service (for the past week)',
-    '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)',
-    'by_os_weekly' => 'Episode downloads by O.S. (for the past week)',
-    'podcast_by_region' => 'Episode downloads by region (for the past week)',
-    'unique_daily_listeners' => 'Daily unique listeners',
-    'unique_monthly_listeners' => 'Monthly unique listeners',
-    'by_browser' => 'Web pages usage by browser (for the past week)',
-    'podcast_by_day' => 'Episode daily downloads',
-    'podcast_by_month' => 'Episode monthly downloads',
-    'episode_by_day' => 'Episode daily downloads (first 60 days)',
-    'episode_by_month' => 'Episode monthly downloads',
+    'by_service_weekly' => 'Preuzimanja epizode po servisu (za prošlu nedelju)',
+    'by_player_weekly' => 'Preuzimanja epizode po plejeru (za prošlu nedelju)',
+    'by_player_yearly' => 'Preuzimanja epizode po plejeru (za prošlu godinu)',
+    'by_device_weekly' => 'Preuzimanja epizode po uređaju (za prošlu nedelju)',
+    'by_os_weekly' => 'Preuzimanja epizode po operativnom sistemu (za prošlu nedelju)',
+    'podcast_by_region' => 'Preuzimanja epizode po regionu (za prošlu nedelju)',
+    'unique_daily_listeners' => 'Svakodnevni jedinstveni slušaoci',
+    'unique_monthly_listeners' => 'Mesečni jedinstveni slušaoci',
+    'by_browser' => 'Korišćenje veb stranica od strane pretraživača (za prošlu nedelju)',
+    'podcast_by_day' => 'Dnevno preuzimanje epizoda',
+    'podcast_by_month' => 'Mesečno preuzimanje epizoda',
+    'episode_by_day' => 'Dnevno preuzimanje epizoda (prvih 60 dana)',
+    'episode_by_month' => 'Mesečno preuzimanje epizoda',
     'episodes_by_day' =>
-        '5 latest episodes downloads (during their first 60 days)',
-    'by_country_weekly' => 'Episode downloads by country (for the past week)',
-    'by_country_yearly' => 'Episode downloads by country (for the past year)',
-    'by_domain_weekly' => 'Web pages visits by source (for the past week)',
-    'by_domain_yearly' => 'Web pages visits by source (for the past year)',
-    'by_entry_page' => 'Web pages visits by landing page (for the past week)',
-    'podcast_bots' => 'Bots (crawlers)',
-    'daily_listening_time' => 'Daily cumulative listening time',
-    'monthly_listening_time' => 'Monthly cumulative listening time',
-    'by_weekday' => 'By week day (for the past 60 days)',
-    'by_hour' => 'By time of day (for the past 60 days)',
-    'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
-    'total_storage_by_month' => 'Monthly storage (in MB)',
-    'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+        'Preuzimanja poslednjih 5 epizoda (u prvih 60 dana)',
+    'by_country_weekly' => 'Preuzimanja epizode po državi (za prošlu nedelju)',
+    'by_country_yearly' => 'Preuzimanja epizode po državi (za prošlu godinu)',
+    'by_domain_weekly' => 'Posete veb stranicama prema izvoru (za prošlu nedelju)',
+    'by_domain_yearly' => 'Posete veb stranicama prema izvoru (za prošlu godinu)',
+    'by_entry_page' => 'Posete veb stranicama prema odredišnoj stranici (za prošlu nedelju)',
+    'podcast_bots' => 'Botovi (pokretači)',
+    'daily_listening_time' => 'Dnevno kumulativno vreme slušanja',
+    'monthly_listening_time' => 'Mesečno kumulativno vreme slušanja',
+    'by_weekday' => 'Po danu u nedelji (za poslednjih 60 dana)',
+    'by_hour' => 'Po dobu dana (za poslednjih 60 dana)',
+    'podcast_by_bandwidth' => 'Dnevno korišćen protok (u MB)',
+    'total_storage_by_month' => 'Mesečni skladišni prostor (u MB)',
+    'total_bandwidth_by_month' => 'Mesečno korišćen protok (u MB)',
+    'total_bandwidth_by_month_limit' => 'Ograničeno na {totalBandwidth} mesečno',
 ];
diff --git a/modules/Admin/Language/sr_Latn/Common.php b/modules/Admin/Language/sr_Latn/Common.php
index 596c8bcdec..0b2b3cdb7a 100644
--- a/modules/Admin/Language/sr_Latn/Common.php
+++ b/modules/Admin/Language/sr_Latn/Common.php
@@ -9,43 +9,43 @@ declare(strict_types=1);
  */
 
 return [
-    'yes' => 'Yes',
-    'no' => 'No',
-    'cancel' => 'Cancel',
-    'optional' => 'Optional',
-    'more' => 'More',
-    'no_data' => 'No data found!',
-    'close' => 'Close',
-    'edit' => 'Edit',
-    'copy' => 'Copy',
-    'copied' => 'Copied!',
-    'home' => 'Home',
-    'explicit' => 'Explicit',
-    'powered_by' => 'Powered by {castopod}',
-    'actions' => 'Actions',
-    'pageInfo' => 'Page {currentPage} out of {pageCount}',
-    'go_back' => 'Go back',
+    'yes' => 'Da',
+    'no' => 'Ne',
+    'cancel' => 'Otkaži',
+    'optional' => 'Opciono',
+    'more' => 'Više',
+    'no_data' => 'Nema pronađenih podataka!',
+    'close' => 'Zatvori',
+    'edit' => 'Izmeni',
+    'copy' => 'Kopiraj',
+    'copied' => 'Kopirano!',
+    'home' => 'Početna stranica',
+    'explicit' => 'Eksplicitno',
+    'powered_by' => 'Pokreće {castopod}',
+    'actions' => 'Akcije',
+    'pageInfo' => 'Stranica {currentPage} od {pageCount}',
+    'go_back' => 'Nazad',
     'forms' => [
         'editor' => [
-            'write' => 'Write',
-            'preview' => 'Preview',
-            'help' => 'Powered by markdown',
+            'write' => 'Piši',
+            'preview' => 'Pregled',
+            'help' => 'Pokreće markdown',
         ],
         'multiSelect' => [
-            'selectText' => 'Press to select',
-            'loadingText' => 'Loading…',
-            'noResultsText' => 'No results found',
-            'noChoicesText' => 'No choices to choose from',
-            'maxItemText' => 'Cannot add more items',
+            'selectText' => 'Pritisni da odabereš',
+            'loadingText' => 'Učitavanje…',
+            'noResultsText' => 'Nije pronađen nijedan rezultat',
+            'noChoicesText' => 'Nema opcija koje je moguće odabrati',
+            'maxItemText' => 'Nije moguće dodati više stavki',
         ],
-        'upload_file' => 'Upload a file',
-        'remote_url' => 'Remote URL',
+        'upload_file' => 'Otpremite datoteku',
+        'remote_url' => 'Daljinski URL',
     ],
     'play_episode_button' => [
-        'play' => 'Play',
-        'playing' => 'Playing',
+        'play' => 'Pusti',
+        'playing' => 'Reprodukujem',
     ],
-    'size_limit' => 'Size limit: {0}.',
-    'choose_interact' => 'Choose how to interact',
-    'view' => 'View',
+    'size_limit' => 'Limit veličine: {0}.',
+    'choose_interact' => 'Odaberite način interakcije',
+    'view' => 'Pogledaj',
 ];
diff --git a/modules/Admin/Language/sr_Latn/Countries.php b/modules/Admin/Language/sr_Latn/Countries.php
index 4cd5d9c857..eb139a8c90 100644
--- a/modules/Admin/Language/sr_Latn/Countries.php
+++ b/modules/Admin/Language/sr_Latn/Countries.php
@@ -11,210 +11,210 @@ declare(strict_types=1);
  */
 
 return [
-    'AD' => 'Andorra',
-    'AE' => 'United Arab Emirates',
-    'AF' => 'Afghanistan',
-    'AG' => 'Antigua and Barbuda',
-    'AI' => 'Anguilla',
-    'AL' => 'Albania',
-    'AM' => 'Armenia',
+    'AD' => 'Andora',
+    'AE' => 'Ujedinjeni Arapski Emirati',
+    'AF' => 'Afganistan',
+    'AG' => 'Antiga i Barbuda',
+    'AI' => 'Angvila',
+    'AL' => 'Albanija',
+    'AM' => 'Jermenija',
     'AO' => 'Angola',
-    'AQ' => 'Antarctica',
+    'AQ' => 'Antarktik',
     'AR' => 'Argentina',
-    'AS' => 'American Samoa',
-    'AT' => 'Austria',
-    'AU' => 'Australia',
+    'AS' => 'Američka Samoa',
+    'AT' => 'Austrija',
+    'AU' => 'Australija',
     'AW' => 'Aruba',
-    'AX' => 'Åland Islands',
-    'AZ' => 'Azerbaijan',
-    'BA' => 'Bosnia and Herzegovina',
+    'AX' => 'Olandska Ostrva',
+    'AZ' => 'Azerbejdžan',
+    'BA' => 'Bosna i Hercegovina',
     'BB' => 'Barbados',
-    'BD' => 'Bangladesh',
-    'BE' => 'Belgium',
+    'BD' => 'Bangladeš',
+    'BE' => 'Bеlgija',
     'BF' => 'Burkina Faso',
-    'BG' => 'Bulgaria',
-    'BH' => 'Bahrain',
+    'BG' => 'Bugarska',
+    'BH' => 'Bahrеin',
     'BI' => 'Burundi',
     'BJ' => 'Benin',
-    'BL' => 'Saint Barthélemy',
+    'BL' => 'Sveti Bartolomej',
     'BM' => 'Bermuda',
-    'BN' => 'Brunei Darussalam',
-    'BO' => 'Bolivia, Plurinational State of',
-    'BQ' => 'Bonaire, Sint Eustatius and Saba',
+    'BN' => 'Bruneji Darusalam',
+    'BO' => 'Bolivija, Višenacionalna Država',
+    'BQ' => 'Bonеr, Svеti Eustahijе i Saba',
     'BR' => 'Brazil',
-    'BS' => 'Bahamas',
-    'BT' => 'Bhutan',
-    'BV' => 'Bouvet Island',
-    'BW' => 'Botswana',
-    'BY' => 'Belarus',
+    'BS' => 'Bahami',
+    'BT' => 'Butan',
+    'BV' => 'Ostrvo Buve',
+    'BW' => 'Bocvana',
+    'BY' => 'Bеlorusija',
     'BZ' => 'Belize',
-    'CA' => 'Canada',
-    'CC' => 'Cocos (Keeling) Islands',
-    'CD' => 'Congo, the Democratic Republic of the',
-    'CF' => 'Central African Republic',
-    'CG' => 'Congo',
-    'CH' => 'Switzerland',
-    'CI' => "Côte d'Ivoire",
-    'CK' => 'Cook Islands',
-    'CL' => 'Chile',
-    'CM' => 'Cameroon',
-    'CN' => 'China',
-    'CO' => 'Colombia',
-    'CR' => 'Costa Rica',
-    'CU' => 'Cuba',
-    'CV' => 'Cape Verde',
-    'CW' => 'Curaçao',
-    'CX' => 'Christmas Island',
-    'CY' => 'Cyprus',
-    'CZ' => 'Czech Republic',
-    'DE' => 'Germany',
-    'DJ' => 'Djibouti',
-    'DK' => 'Denmark',
-    'DM' => 'Dominica',
-    'DO' => 'Dominican Republic',
-    'DZ' => 'Algeria',
-    'EC' => 'Ecuador',
-    'EE' => 'Estonia',
-    'EG' => 'Egypt',
-    'EH' => 'Western Sahara',
-    'ER' => 'Eritrea',
-    'ES' => 'Spain',
-    'ET' => 'Ethiopia',
-    'FI' => 'Finland',
-    'FJ' => 'Fiji',
-    'FK' => 'Falkland Islands (Malvinas)',
-    'FM' => 'Micronesia, Federated States of',
-    'FO' => 'Faroe Islands',
-    'FR' => 'France',
+    'CA' => 'Kanada',
+    'CC' => 'Kokosova (Kilingova) Ostrva',
+    'CD' => 'Demokratska Republika Kongo',
+    'CF' => 'Centralnoafrička Republika',
+    'CG' => 'Kongo',
+    'CH' => 'Švajcarska',
+    'CI' => "Obala Slonovače",
+    'CK' => 'Kukova ostrva',
+    'CL' => 'Čilе',
+    'CM' => 'Kamerun',
+    'CN' => 'Kina',
+    'CO' => 'Kolumbija',
+    'CR' => 'Kostarika',
+    'CU' => 'Kuba',
+    'CV' => 'Zelenortska Ostrva',
+    'CW' => 'Kurasao',
+    'CX' => 'Uskršnja ostrva',
+    'CY' => 'Kipar',
+    'CZ' => 'Češka Republika',
+    'DE' => 'Nemačka',
+    'DJ' => 'Džibuti',
+    'DK' => 'Danska',
+    'DM' => 'Dominika',
+    'DO' => 'Dominikanska Republika',
+    'DZ' => 'Alžir',
+    'EC' => 'Ekvador',
+    'EE' => 'Estonija',
+    'EG' => 'Egipat',
+    'EH' => 'Zapadna Sahara',
+    'ER' => 'Eritreja',
+    'ES' => 'Španija',
+    'ET' => 'Etiopija',
+    'FI' => 'Finska',
+    'FJ' => 'Fidži',
+    'FK' => 'Foklandska ostrva (Malvini)',
+    'FM' => 'Savezne države Mikronezije',
+    'FO' => 'Farska Ostrva',
+    'FR' => 'Francuska',
     'GA' => 'Gabon',
-    'GB' => 'United Kingdom',
+    'GB' => 'Ujedinjeno Kraljevstvo',
     'GD' => 'Grenada',
-    'GE' => 'Georgia',
-    'GF' => 'French Guiana',
-    'GG' => 'Guernsey',
-    'GH' => 'Ghana',
+    'GE' => 'Gruzija',
+    'GF' => 'Francuska Gvajana',
+    'GG' => 'Gernzi',
+    'GH' => 'Gana',
     'GI' => 'Gibraltar',
-    'GL' => 'Greenland',
-    'GM' => 'Gambia',
-    'GN' => 'Guinea',
-    'GP' => 'Guadeloupe',
-    'GQ' => 'Equatorial Guinea',
-    'GR' => 'Greece',
-    'GS' => 'South Georgia and the South Sandwich Islands',
-    'GT' => 'Guatemala',
+    'GL' => 'Grеnland',
+    'GM' => 'Gambija',
+    'GN' => 'Gvineja',
+    'GP' => 'Gvadelupe',
+    'GQ' => 'Ekvatorijalna Gvineja',
+    'GR' => 'Grčka',
+    'GS' => 'Južna Džordžija i Južna Sendvič Ostrva',
+    'GT' => 'Gvatemala',
     'GU' => 'Guam',
-    'GW' => 'Guinea-Bissau',
-    'GY' => 'Guyana',
+    'GW' => 'Gvineja-Bisao',
+    'GY' => 'Gvajana',
     'HK' => 'Hong Kong',
-    'HM' => 'Heard Island and McDonald Islands',
+    'HM' => 'Ostrva Herd i Makdonald',
     'HN' => 'Honduras',
-    'HR' => 'Croatia',
+    'HR' => 'Hrvatska',
     'HT' => 'Haiti',
-    'HU' => 'Hungary',
-    'ID' => 'Indonesia',
-    'IE' => 'Ireland',
-    'IL' => 'Israel',
-    'IM' => 'Isle of Man',
-    'IN' => 'India',
-    'IO' => 'British Indian Ocean Territory',
-    'IQ' => 'Iraq',
-    'IR' => 'Iran, Islamic Republic of',
-    'IS' => 'Iceland',
-    'IT' => 'Italy',
-    'JE' => 'Jersey',
-    'JM' => 'Jamaica',
+    'HU' => 'Mađarska',
+    'ID' => 'Indonezija',
+    'IE' => 'Irska',
+    'IL' => 'Izrael',
+    'IM' => 'Ostrvo Man',
+    'IN' => 'Indija',
+    'IO' => 'Britanska Territorija u Indijskom Okeanu',
+    'IQ' => 'Irak',
+    'IR' => 'Islamska Republika Iran',
+    'IS' => 'Island',
+    'IT' => 'Italija',
+    'JE' => 'Džersi',
+    'JM' => 'Jamajka',
     'JO' => 'Jordan',
     'JP' => 'Japan',
-    'KE' => 'Kenya',
-    'KG' => 'Kyrgyzstan',
-    'KH' => 'Cambodia',
+    'KE' => 'Kenija',
+    'KG' => 'Kirgistan',
+    'KH' => 'Kambodža',
     'KI' => 'Kiribati',
-    'KM' => 'Comoros',
-    'KN' => 'Saint Kitts and Nevis',
-    'KP' => "Korea, Democratic People's Republic of",
-    'KR' => 'Korea, Republic of',
-    'KW' => 'Kuwait',
-    'KY' => 'Cayman Islands',
-    'KZ' => 'Kazakhstan',
-    'LA' => "Lao People's Democratic Republic",
-    'LB' => 'Lebanon',
-    'LC' => 'Saint Lucia',
-    'LI' => 'Liechtenstein',
-    'LK' => 'Sri Lanka',
-    'LR' => 'Liberia',
-    'LS' => 'Lesotho',
-    'LT' => 'Lithuania',
-    'LU' => 'Luxembourg',
-    'LV' => 'Latvia',
-    'LY' => 'Libya',
-    'MA' => 'Morocco',
-    'MC' => 'Monaco',
-    'MD' => 'Moldova, Republic of',
-    'ME' => 'Montenegro',
-    'MF' => 'Saint Martin (French part)',
-    'MG' => 'Madagascar',
-    'MH' => 'Marshall Islands',
-    'MK' => 'Macedonia, the Former Yugoslav Republic of',
+    'KM' => 'Komorska Ostrva',
+    'KN' => 'Sveti Kits i Nevis',
+    'KP' => "Demokratska Narodna Republika Koreja",
+    'KR' => 'Republika Koreja',
+    'KW' => 'Kuvajt',
+    'KY' => 'Kajmanska ostrva',
+    'KZ' => 'Kazahstan',
+    'LA' => "Laos",
+    'LB' => 'Liban',
+    'LC' => 'Sveta Lucija',
+    'LI' => 'Lihtenštajn',
+    'LK' => 'Šri Lanka',
+    'LR' => 'Liberija',
+    'LS' => 'Lesoto',
+    'LT' => 'Litvanija',
+    'LU' => 'Luksemburg',
+    'LV' => 'Letonija',
+    'LY' => 'Libija',
+    'MA' => 'Maroko',
+    'MC' => 'Monako',
+    'MD' => 'Republika Moldavija',
+    'ME' => 'Crna Gora',
+    'MF' => 'Sveti Martin (Francuski deo)',
+    'MG' => 'Madagaskar',
+    'MH' => 'Maršalska Ostrva',
+    'MK' => 'Severna Makedonija',
     'ML' => 'Mali',
-    'MM' => 'Myanmar',
-    'MN' => 'Mongolia',
-    'MO' => 'Macao',
-    'MP' => 'Northern Mariana Islands',
-    'MQ' => 'Martinique',
-    'MR' => 'Mauritania',
-    'MS' => 'Montserrat',
+    'MM' => 'Mijanmar',
+    'MN' => 'Mongolija',
+    'MO' => 'Makao',
+    'MP' => 'Severna Marijanska Ostrva',
+    'MQ' => 'Martinik',
+    'MR' => 'Mauritanija',
+    'MS' => 'Montserat',
     'MT' => 'Malta',
-    'MU' => 'Mauritius',
-    'MV' => 'Maldives',
-    'MW' => 'Malawi',
-    'MX' => 'Mexico',
-    'MY' => 'Malaysia',
-    'MZ' => 'Mozambique',
-    'N/A' => 'Not Applicable (local IP…)',
-    'NA' => 'Namibia',
-    'NC' => 'New Caledonia',
+    'MU' => 'Mauricijus',
+    'MV' => 'Maldivi',
+    'MW' => 'Malavi',
+    'MX' => 'Meksiko',
+    'MY' => 'Malezija',
+    'MZ' => 'Mozambik',
+    'N/A' => 'Nije primenjivo (Lokalna IP…)',
+    'NA' => 'Namibija',
+    'NC' => 'Nova Kaledonija',
     'NE' => 'Niger',
-    'NF' => 'Norfolk Island',
-    'NG' => 'Nigeria',
-    'NI' => 'Nicaragua',
-    'NL' => 'Netherlands',
-    'NO' => 'Norway',
+    'NF' => 'Ostrvo Norfolk',
+    'NG' => 'Nigerija',
+    'NI' => 'Nikaragva',
+    'NL' => 'Holandija',
+    'NO' => 'Norveška',
     'NP' => 'Nepal',
     'NR' => 'Nauru',
-    'NU' => 'Niue',
-    'NZ' => 'New Zealand',
+    'NU' => 'Nijue',
+    'NZ' => 'Novi Zeland',
     'OM' => 'Oman',
     'PA' => 'Panama',
     'PE' => 'Peru',
-    'PF' => 'French Polynesia',
-    'PG' => 'Papua New Guinea',
-    'PH' => 'Philippines',
+    'PF' => 'Francuska Polinezija',
+    'PG' => 'Papua Nova Gvinеja',
+    'PH' => 'Filipini',
     'PK' => 'Pakistan',
-    'PL' => 'Poland',
-    'PM' => 'Saint Pierre and Miquelon',
-    'PN' => 'Pitcairn',
-    'PR' => 'Puerto Rico',
-    'PS' => 'Palestine, State of',
-    'PT' => 'Portugal',
+    'PL' => 'Poljska',
+    'PM' => 'Sen Pjer i Mikelon',
+    'PN' => 'Pitkern',
+    'PR' => 'Portoriko',
+    'PS' => 'Palestina',
+    'PT' => 'Portugalija',
     'PW' => 'Palau',
-    'PY' => 'Paraguay',
-    'QA' => 'Qatar',
-    'RE' => 'Réunion',
-    'RO' => 'Romania',
-    'RS' => 'Serbia',
-    'RU' => 'Russian Federation',
-    'RW' => 'Rwanda',
-    'SA' => 'Saudi Arabia',
-    'SB' => 'Solomon Islands',
-    'SC' => 'Seychelles',
+    'PY' => 'Paragvaj',
+    'QA' => 'Katar',
+    'RE' => 'Rejunion',
+    'RO' => 'Rumunija',
+    'RS' => 'Srbija',
+    'RU' => 'Ruska Federacija',
+    'RW' => 'Ruanda',
+    'SA' => 'Saudijska Arabija',
+    'SB' => 'Solomonova ostrva',
+    'SC' => 'Sejšeli',
     'SD' => 'Sudan',
-    'SE' => 'Sweden',
-    'SG' => 'Singapore',
-    'SH' => 'Saint Helena, Ascension and Tristan da Cunha',
-    'SI' => 'Slovenia',
-    'SJ' => 'Svalbard and Jan Mayen',
-    'SK' => 'Slovakia',
-    'SL' => 'Sierra Leone',
+    'SE' => 'Švedska',
+    'SG' => 'Singapur',
+    'SH' => 'Sveta Helena, Asension i Tristan da Kunja',
+    'SI' => 'Slovеnija',
+    'SJ' => 'Svalbard i Jan Majen',
+    'SK' => 'Slovačka',
+    'SL' => 'Sijera Leone',
     'SM' => 'San Marino',
     'SN' => 'Senegal',
     'SO' => 'Somalia',
diff --git a/modules/Admin/Language/sr_Latn/Episode.php b/modules/Admin/Language/sr_Latn/Episode.php
index 713b517b0c..c38350a6d1 100644
--- a/modules/Admin/Language/sr_Latn/Episode.php
+++ b/modules/Admin/Language/sr_Latn/Episode.php
@@ -13,201 +13,202 @@ return [
     'season_abbr' => 'S{seasonNumber}',
     'number' => 'Episode {episodeNumber}',
     'number_abbr' => 'Ep. {episodeNumber}',
-    'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
-    'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
+    'season_episode' => 'Sezona {seasonNumber} epizoda {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
     'number_of_comments' => '{numberOfComments, plural,
-        one {# comment}
-        other {# comments}
+        one {# komentar}
+        other {# komentara}
     }',
-    'all_podcast_episodes' => 'All podcast episodes',
-    'back_to_podcast' => 'Go back to podcast',
-    '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',
-    'create' => 'Add an episode',
+    'all_podcast_episodes' => 'Sve epizode podkasta',
+    'back_to_podcast' => 'Nazad na podkast',
+    'edit' => 'Izmeni',
+    'publish' => 'Objavi',
+    'publish_edit' => 'Uredi objavu',
+    'publish_date_edit' => 'Uredi datum objave',
+    'unpublish' => 'Opozovi objavu',
+    'publish_error' => 'Epizoda je već objavljena.',
+    'publish_edit_error' => 'Epizoda je već objavljena.',
+    'publish_cancel_error' => 'Epizoda je već objavljena.',
+    'publish_date_edit_error' => 'Epizoda još uvek nije objavljena, ne možete urediti datum objave.',
+    'publish_date_edit_future_error' => 'Datum objavljivanja epizode može se podesiti samo na pređašnji datum. Ukoliko želite da ponovo zakažete objavu epizode u budućnosti, morate prvo opozvati njenu objavu.',
+    'publish_date_edit_success' => 'Datum objave epizode je uspešno uređen!',
+    'unpublish_error' => 'Epizoda nije objavljena.',
+    'delete' => 'Obriši',
+    'go_to_page' => 'Idi na stranu',
+    'create' => 'Dodaj epizodu',
     'publication_status' => [
-        'published' => 'Published',
-        'with_podcast' => 'Published',
-        'scheduled' => 'Scheduled',
-        'not_published' => 'Not published',
+        'published' => 'Objavljeno',
+        'with_podcast' => 'Objavljeno',
+        'scheduled' => 'Zakazano',
+        'not_published' => 'Neobjavljeno',
     ],
-    'with_podcast_hint' => 'To be published at the same time as the podcast',
+    'with_podcast_hint' => 'Objaviti u isto vreme kad i podkast',
     'list' => [
         'search' => [
-            'placeholder' => 'Search for an episode',
-            'clear' => 'Clear search',
-            'submit' => 'Search',
+            'placeholder' => 'Traži epizodu',
+            'clear' => 'Očisti pretragu',
+            'submit' => 'Pretraga',
         ],
         'number_of_episodes' => '{numberOfEpisodes, plural,
-            one {# episode}
-            other {# episodes}
+            one {# epizoda}
+            other {# epizode}
         }',
-        'episode' => 'Episode',
-        'visibility' => 'Visibility',
-        'comments' => 'Comments',
-        'actions' => 'Actions',
+        'episode' => 'Epizoda',
+        'visibility' => 'Vidljivost',
+        'downloads' => 'Downloads',
+        'comments' => 'Komentari',
+        'actions' => 'Akcije',
     ],
     'messages' => [
-        'createSuccess' => 'Episode has been successfully created!',
-        'editSuccess' => 'Episode has been successfully updated!',
+        'createSuccess' => 'Epizoda je uspešno kreirana!',
+        'editSuccess' => 'Epizoda je uspešno ažurirana!',
         'publishSuccess' => '{publication_status, select,
-            published {Episode successfully published!}
-            scheduled {Episode publication successfully scheduled!}
-            with_podcast {This episode will be published at the same time as the podcast.}
-            other {This episode is not published.}
+            published {Epizoda je uspešno objavljena!}
+            scheduled {Epizoda je uspešno zakazana!}
+            with_podcast {Ova epizoda će biti objavljena u isto vreme kad i podkast.}
+            other {Ova epizoda nije objavljena.}
         }',
-        'publishCancelSuccess' => 'Episode publication successfully cancelled!',
-        'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.',
-        'scheduleDateError' => 'Schedule date must be set!',
-        'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.',
-        'deleteSuccess' => 'Episode successfully deleted!',
-        'deleteError' => 'Failed to delete episode {type, select,
-            transcript {transcript}
-            chapters {chapters}
-            image {cover}
-            audio {audio}
-            other {media}
+        'publishCancelSuccess' => 'Objavljivanje epizode je uspešno otkazano!',
+        'unpublishBeforeDeleteTip' => 'Morate opozvati objavljivanje epizode pre nego što je izbrišete.',
+        'scheduleDateError' => 'Morate zakazati datum objave!',
+        'deletePublishedEpisodeError' => 'Molimo vas opozovite objavu epizode pre nego što je izbrišete.',
+        'deleteSuccess' => 'Epizoda uspešno izbrisana!',
+        'deleteError' => 'Neuspešno brisanje {type, select,
+            transcript {transkripta}
+            chapters {poglavlja}
+            image {omota}
+            audio {zvuka}
+            other {medija}
         }.',
-        'deleteFileError' => 'Failed to delete {type, select,
-            transcript {transcript}
-            chapters {chapters}
-            image {cover}
-            audio {audio}
-            other {media}
-        } file {file_key}. You may manually remove it from your disk.',
-        'sameSlugError' => 'An episode with the chosen slug already exists.',
+        'deleteFileError' => 'Neuspešno brisanje {type, select,
+            transcript {transkripta}
+            chapters {poglavlja}
+            image {omota}
+            audio {zvuka}
+            other {medija}
+        } datoteke {file_key}. Možete je ukloniti ručno sa diska.',
+        'sameSlugError' => 'Odabrano URL ime (slug) epizode već postoji.',
     ],
     'form' => [
         'file_size_error' =>
-            'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.',
-        'audio_file' => 'Audio file',
-        'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.',
-        'info_section_title' => 'Episode info',
-        'cover' => 'Episode cover',
+            'Veličina vaše datoteke je prevelika! Maksimalna veličina je {0}. Povećajte `memory_limit`, `upload_max_filesize` i `post_max_size` vrednosti u vašoj datoteci php konfiguracije, potom ponovo pokrenite veb server da bi ste otpremili datoteku.',
+        'audio_file' => 'Zvučna datoteka',
+        'audio_file_hint' => 'Odaberite .mp3 ili .m4a zvučnu datoteku.',
+        'info_section_title' => 'Informacije o epizodi',
+        'cover' => 'Omot epizode',
         'cover_hint' =>
-            'If you do not set a cover, the podcast cover will be used instead.',
-        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
-        'title' => 'Title',
+            'Ukoliko ne postavite omot epizode, koristiće se omot podkasta.',
+        'cover_size_hint' => 'Omot mora biti kvadratnog oblika i minimum 1400px širok i visok.',
+        'title' => 'Naslov',
         'title_hint' =>
-            'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.',
-        'permalink' => 'Permalink',
-        'season_number' => 'Season',
-        'episode_number' => 'Episode',
+            'Treba sadržati jasan i koncizan naziv epizode. Nemojte upisivati broj sezone ili epizode ovde.',
+        'permalink' => 'Trajni link',
+        'season_number' => 'Sezona',
+        'episode_number' => 'Epizoda',
         'type' => [
-            'label' => 'Type',
-            'full' => 'Full',
-            'full_hint' => 'Complete content (the episode)',
-            'trailer' => 'Trailer',
-            'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show',
+            'label' => 'Vrsta',
+            'full' => 'Cela',
+            'full_hint' => 'Kompletan sadržaj (epizoda)',
+            'trailer' => 'Najava',
+            'trailer_hint' => 'Kratak, promotivni deo sadržaja koji predstavlja pregled aktuelne emisije',
             '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',
+            'bonus_hint' => 'Dodatni sadržaj za emisiju (na primer, informacije iza scene ili intervjui sa glumcima) ili unakrsni promotivni sadržaj za drugu emisiju',
         ],
         'premium_title' => 'Premium',
-        'premium' => 'Episode must be accessible to premium subscribers only',
+        'premium' => 'Epizoda mora biti dostupna samo premium pretplatnicima',
         'parental_advisory' => [
-            'label' => 'Parental advisory',
-            'hint' => 'Does the episode contain explicit content?',
-            'undefined' => 'undefined',
-            'clean' => 'Clean',
-            'explicit' => 'Explicit',
+            'label' => 'Roditeljsko savetovanje',
+            'hint' => 'Da li epizoda sadrži eksplicitan sadržaj?',
+            'undefined' => 'nedefinisano',
+            'clean' => 'Čisto',
+            'explicit' => 'Eksplicitno',
         ],
-        'show_notes_section_title' => 'Show notes',
+        'show_notes_section_title' => 'Prikaži beleške',
         'show_notes_section_subtitle' =>
-            'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
-        'description' => 'Description',
-        'description_footer' => 'Description footer',
+            'Do 4000 znakova, budite jasni i sažeti. Beleške pomažu potencijalnim slušaocima da pronađu epizodu.',
+        'description' => 'Opis',
+        'description_footer' => 'Podnožje opisa',
         'description_footer_hint' =>
-            'This text is added at the end of each episode description, it is a good place to input your social links for example.',
-        'additional_files_section_title' => 'Additional files',
+            'Ovaj tekst se dodaje na kraj opisa svake epizode, ovo je pravo mesto za vaše linkove ka društvenim mrežama naprimer.',
+        'additional_files_section_title' => 'Dodatne datoteke',
         'additional_files_section_subtitle' =>
-            'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.',
-        'location_section_title' => 'Location',
-        'location_section_subtitle' => 'What place is this episode about?',
-        'location_name' => 'Location name or address',
-        'location_name_hint' => 'This can be a real or fictional location',
-        'transcript' => 'Transcript (subtitles / closed captions)',
-        'transcript_hint' => 'Only .srt are allowed.',
-        'transcript_download' => 'Download transcript',
-        'transcript_file' => 'Transcript file (.srt)',
-        'transcript_remote_url' => 'Remote url for transcript',
-        'transcript_file_delete' => 'Delete transcript file',
-        'chapters' => 'Chapters',
-        'chapters_hint' => 'File must be in JSON Chapters format.',
-        'chapters_download' => 'Download chapters',
-        'chapters_file' => 'Chapters file',
-        'chapters_remote_url' => 'Remote url for chapters file',
-        'chapters_file_delete' => 'Delete chapters file',
-        'advanced_section_title' => 'Advanced Parameters',
+            'Ove datoteke mogu biti korišćene od strane drugih platformi radi boljeg iskustva vaše publike. Pogledajte {podcastNamespaceLink} za više informacija.',
+        'location_section_title' => 'Lokacija',
+        'location_section_subtitle' => 'O kom mestu je ova epizoda?',
+        'location_name' => 'Ime ili adresa lokacije',
+        'location_name_hint' => 'Ovo može biti prava ili fiktivna lokacija',
+        'transcript' => 'Transkript (titlovi)',
+        'transcript_hint' => 'Samo .srt datoteke su dozvoljene.',
+        'transcript_download' => 'Preuzmi transkript',
+        'transcript_file' => 'Datoteka transkripta (.srt)',
+        'transcript_remote_url' => 'Udaljeni Url za transkript',
+        'transcript_file_delete' => 'Obriši datoteku transkripta',
+        'chapters' => 'Poglavlja',
+        'chapters_hint' => 'Datoteka mora biti u JSON Poglavlja formatu.',
+        'chapters_download' => 'Preuzmi poglavlja',
+        'chapters_file' => 'Datoteka poglavlja',
+        'chapters_remote_url' => 'Udaljeni Url za datoteku poglavlja',
+        'chapters_file_delete' => 'Obriši datoteku poglavlja',
+        'advanced_section_title' => 'Napredni parametri',
         'advanced_section_subtitle' =>
-            'If you need RSS tags that Castopod does not handle, set them here.',
-        'custom_rss' => 'Custom RSS tags for the episode',
-        'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.',
-        'block' => 'Episode should be hidden from public catalogues',
+            'Ukoliko su vam potrebni RSS tagovi koje Castopod ne obrađuje, postavite ih ovde.',
+        'custom_rss' => 'Posebni RSS tagovi epizode',
+        'custom_rss_hint' => 'Ovo će biti ubačeno u ❬item❭ tag.',
+        'block' => 'Epizoda treba biti sakriivena u javnim katalozima',
         'block_hint' =>
             'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
-        'submit_create' => 'Create episode',
-        'submit_edit' => 'Save episode',
+        'submit_create' => 'Kreiraj epizodu',
+        'submit_edit' => 'Sačuvaj epizodu',
     ],
     'publish_form' => [
-        'back_to_episode_dashboard' => 'Back to episode dashboard',
-        'post' => 'Your announcement post',
+        'back_to_episode_dashboard' => 'Nazad na komandnu tablu epizode',
+        'post' => 'Najava vaše objave',
         'post_hint' =>
-            "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.",
-        'message_placeholder' => 'Write your message…',
-        'publication_date' => 'Publication date',
+            "Napišite poruku da najavite objavu vaše epizode. Poruka će biti poslata svim vašim pratiocima u fediversu i istaknuta na stranici vašeg podkasta.",
+        'message_placeholder' => 'Napišite poruku…',
+        'publication_date' => 'Datum objavljivanja',
         'publication_method' => [
-            'now' => 'Now',
-            'schedule' => 'Schedule',
-            'with_podcast' => 'Publish alongside podcast',
+            'now' => 'Sada',
+            'schedule' => 'Raspored',
+            'with_podcast' => 'Objavi uz podkast',
         ],
-        'scheduled_publication_date' => 'Scheduled publication date',
-        'scheduled_publication_date_clear' => 'Clear publication date',
+        'scheduled_publication_date' => 'Planiran datum objave',
+        'scheduled_publication_date_clear' => 'Ukloni datum objave',
         'scheduled_publication_date_hint' =>
-            'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
-        'submit' => 'Publish',
-        'submit_edit' => 'Edit publication',
-        'cancel_publication' => 'Cancel publication',
-        'message_warning' => 'You did not write a message for your announcement post!',
-        'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.',
-        'message_warning_submit' => 'Publish anyways',
+            'Možete zakazati objavu epizode u budućnosti. Ovo polje mora biti popunjeno u YYYY-MM-DD HH:mm formatu',
+        'submit' => 'Objavi',
+        'submit_edit' => 'Uredi objavu',
+        'cancel_publication' => 'Poništi objavu',
+        'message_warning' => 'Niste napisali poruku za najavu objave!',
+        'message_warning_hint' => 'Poruka povećava šanse za angažovanjem na društvenim mrežama, rezultirajući u većoj vidljivosti vaše epizode.',
+        'message_warning_submit' => 'Objavi svakako',
     ],
     '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',
+        'new_publication_date' => 'Novi datum objavljivanja',
+        'new_publication_date_hint' => 'Mora biti podešeno na prošli datum.',
+        'submit' => 'Uredi datum objavljivanja',
     ],
     '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.",
-        'understand' => 'I understand, I want to unpublish the episode',
-        'submit' => 'Unpublish',
+            "Opozivanje objavljivanja epizode će obrisati sve komentare i obajve povezane sa eppizodom i ukloniti je i RSS feed-a podkasta.",
+        'understand' => 'Razumem, želim da opozovem objavu epizode',
+        'submit' => 'Opozovi objavu',
     ],
     'delete_form' => [
         'disclaimer' =>
-            "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.",
-        'understand' => 'I understand, I want to delete the episode',
-        'submit' => 'Delete',
+            "Brisanje epizode će obrisati sve medijske datoteke, komentare, video i zvučne isečke povezane sa njom.",
+        'understand' => 'Razumem, želim da obrišem epizodu',
+        'submit' => 'Obriši',
     ],
     'embed' => [
-        'title' => 'Embeddable player',
+        'title' => 'Embedovan plejer',
         'label' =>
-            'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.',
-        'clipboard_iframe' => 'Copy embeddable player to clipboard',
-        'clipboard_url' => 'Copy address to clipboard',
-        'dark' => 'Dark',
-        'dark-transparent' => 'Dark transparent',
-        'light' => 'Light',
-        'light-transparent' => 'Light transparent',
+            'Odaberite boju teme, kopirajte embedovan plejer i nalepite ga na vaš sajt.',
+        'clipboard_iframe' => 'Kopirajte kod embedovanog plejera',
+        'clipboard_url' => 'Kopirajte adresu',
+        'dark' => 'Tamna',
+        'dark-transparent' => 'Tamna providna',
+        'light' => 'Svetla',
+        'light-transparent' => 'Svetla providna',
     ],
 ];
diff --git a/modules/Admin/Language/sr_Latn/EpisodeNavigation.php b/modules/Admin/Language/sr_Latn/EpisodeNavigation.php
index 1406e3010e..48cf713800 100644
--- a/modules/Admin/Language/sr_Latn/EpisodeNavigation.php
+++ b/modules/Admin/Language/sr_Latn/EpisodeNavigation.php
@@ -9,15 +9,15 @@ declare(strict_types=1);
  */
 
 return [
-    'go_to_page' => 'View episode page',
-    'dashboard' => 'Episode dashboard',
-    'episode-view' => 'Home',
-    'episode-edit' => 'Edit episode',
-    'episode-persons-manage' => 'Manage persons',
-    'embed-add' => 'Embeddable player',
-    'clips' => 'Clips',
-    'video-clips-list' => 'Video clips',
-    'video-clips-create' => 'New video clip',
-    'soundbites-list' => 'Soundbites',
-    'soundbites-create' => 'New soundbite',
+    'go_to_page' => 'Pogledaj stranicu epizode',
+    'dashboard' => 'Kontrolna tabla epizode',
+    'episode-view' => 'Početna',
+    'episode-edit' => 'Uredi epizodu',
+    'episode-persons-manage' => 'Uredi osobe',
+    'embed-add' => 'Embedovan plejer',
+    'clips' => 'Isečci',
+    'video-clips-list' => 'Video isečci',
+    'video-clips-create' => 'Novi video isečak',
+    'soundbites-list' => 'Zvučni isečci',
+    'soundbites-create' => 'Novi zvučni isečak',
 ];
diff --git a/modules/Admin/Language/sr_Latn/Fediverse.php b/modules/Admin/Language/sr_Latn/Fediverse.php
index 0e4ca66d89..97b2088ff5 100644
--- a/modules/Admin/Language/sr_Latn/Fediverse.php
+++ b/modules/Admin/Language/sr_Latn/Fediverse.php
@@ -10,8 +10,8 @@ declare(strict_types=1);
 
 return [
     'messages' => [
-        'actorNotFound' => 'The account could not be found!',
-        'blockActorSuccess' => '{actor} has been blocked!',
+        'actorNotFound' => 'Nalog ne može biti pronađen!',
+        'blockActorSuccess' => '{actor} je blokiran!',
         'unblockActorSuccess' => 'Actor has been unblocked!',
         'blockDomainSuccess' => '{domain} has been blocked!',
         'unblockDomainSuccess' => '{domain} has been unblocked!',
diff --git a/modules/Admin/Language/sr_Latn/Navigation.php b/modules/Admin/Language/sr_Latn/Navigation.php
index 610f14345d..b23a798113 100644
--- a/modules/Admin/Language/sr_Latn/Navigation.php
+++ b/modules/Admin/Language/sr_Latn/Navigation.php
@@ -9,34 +9,34 @@ declare(strict_types=1);
  */
 
 return [
-    'toggle_sidebar' => 'Toggle sidebar',
-    'go_to_website' => 'Go to website',
-    'go_to_admin' => 'Go to admin',
-    'dashboard' => 'Dashboard',
-    'admin' => 'Home',
-    'podcasts' => 'Podcasts',
-    'podcast-list' => 'All podcasts',
-    'podcast-create' => 'New podcast',
-    'podcast-import' => 'Import a podcast',
-    'persons' => 'Persons',
-    'person-list' => 'All persons',
-    'person-create' => 'New person',
-    'fediverse' => 'Fediverse',
-    'fediverse-blocked-actors' => 'Blocked accounts',
-    'fediverse-blocked-domains' => 'Blocked domains',
-    'users' => 'Users',
-    'user-list' => 'All users',
-    'user-create' => 'New user',
-    'pages' => 'Pages',
-    'page-list' => 'All pages',
-    'page-create' => 'New Page',
-    'settings' => 'Settings',
-    'settings-general' => 'General',
-    'settings-theme' => 'Theme',
-    'about' => 'About',
+    'toggle_sidebar' => 'Uključite bočnu traku',
+    'go_to_website' => 'Idi na sajt',
+    'go_to_admin' => 'Idi na administratora',
+    'dashboard' => 'Kontrolna tabla',
+    'admin' => 'Početna',
+    'podcasts' => 'Podkasti',
+    'podcast-list' => 'Svi podkasti',
+    'podcast-create' => 'Novi podkast',
+    'podcast-import' => 'Uvezi podkast',
+    'persons' => 'Osobe',
+    'person-list' => 'Sve osobe',
+    'person-create' => 'Nova osoba',
+    'fediverse' => 'Fediverzum',
+    'fediverse-blocked-actors' => 'Blokirani nalozi',
+    'fediverse-blocked-domains' => 'Blokirani domeni',
+    'users' => 'Korisnici',
+    'user-list' => 'Svi korisnici',
+    'user-create' => 'Novi korisnik',
+    'pages' => 'Stranice',
+    'page-list' => 'Sve stranice',
+    'page-create' => 'Nova Stranica',
+    'settings' => 'Podešavanja',
+    'settings-general' => 'Opšte',
+    'settings-theme' => 'Tema',
+    'about' => 'Osnovni podaci',
     'account' => [
-        'my-account' => 'My account',
-        'change-password' => 'Change password',
-        'logout' => 'Logout',
+        'my-account' => 'Moj nalog',
+        'change-password' => 'Promenite lozinku',
+        'logout' => 'Odjava',
     ],
 ];
diff --git a/modules/Admin/Language/sr_Latn/Page.php b/modules/Admin/Language/sr_Latn/Page.php
index b6f49de574..224fa82e4b 100644
--- a/modules/Admin/Language/sr_Latn/Page.php
+++ b/modules/Admin/Language/sr_Latn/Page.php
@@ -9,22 +9,22 @@ declare(strict_types=1);
  */
 
 return [
-    'back_to_home' => 'Back to home',
-    'page' => 'Page',
-    'all_pages' => 'All pages',
-    'create' => 'New page',
-    'go_to_page' => 'Go to page',
-    'edit' => 'Edit page',
-    'delete' => 'Delete page',
+    'back_to_home' => 'Natrag na početnu',
+    'page' => 'Stranica',
+    'all_pages' => 'Sve stranice',
+    'create' => 'Nova Stranica',
+    'go_to_page' => 'Idi na stranicu',
+    'edit' => 'Izmeni stranicu',
+    'delete' => 'Obriši stranicu',
     'form' => [
-        'title' => 'Title',
-        'permalink' => 'Permalink',
-        'content' => 'Content',
-        'submit_create' => 'Create page',
-        'submit_edit' => 'Save',
+        'title' => 'Naslov',
+        'permalink' => 'Trajni link',
+        'content' => 'Sadržaj',
+        'submit_create' => 'Napravi stranicu',
+        'submit_edit' => 'Sačuvaj',
     ],
     'messages' => [
-        'createSuccess' => 'The page “{pageTitle}” was created successfully!',
-        'editSuccess' => 'The page was successfully updated!',
+        'createSuccess' => 'Stranica “{pageTitle}” je uspešno napravljena!',
+        'editSuccess' => 'Stranica je uspešno ažurirana!',
     ],
 ];
diff --git a/modules/Admin/Language/sr_Latn/Pager.php b/modules/Admin/Language/sr_Latn/Pager.php
index e25ee63810..6aac1696bf 100644
--- a/modules/Admin/Language/sr_Latn/Pager.php
+++ b/modules/Admin/Language/sr_Latn/Pager.php
@@ -9,13 +9,13 @@ declare(strict_types=1);
  */
 
 return [
-    'pageNavigation' => 'Page navigation',
-    'first' => 'First',
-    'previous' => 'Previous',
-    'next' => 'Next',
-    'last' => 'Last',
-    'older' => 'Older',
-    'newer' => 'Newer',
+    'pageNavigation' => 'Navigacija po stranicama',
+    'first' => 'Prva',
+    'previous' => 'Prеthodna',
+    'next' => 'Sledeća',
+    'last' => 'Poslednja',
+    'older' => 'Starije',
+    'newer' => 'Novije',
     'invalidTemplate' => '{0} is not a valid Pager template.',
     'invalidPaginationGroup' => '{0} is not a valid Pagination group.',
 ];
diff --git a/modules/Admin/Language/sr_Latn/Person.php b/modules/Admin/Language/sr_Latn/Person.php
index a652be9fda..e2e40df658 100644
--- a/modules/Admin/Language/sr_Latn/Person.php
+++ b/modules/Admin/Language/sr_Latn/Person.php
@@ -9,57 +9,57 @@ declare(strict_types=1);
  */
 
 return [
-    'persons' => 'Persons',
-    'all_persons' => 'All persons',
-    'no_person' => 'Nobody found!',
-    'create' => 'Create a person',
-    'view' => 'View person',
-    'edit' => 'Edit person',
-    'delete' => 'Delete person',
+    'persons' => 'Osobe',
+    'all_persons' => 'Sve osobe',
+    'no_person' => 'Niko nije pronađen!',
+    'create' => 'Kreiraj novu osobu',
+    'view' => 'Pogledaj osobu',
+    'edit' => 'Izmeni osobu',
+    'delete' => 'Obriši osobu',
     'messages' => [
-        'createSuccess' => 'Person has been successfully created!',
-        'editSuccess' => 'Person has been successfully updated!',
-        'deleteSuccess' => 'Person has been removed!',
+        'createSuccess' => 'Osoba je uspešno kreirana!',
+        'editSuccess' => 'Osoba je uspešno izmenjena!',
+        'deleteSuccess' => 'Osoba je uklonjena!',
     ],
     'form' => [
         'avatar' => 'Avatar',
         'avatar_size_hint' =>
-            'Avatar must be squared and at least 400px wide and tall.',
-        'full_name' => 'Full name',
-        'full_name_hint' => 'This is the full name or alias of the person.',
-        'unique_name' => 'Unique name',
-        'unique_name_hint' => 'Used for URLs',
-        'information_url' => 'Information URL',
+            'Avatar mora biti kvadratnog oblika i minimum 400px širok i visok.',
+        'full_name' => 'Puno ime',
+        'full_name_hint' => 'Ovo je puno ime ili nadimak osobe.',
+        'unique_name' => 'Jedinstveno ime',
+        'unique_name_hint' => 'Koristi se za URL',
+        'information_url' => 'Informacijski URL',
         'information_url_hint' =>
-            'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.',
-        'submit_create' => 'Create person',
-        'submit_edit' => 'Save person',
+            'Url ka relevantnim informacijama o osobi, kao što su naprimer njihova veb stranica ili profil na društvenim mrežama.',
+        'submit_create' => 'Kreiraj novu osobu',
+        'submit_edit' => 'Sačuvaj osobu',
     ],
     'podcast_form' => [
-        'title' => 'Manage persons',
-        'add_section_title' => 'Add persons to this podcast',
-        'add_section_subtitle' => 'You may pick several persons and roles.',
-        'persons' => 'Persons',
+        'title' => 'Uredi osobe',
+        'add_section_title' => 'Dodaj osobe ovom podkastu',
+        'add_section_subtitle' => 'Možete odabrati nekoliko osoba i njihovih uloga.',
+        'persons' => 'Osobe',
         'persons_hint' =>
-            'You may select one or several persons with the same roles. You need to create the persons first.',
-        'roles' => 'Roles',
+            'Možete odabrati jednu ili nekoliko osoba sa istim ulogama. Morate prvo kreirati osobe.',
+        'roles' => 'Uloge',
         'roles_hint' =>
-            'You may select none, one or several roles for a person.',
-        'submit_add' => 'Add person(s)',
-        'remove' => 'Remove',
+            'Možete odabrati jednu, nekoliko ili nijednu ulogu za osobu.',
+        'submit_add' => 'Dodaj osobu(e)',
+        'remove' => 'Ukloni',
     ],
     'episode_form' => [
-        'title' => 'Manage persons',
-        'add_section_title' => 'Add persons to this episode',
-        'add_section_subtitle' => 'You may pick several persons and roles.',
-        'persons' => 'Persons',
+        'title' => 'Upravljaj osobama',
+        'add_section_title' => 'Dodaj osobe ovoj epizodi',
+        'add_section_subtitle' => 'Možete odabrati nekoliko osoba i njihovih uloga.',
+        'persons' => 'Osobe',
         'persons_hint' =>
-            'You may select one or several persons with the same roles. You need to create the persons first.',
-        'roles' => 'Roles',
+            'Možete odabrati jednu ili nekoliko osoba sa istim ulogama. Morate prvo kreirati osobe.',
+        'roles' => 'Uloge',
         'roles_hint' =>
-            'You may select none, one or several roles for a person.',
-        'submit_add' => 'Add person(s)',
-        'remove' => 'Remove',
+            'Možete odabrati jednu, nekoliko ili nijednu ulogu za osobu.',
+        'submit_add' => 'Dodaj osobu(e)',
+        'remove' => 'Ukloni',
     ],
-    'credits' => 'Credits',
+    'credits' => 'Zasluge',
 ];
diff --git a/modules/Admin/Language/sr_Latn/Platforms.php b/modules/Admin/Language/sr_Latn/Platforms.php
index ab17d5999b..a55c8dcdf1 100644
--- a/modules/Admin/Language/sr_Latn/Platforms.php
+++ b/modules/Admin/Language/sr_Latn/Platforms.php
@@ -9,22 +9,22 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => 'Platforms',
-    'home_url' => 'Go to {platformName} website',
-    'submit_url' => 'Submit your podcast on {platformName}',
-    'visible' => 'Display in podcast homepage?',
-    'on_embed' => 'Display on embeddable player?',
-    'remove' => 'Remove {platformName}',
-    'submit' => 'Save',
+    'title' => 'Platforme',
+    'home_url' => 'Idi na {platformName} stranicu',
+    'submit_url' => 'Dodaj svoj podkast na {platformName}',
+    'visible' => 'Prikaži na naslovnoj strani podkasta?',
+    'on_embed' => 'Prikaži na embedovanom plejeru?',
+    'remove' => 'Ukloni {platformName}',
+    'submit' => 'Sačuvaj',
     'messages' => [
-        'updateSuccess' => 'Platform links have been successfully updated!',
-        'removeLinkSuccess' => 'The platform link has been removed.',
+        'updateSuccess' => 'Veze sa platformama su uspešno ažurirane!',
+        'removeLinkSuccess' => 'Veza ka platformi je izbrisana.',
         'removeLinkError' =>
-            'The platform link could not be removed. Try again.',
+            'Vezu sa platformom nije moguće ukloniti. Probajte ponovo.',
     ],
     'description' => [
-        'podcasting' => 'The podcast ID on this platform',
-        'social' => 'The podcast account ID on this platform',
-        'funding' => 'Call to action message',
+        'podcasting' => 'ID podkasta na ovoj platformi',
+        'social' => 'ID naloga podkasta na ovoj platformi',
+        'funding' => 'Poruka poziva na akciju',
     ],
 ];
diff --git a/modules/Admin/Language/sr_Latn/Podcast.php b/modules/Admin/Language/sr_Latn/Podcast.php
index 2d46aff531..72c3b387b0 100644
--- a/modules/Admin/Language/sr_Latn/Podcast.php
+++ b/modules/Admin/Language/sr_Latn/Podcast.php
@@ -9,69 +9,69 @@ declare(strict_types=1);
  */
 
 return [
-    'all_podcasts' => 'All podcasts',
-    'no_podcast' => 'No podcast found!',
-    'create' => 'Create podcast',
-    'import' => 'Import podcast',
-    'new_episode' => 'New Episode',
-    'view' => 'View podcast',
-    'edit' => 'Edit podcast',
-    'publish' => 'Publish podcast',
-    'publish_edit' => 'Edit publication',
-    'delete' => 'Delete podcast',
-    'see_episodes' => 'See episodes',
-    'see_contributors' => 'See contributors',
-    'go_to_page' => 'Go to page',
-    'latest_episodes' => 'Latest episodes',
-    'see_all_episodes' => 'See all episodes',
-    'draft' => 'Draft',
+    'all_podcasts' => 'Svi podkasti',
+    'no_podcast' => 'Nema pronađenih podkasta!',
+    'create' => 'Napravi podkast',
+    'import' => 'Uvezi podkast',
+    'new_episode' => 'Nova epizoda',
+    'view' => 'Pogledaj epizodu',
+    'edit' => 'Uredi podkast',
+    'publish' => 'Objavi podkast',
+    'publish_edit' => 'Uredi objavu',
+    'delete' => 'Obriši podkast',
+    'see_episodes' => 'Pogledaj epizode',
+    'see_contributors' => 'Pogledaj saradnike',
+    'go_to_page' => 'Idi na stranicu',
+    'latest_episodes' => 'Najnovije epizode',
+    'see_all_episodes' => 'Prikaži sve epizode',
+    'draft' => 'Nacrt',
     'messages' => [
-        'createSuccess' => 'Podcast successfully created!',
-        'editSuccess' => 'Podcast has been successfully updated!',
-        'importSuccess' => 'Podcast has been successfully imported!',
-        'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!',
-        'deletePodcastMediaError' => 'Failed to delete podcast {type, select,
-            cover {cover}
-            banner {banner}
-            other {media}
+        'createSuccess' => 'Podkast uspešno kreiran!',
+        'editSuccess' => 'Podkast je uspešno ažuriran!',
+        'importSuccess' => 'Podkast je uspešno uvezen!',
+        'deleteSuccess' => 'Podkast @{podcast_handle} je uspešno obrisan!',
+        'deletePodcastMediaError' => 'Neuspešno brisanje podkast {type, select,
+            cover {omota}
+            banner {banera}
+            other {medija}
         }.',
-        'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select,
-            transcript {transcript}
-            chapters {chapters}
-            image {cover}
-            audio {audio}
-            other {media}
+        'deleteEpisodeMediaError' => 'Neuspešno brisanje {episode_slug} {type, select,
+            transcript {transkripta}
+            chapters {poglavlja}
+            image {omota}
+            audio {zvuka}
+            other {medija}
         }.',
-        'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.',
-        'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural,
-            one {# episode was}
-            other {# episodes were}
-        } added to the podcast!',
-        'podcastFeedUpToDate' => 'Podcast is already up to date.',
-        'podcastNotImported' => 'Podcast could not be updated as it was not imported.',
-        'publishError' => 'This podcast is either already published or scheduled for publication.',
-        'publishEditError' => 'This podcast is not scheduled for publication.',
-        'publishCancelSuccess' => 'Podcast publication successfully cancelled!',
-        'scheduleDateError' => 'Schedule date must be set!',
+        'deletePodcastMediaFolderError' => 'Neuspešno brisanje podkast medija direktorijuma {folder_path}. Možete ga ručno ukloniti sa diska.',
+        'podcastFeedUpdateSuccess' => 'Uspešno ažuriranje: {number_of_new_episodes, plural,
+            one {# epizoda je}
+            other {# epizode su}
+        } deo podkasta!',
+        'podcastFeedUpToDate' => 'Podkast je već ažuriran.',
+        'podcastNotImported' => 'Podkast nije moguće ažurirati jer nije uvezen.',
+        'publishError' => 'Ovaj podkast je ili već objavljen ili zakazan za objavu.',
+        'publishEditError' => 'Ovaj podkast nije zakazan za objavu.',
+        'publishCancelSuccess' => 'Objavljivanje podkasta je uspešno otkazano!',
+        'scheduleDateError' => 'Morate zakazati datum objave!',
     ],
     'form' => [
-        'identity_section_title' => 'Podcast identity',
-        'identity_section_subtitle' => 'These fields allow you to get noticed.',
-        'cover' => 'Podcast cover',
-        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
-        'banner' => 'Podcast banner',
-        'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
-        'banner_delete' => 'Delete podcast banner',
-        'title' => 'Title',
+        'identity_section_title' => 'Identitet podkasta',
+        'identity_section_subtitle' => 'Ova polja vam pomažu da budete prepoznati.',
+        'cover' => 'Omot podkasta',
+        'cover_size_hint' => 'Omot mora biti kvadratnog oblika i minimum 1400px širok i visok.',
+        'banner' => 'Baner podkasta',
+        'banner_size_hint' => 'Baner mora imati odnos 3:1 i biti najmanje 1500px širok.',
+        'banner_delete' => 'Obriši baner podkasta',
+        'title' => 'Naslov',
         'handle' => 'Handle',
         'handle_hint' =>
-            'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.',
+            'Koristi se radi identifikacije podkasta. Velika slova, mala slova, brojevi i donja crta su prihvatljivi.',
         'type' => [
-            'label' => 'Type',
-            'episodic' => 'Episodic',
-            'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.',
-            'serial' => 'Serial',
-            'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.',
+            'label' => 'Vrsta',
+            'episodic' => 'Epizodno',
+            'episodic_hint' => 'Ukoliko su epizode namenjene za konzumiranje bez nekog specifičnog reda. Najnovija epizoda će biti predstavljena prva u redosledu.',
+            'serial' => 'Serijski',
+            'serial_hint' => 'Ukoliko su epizode namenjene za konzumiranje specifičnim redom. Najstarija epizoda će biti predstavljena prva u redosledu.',
         ],
         'description' => 'Description',
         'classification_section_title' => 'Classification',
@@ -129,173 +129,173 @@ return [
         'update_feed_tip' => 'Import this podcast\'s latest episodes',
         'partnership' => 'Partnership',
         'partner_id' => 'ID',
-        'partner_link_url' => 'Link URL',
-        'partner_image_url' => 'Image URL',
-        'partner_id_hint' => 'Your own partner ID',
-        'partner_link_url_hint' => 'The generic partner link address',
-        'partner_image_url_hint' => 'The generic partner image address',
+        'partner_link_url' => 'URL adresa veze',
+        'partner_image_url' => 'URL adresa slike',
+        'partner_id_hint' => 'Vaš partnerski ID',
+        'partner_link_url_hint' => 'Generička adresa veze partnera',
+        'partner_image_url_hint' => 'Generička adresa slike partnera',
         'status_section_title' => 'Status',
-        'block' => 'Podcast should be hidden from public catalogues',
+        'block' => 'Podkast treba sakriti iz javnih kataloga',
         'block_hint' =>
-            'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
-        'complete' => 'Podcast will not be having new episodes',
-        'lock' => 'Prevent podcast from being copied',
+            'Prikazan ili sakriven status podkasta: ukoliko uključite ovu opciju onemogućavate prikazivanje vašeg podkasta na paltformama za slušanje podkasta kao što su Apple Podcasts, Google Podcasts i sličnim direktorijima. (Nije zagarantovano)',
+        'complete' => 'Podkast više neće imati novih epizoda',
+        'lock' => 'Sprečite kopiranje podkasta',
         'lock_hint' =>
-            'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.',
-        'submit_create' => 'Create podcast',
-        'submit_edit' => 'Save podcast',
+            'Cilj ovoga je da komunicira sa drugim podkast platformama i ne dozvoli im da povlače vaš sadržaj. Ukoliko odaberete Da, to znači da će svaki njihov pokušaj da izlistaju vaš sadržaj na svojoj platformi biti odbijen.',
+        'submit_create' => 'Napravi podkast',
+        'submit_edit' => 'Sačuvaj podkast',
     ],
     'category_options' => [
-        'uncategorized' => 'uncategorized',
-        'arts' => 'Arts',
-        'business' => 'Business',
-        'comedy' => 'Comedy',
-        'education' => 'Education',
-        'fiction' => 'Fiction',
-        'government' => 'Government',
-        'health_and_fitness' => 'Health &amp Fitness',
-        'history' => 'History',
-        'kids_and_family' => 'Kids &amp Family',
-        'leisure' => 'Leisure',
-        'music' => 'Music',
-        'news' => 'News',
-        'religion_and_spirituality' => 'Religion &amp Spirituality',
-        'science' => 'Science',
-        'society_and_culture' => 'Society &amp Culture',
-        'sports' => 'Sports',
-        'technology' => 'Technology',
-        'true_crime' => 'True Crime',
-        'tv_and_film' => 'TV &amp Film',
-        'books' => 'Books',
-        'design' => 'Design',
-        'fashion_and_beauty' => 'Fashion &amp Beauty',
-        'food' => 'Food',
-        'performing_arts' => 'Performing Arts',
-        'visual_arts' => 'Visual Arts',
-        'careers' => 'Careers',
-        'entrepreneurship' => 'Entrepreneurship',
-        'investing' => 'Investing',
-        'management' => 'Management',
+        'uncategorized' => 'nekategorizovano',
+        'arts' => 'Umetnost',
+        'business' => 'Posao',
+        'comedy' => 'Komedija',
+        'education' => 'Obrazovanje',
+        'fiction' => 'Fikcija',
+        'government' => 'Vlada',
+        'health_and_fitness' => 'Zdravlje i Fitnes',
+        'history' => 'Istorija',
+        'kids_and_family' => 'Deca i Porodica',
+        'leisure' => 'Razonoda',
+        'music' => 'Muzika',
+        'news' => 'Vesti',
+        'religion_and_spirituality' => 'Religija i spiritualnost',
+        'science' => 'Nauka',
+        'society_and_culture' => 'Društvo i Kultura',
+        'sports' => 'Sport',
+        'technology' => 'Tehnologija',
+        'true_crime' => 'Istinski zločini',
+        'tv_and_film' => 'Televizija i Film',
+        'books' => 'Knjige',
+        'design' => 'Dizajn',
+        'fashion_and_beauty' => 'Moda i Lepota',
+        'food' => 'Hrana',
+        'performing_arts' => 'Izvođačka umetnost',
+        'visual_arts' => 'Likovna umetnost',
+        'careers' => 'Karijera',
+        'entrepreneurship' => 'Prednuzetništvo',
+        'investing' => 'Investiranje',
+        'management' => 'Upravljanje',
         'marketing' => 'Marketing',
-        'non_profit' => 'Non-Profit',
-        'comedy_interviews' => 'Comedy Interviews',
-        'improv' => 'Improv',
-        'stand_up' => 'Stand-Up',
-        'courses' => 'Courses',
-        'how_to' => 'How To',
-        'language_learning' => 'Language Learning',
-        'self_improvement' => 'Self-Improvement',
-        'comedy_fiction' => 'Comedy Fiction',
+        'non_profit' => 'Neprofitna udruženja',
+        'comedy_interviews' => 'Komični intervjui',
+        'improv' => 'Improvizacija',
+        'stand_up' => 'Stendap komedija',
+        'courses' => 'Kursevi',
+        'how_to' => 'Uradi sam',
+        'language_learning' => 'Učenje jezika',
+        'self_improvement' => 'Samopoboljšanje',
+        'comedy_fiction' => 'Komična fantastika',
         'drama' => 'Drama',
-        'science_fiction' => 'Science Fiction',
-        'alternative_health' => 'Alternative Health',
-        'fitness' => 'Fitness',
-        'medicine' => 'Medicine',
-        'mental_health' => 'Mental Health',
-        'nutrition' => 'Nutrition',
-        'sexuality' => 'Sexuality',
-        'education_for_kids' => 'Education for Kids',
-        'parenting' => 'Parenting',
-        'pets_and_animals' => 'Pets &amp Animals',
-        'stories_for_kids' => 'Stories for Kids',
-        'animation_and_manga' => 'Animation &amp Manga',
-        'automotive' => 'Automotive',
-        'aviation' => 'Aviation',
-        'crafts' => 'Crafts',
-        'games' => 'Games',
-        'hobbies' => 'Hobbies',
-        'home_and_garden' => 'Home &amp Garden',
-        'video_games' => 'Video Games',
-        'music_commentary' => 'Music Commentary',
-        'music_history' => 'Music History',
-        'music_interviews' => 'Music Interviews',
-        'business_news' => 'Business News',
-        'daily_news' => 'Daily News',
-        'entertainment_news' => 'Entertainment News',
-        'news_commentary' => 'News Commentary',
-        'politics' => 'Politics',
-        'sports_news' => 'Sports News',
-        'tech_news' => 'Tech News',
-        'buddhism' => 'Buddhism',
-        'christianity' => 'Christianity',
-        'hinduism' => 'Hinduism',
+        'science_fiction' => 'Naučna Fantastika',
+        'alternative_health' => 'Alternativno zdravlje',
+        'fitness' => 'Fitnes',
+        'medicine' => 'Medicina',
+        'mental_health' => 'Mentalno zdravlje',
+        'nutrition' => 'Nutricionizam',
+        'sexuality' => 'Seksualnost',
+        'education_for_kids' => 'Obrazovanje dece',
+        'parenting' => 'Roditeljstvo',
+        'pets_and_animals' => 'Ljubimci i životinje',
+        'stories_for_kids' => 'Priče za decu',
+        'animation_and_manga' => 'Animacija i Manga',
+        'automotive' => 'Automobilizam',
+        'aviation' => 'Avijacija',
+        'crafts' => 'Zanati',
+        'games' => 'Igre',
+        'hobbies' => 'Hobiji',
+        'home_and_garden' => 'Dom i bašta',
+        'video_games' => 'Video igre',
+        'music_commentary' => 'Komentari muzike',
+        'music_history' => 'Istorija muzike',
+        'music_interviews' => 'Muzički intervjui',
+        'business_news' => 'Vesti iz preduzetništva',
+        'daily_news' => 'Dnevne vesti',
+        'entertainment_news' => 'Vesti iz zabave',
+        'news_commentary' => 'Komentari vesti',
+        'politics' => 'Politika',
+        'sports_news' => 'Sportske vesti',
+        'tech_news' => 'Tehnološke vesti',
+        'buddhism' => 'Budizam',
+        'christianity' => 'Hrišćanstvo',
+        'hinduism' => 'Hinduizam',
         'islam' => 'Islam',
-        'judaism' => 'Judaism',
-        'religion' => 'Religion',
-        'spirituality' => 'Spirituality',
-        'astronomy' => 'Astronomy',
-        'chemistry' => 'Chemistry',
-        'earth_sciences' => 'Earth Sciences',
-        'life_sciences' => 'Life Sciences',
-        'mathematics' => 'Mathematics',
-        'natural_sciences' => 'Natural Sciences',
-        'nature' => 'Nature',
-        'physics' => 'Physics',
+        'judaism' => 'Judeizam',
+        'religion' => 'Religija',
+        'spirituality' => 'Duhovnost',
+        'astronomy' => 'Astronomija',
+        'chemistry' => 'Hemija',
+        'earth_sciences' => 'Studije zemlje',
+        'life_sciences' => 'Studije života',
+        'mathematics' => 'Matematika',
+        'natural_sciences' => 'Prirodne nauke',
+        'nature' => 'Priroda',
+        'physics' => 'Fizika',
         'social_sciences' => 'Social Sciences',
         'documentary' => 'Documentary',
-        'personal_journals' => 'Personal Journals',
-        'philosophy' => 'Philosophy',
-        'places_and_travel' => 'Places &amp Travel',
-        'relationships' => 'Relationships',
-        'baseball' => 'Baseball',
-        'basketball' => 'Basketball',
-        'cricket' => 'Cricket',
-        'fantasy_sports' => 'Fantasy Sports',
-        'football' => 'Football',
+        'personal_journals' => 'Lični dnevnici',
+        'philosophy' => 'Filozofija',
+        'places_and_travel' => 'Mesta i Putovanje',
+        'relationships' => 'Veze',
+        'baseball' => 'Bejzbol',
+        'basketball' => 'Košarka',
+        'cricket' => 'Kriket',
+        'fantasy_sports' => 'Fantazi sport',
+        'football' => 'Američki fudbal',
         'golf' => 'Golf',
-        'hockey' => 'Hockey',
-        'rugby' => 'Rugby',
-        'running' => 'Running',
-        'soccer' => 'Soccer',
-        'swimming' => 'Swimming',
-        'tennis' => 'Tennis',
-        'volleyball' => 'Volleyball',
-        'wilderness' => 'Wilderness',
-        'wrestling' => 'Wrestling',
-        'after_shows' => 'After Shows',
-        'film_history' => 'Film History',
-        'film_interviews' => 'Film Interviews',
-        'film_reviews' => 'Film Reviews',
-        'tv_reviews' => 'TV Reviews',
+        'hockey' => 'Hokej',
+        'rugby' => 'Ragbi',
+        'running' => 'Trčanje',
+        'soccer' => 'Fudbal',
+        'swimming' => 'Plivanje',
+        'tennis' => 'Tenis',
+        'volleyball' => 'Odbojka',
+        'wilderness' => 'Divljina',
+        'wrestling' => 'Rvanje',
+        'after_shows' => 'Posle emisija',
+        'film_history' => 'Filmska istorija',
+        'film_interviews' => 'Filmski intervjui',
+        'film_reviews' => 'Filmske recenzije',
+        'tv_reviews' => 'Televizijske recenzije',
     ],
     'publish_form' => [
-        'back_to_podcast_dashboard' => 'Back to podcast dashboard',
-        'post' => 'Your announcement post',
+        'back_to_podcast_dashboard' => 'Nazad na komandnu tablu podkasta',
+        'post' => 'Najava vaše objave',
         'post_hint' =>
-            "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.",
-        'message_placeholder' => 'Write your message…',
-        'submit' => 'Publish',
-        'publication_date' => 'Publication date',
+            "Napišite poruku kako bi ste najavili objavljivanje vašeg podkasta. Ova poruka će biti istaknuta na početnoj stranici vašeg podkasta.",
+        'message_placeholder' => 'Napišite poruku…',
+        'submit' => 'Objavi',
+        'publication_date' => 'Datum objavljivanja',
         'publication_method' => [
-            'now' => 'Now',
-            'schedule' => 'Schedule',
+            'now' => 'Sada',
+            'schedule' => 'Raspored',
         ],
-        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date' => 'Planiran datum objave',
         'scheduled_publication_date_hint' =>
-            'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
-        'submit_edit' => 'Edit publication',
-        'cancel_publication' => 'Cancel publication',
-        'message_warning' => 'You did not write a message for your announcement post!',
-        'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.',
-        'message_warning_submit' => 'Publish anyway',
+            'Možete zakazati objavu podkasta u budućnosti. Ovo polje mora biti popunjeno u YYYY-MM-DD HH:mm formatu',
+        'submit_edit' => 'Uredi objavu',
+        'cancel_publication' => 'Poništi objavu',
+        'message_warning' => 'Niste napisali poruku za najavu objave!',
+        'message_warning_hint' => 'Poruka povećava šanse za angažovanjem na društvenim mrežama, rezultirajući u većoj vidljivosti vašeg podkasta.',
+        'message_warning_submit' => 'Objavi svakako',
     ],
     'publication_status_banner' => [
-        'draft_mode' => 'draft mode',
-        'not_published' => 'This podcast is not yet published.',
-        'scheduled' => 'This podcast is scheduled for publication on {publication_date}.',
+        'draft_mode' => 'režim nacrta',
+        'not_published' => 'Ovaj podkast nije još uvek objavljen.',
+        'scheduled' => 'Ovaj podkast je zakazan za objavu {publication_date}.',
     ],
     'delete_form' => [
         'disclaimer' =>
-            "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.",
-        'understand' => 'I understand, I want the podcast to be permanently deleted',
-        'submit' => 'Delete',
+            "Brisanjem podkasta obrisaće se i sve epizode, medijske datoteke, objave i analitika povezana sa njim. Ova radnja je nepovratna, nakon toga nećete više moći da ih preuzmete ili povratite.",
+        'understand' => 'Razumem, želim da trajno obrišem podkast',
+        'submit' => 'Obriši',
     ],
-    'by' => 'By {publisher}',
-    'season' => 'Season {seasonNumber}',
-    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'by' => 'Od {publisher}',
+    'season' => 'Sezona {seasonNumber}',
+    'list_of_episodes_year' => '{year} epizoda ({episodeCount})',
     'list_of_episodes_season' =>
-        'Season {seasonNumber} episodes ({episodeCount})',
-    'no_episode' => 'No episode found!',
+        'Sezona {seasonNumber} epizoda ({episodeCount})',
+    'no_episode' => 'Nijedna epizode nije pronađena!',
     'follow' => 'Follow',
     'followers' => '{numberOfFollowers, plural,
         one {# follower}
diff --git a/modules/Admin/Language/sr_Latn/PodcastNavigation.php b/modules/Admin/Language/sr_Latn/PodcastNavigation.php
index b4d7ddc089..491b6773b9 100644
--- a/modules/Admin/Language/sr_Latn/PodcastNavigation.php
+++ b/modules/Admin/Language/sr_Latn/PodcastNavigation.php
@@ -32,7 +32,7 @@ return [
     'contributor-list' => 'All contributors',
     'contributor-add' => 'Add contributor',
     'platforms' => 'External platforms',
-    'platforms-podcasting' => 'Podcasting',
-    'platforms-social' => 'Social networks',
-    'platforms-funding' => 'Funding',
+    'platforms-podcasting' => 'Podkasting',
+    'platforms-social' => 'Društvene mreže',
+    'platforms-funding' => 'Finansiranje',
 ];
diff --git a/modules/Admin/Language/sr_Latn/Settings.php b/modules/Admin/Language/sr_Latn/Settings.php
index 4a70dcbaa0..650bd13dce 100644
--- a/modules/Admin/Language/sr_Latn/Settings.php
+++ b/modules/Admin/Language/sr_Latn/Settings.php
@@ -9,11 +9,11 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => 'General settings',
+    'title' => 'Opšta podešavanja',
     'instance' => [
         'title' => 'Instance',
-        'site_icon' => 'Site icon',
-        'site_icon_delete' => 'Delete site icon',
+        'site_icon' => 'Ikonica sajta',
+        'site_icon_delete' => 'Obriši ikonicu sajta',
         'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.',
         'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.',
         'site_name' => 'Site name',
diff --git a/modules/Admin/Language/sv/Charts.php b/modules/Admin/Language/sv/Charts.php
index 708e96f843..868b40fdb1 100644
--- a/modules/Admin/Language/sv/Charts.php
+++ b/modules/Admin/Language/sv/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => 'Dagligen använd bandbredd (i MB)',
     'total_storage_by_month' => 'Månadslagring (i MB)',
     'total_bandwidth_by_month' => 'Månatlig använd bandbredd (i MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/sv/Episode.php b/modules/Admin/Language/sv/Episode.php
index 98280f8d2c..b289b8df2e 100644
--- a/modules/Admin/Language/sv/Episode.php
+++ b/modules/Admin/Language/sv/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => 'Avsnitt',
         'visibility' => 'Synlighet',
+        'downloads' => 'Downloads',
         'comments' => 'Kommentarer',
         'actions' => 'Åtgärder',
     ],
diff --git a/modules/Admin/Language/uk/AboutCastopod.php b/modules/Admin/Language/uk/AboutCastopod.php
new file mode 100644
index 0000000000..3fb62afffe
--- /dev/null
+++ b/modules/Admin/Language/uk/AboutCastopod.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'About Castopod',
+    'host_name' => 'Host name',
+    'version' => 'Castopod version',
+    'php_version' => 'PHP version',
+    'os' => 'Operating System',
+    'languages' => 'Languages',
+    'update_database' => 'Update database',
+    'messages' => [
+        'databaseUpdateSuccess' => 'Database is up to date!',
+    ],
+];
diff --git a/modules/Admin/Language/uk/Breadcrumb.php b/modules/Admin/Language/uk/Breadcrumb.php
new file mode 100644
index 0000000000..558b90f765
--- /dev/null
+++ b/modules/Admin/Language/uk/Breadcrumb.php
@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'label' => 'breadcrumb',
+    config('Admin')
+        ->gateway => 'Home',
+    'podcasts' => 'podcasts',
+    'episodes' => 'episodes',
+    'subscriptions' => 'subscriptions',
+    'contributors' => 'contributors',
+    'pages' => 'pages',
+    'settings' => 'settings',
+    'theme' => 'theme',
+    'about' => 'about',
+    'add' => 'add',
+    'new' => 'new',
+    'edit' => 'edit',
+    'persons' => 'persons',
+    'publish' => 'publish',
+    'publish-edit' => 'edit publication',
+    'publish-date-edit' => 'edit publication date',
+    'unpublish' => 'unpublish',
+    'delete' => 'delete',
+    'remove' => 'remove',
+    'fediverse' => 'fediverse',
+    'blocked-actors' => 'blocked actors',
+    'blocked-domains' => 'blocked domains',
+    'users' => 'users',
+    'my-account' => 'my account',
+    'change-password' => 'change password',
+    'import' => 'feed import',
+    'platforms' => 'platforms',
+    'social' => 'social networks',
+    'funding' => 'funding',
+    'analytics' => 'analytics',
+    'locations' => 'locations',
+    'webpages' => 'web pages',
+    'unique-listeners' => 'unique listeners',
+    'players' => 'players',
+    'listening-time' => 'listening time',
+    'time-periods' => 'time periods',
+    'soundbites' => 'soundbites',
+    'video-clips' => 'video clips',
+    'embed' => 'embeddable player',
+    'notifications' => 'notifications',
+    'suspend' => 'suspend',
+];
diff --git a/modules/Admin/Language/uk/Charts.php b/modules/Admin/Language/uk/Charts.php
new file mode 100644
index 0000000000..6ede251094
--- /dev/null
+++ b/modules/Admin/Language/uk/Charts.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'by_service_weekly' => 'Episode downloads by service (for the past week)',
+    '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)',
+    'by_os_weekly' => 'Episode downloads by O.S. (for the past week)',
+    'podcast_by_region' => 'Episode downloads by region (for the past week)',
+    'unique_daily_listeners' => 'Daily unique listeners',
+    'unique_monthly_listeners' => 'Monthly unique listeners',
+    'by_browser' => 'Web pages usage by browser (for the past week)',
+    'podcast_by_day' => 'Episode daily downloads',
+    'podcast_by_month' => 'Episode monthly downloads',
+    'episode_by_day' => 'Episode daily downloads (first 60 days)',
+    'episode_by_month' => 'Episode monthly downloads',
+    'episodes_by_day' =>
+        '5 latest episodes downloads (during their first 60 days)',
+    'by_country_weekly' => 'Episode downloads by country (for the past week)',
+    'by_country_yearly' => 'Episode downloads by country (for the past year)',
+    'by_domain_weekly' => 'Web pages visits by source (for the past week)',
+    'by_domain_yearly' => 'Web pages visits by source (for the past year)',
+    'by_entry_page' => 'Web pages visits by landing page (for the past week)',
+    'podcast_bots' => 'Bots (crawlers)',
+    'daily_listening_time' => 'Daily cumulative listening time',
+    'monthly_listening_time' => 'Monthly cumulative listening time',
+    'by_weekday' => 'By week day (for the past 60 days)',
+    'by_hour' => 'By time of day (for the past 60 days)',
+    'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
+    'total_storage_by_month' => 'Monthly storage (in MB)',
+    'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
+];
diff --git a/modules/Admin/Language/uk/Common.php b/modules/Admin/Language/uk/Common.php
new file mode 100644
index 0000000000..596c8bcdec
--- /dev/null
+++ b/modules/Admin/Language/uk/Common.php
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Yes',
+    'no' => 'No',
+    'cancel' => 'Cancel',
+    'optional' => 'Optional',
+    'more' => 'More',
+    'no_data' => 'No data found!',
+    'close' => 'Close',
+    'edit' => 'Edit',
+    'copy' => 'Copy',
+    'copied' => 'Copied!',
+    'home' => 'Home',
+    'explicit' => 'Explicit',
+    'powered_by' => 'Powered by {castopod}',
+    'actions' => 'Actions',
+    'pageInfo' => 'Page {currentPage} out of {pageCount}',
+    'go_back' => 'Go back',
+    'forms' => [
+        'editor' => [
+            'write' => 'Write',
+            'preview' => 'Preview',
+            'help' => 'Powered by markdown',
+        ],
+        'multiSelect' => [
+            'selectText' => 'Press to select',
+            'loadingText' => 'Loading…',
+            'noResultsText' => 'No results found',
+            'noChoicesText' => 'No choices to choose from',
+            'maxItemText' => 'Cannot add more items',
+        ],
+        'upload_file' => 'Upload a file',
+        'remote_url' => 'Remote URL',
+    ],
+    'play_episode_button' => [
+        'play' => 'Play',
+        'playing' => 'Playing',
+    ],
+    'size_limit' => 'Size limit: {0}.',
+    'choose_interact' => 'Choose how to interact',
+    'view' => 'View',
+];
diff --git a/modules/Admin/Language/uk/Countries.php b/modules/Admin/Language/uk/Countries.php
new file mode 100644
index 0000000000..4cd5d9c857
--- /dev/null
+++ b/modules/Admin/Language/uk/Countries.php
@@ -0,0 +1,264 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * ISO 3166 country codes
+ *
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'AD' => 'Andorra',
+    'AE' => 'United Arab Emirates',
+    'AF' => 'Afghanistan',
+    'AG' => 'Antigua and Barbuda',
+    'AI' => 'Anguilla',
+    'AL' => 'Albania',
+    'AM' => 'Armenia',
+    'AO' => 'Angola',
+    'AQ' => 'Antarctica',
+    'AR' => 'Argentina',
+    'AS' => 'American Samoa',
+    'AT' => 'Austria',
+    'AU' => 'Australia',
+    'AW' => 'Aruba',
+    'AX' => 'Åland Islands',
+    'AZ' => 'Azerbaijan',
+    'BA' => 'Bosnia and Herzegovina',
+    'BB' => 'Barbados',
+    'BD' => 'Bangladesh',
+    'BE' => 'Belgium',
+    'BF' => 'Burkina Faso',
+    'BG' => 'Bulgaria',
+    'BH' => 'Bahrain',
+    'BI' => 'Burundi',
+    'BJ' => 'Benin',
+    'BL' => 'Saint Barthélemy',
+    'BM' => 'Bermuda',
+    'BN' => 'Brunei Darussalam',
+    'BO' => 'Bolivia, Plurinational State of',
+    'BQ' => 'Bonaire, Sint Eustatius and Saba',
+    'BR' => 'Brazil',
+    'BS' => 'Bahamas',
+    'BT' => 'Bhutan',
+    'BV' => 'Bouvet Island',
+    'BW' => 'Botswana',
+    'BY' => 'Belarus',
+    'BZ' => 'Belize',
+    'CA' => 'Canada',
+    'CC' => 'Cocos (Keeling) Islands',
+    'CD' => 'Congo, the Democratic Republic of the',
+    'CF' => 'Central African Republic',
+    'CG' => 'Congo',
+    'CH' => 'Switzerland',
+    'CI' => "Côte d'Ivoire",
+    'CK' => 'Cook Islands',
+    'CL' => 'Chile',
+    'CM' => 'Cameroon',
+    'CN' => 'China',
+    'CO' => 'Colombia',
+    'CR' => 'Costa Rica',
+    'CU' => 'Cuba',
+    'CV' => 'Cape Verde',
+    'CW' => 'Curaçao',
+    'CX' => 'Christmas Island',
+    'CY' => 'Cyprus',
+    'CZ' => 'Czech Republic',
+    'DE' => 'Germany',
+    'DJ' => 'Djibouti',
+    'DK' => 'Denmark',
+    'DM' => 'Dominica',
+    'DO' => 'Dominican Republic',
+    'DZ' => 'Algeria',
+    'EC' => 'Ecuador',
+    'EE' => 'Estonia',
+    'EG' => 'Egypt',
+    'EH' => 'Western Sahara',
+    'ER' => 'Eritrea',
+    'ES' => 'Spain',
+    'ET' => 'Ethiopia',
+    'FI' => 'Finland',
+    'FJ' => 'Fiji',
+    'FK' => 'Falkland Islands (Malvinas)',
+    'FM' => 'Micronesia, Federated States of',
+    'FO' => 'Faroe Islands',
+    'FR' => 'France',
+    'GA' => 'Gabon',
+    'GB' => 'United Kingdom',
+    'GD' => 'Grenada',
+    'GE' => 'Georgia',
+    'GF' => 'French Guiana',
+    'GG' => 'Guernsey',
+    'GH' => 'Ghana',
+    'GI' => 'Gibraltar',
+    'GL' => 'Greenland',
+    'GM' => 'Gambia',
+    'GN' => 'Guinea',
+    'GP' => 'Guadeloupe',
+    'GQ' => 'Equatorial Guinea',
+    'GR' => 'Greece',
+    'GS' => 'South Georgia and the South Sandwich Islands',
+    'GT' => 'Guatemala',
+    'GU' => 'Guam',
+    'GW' => 'Guinea-Bissau',
+    'GY' => 'Guyana',
+    'HK' => 'Hong Kong',
+    'HM' => 'Heard Island and McDonald Islands',
+    'HN' => 'Honduras',
+    'HR' => 'Croatia',
+    'HT' => 'Haiti',
+    'HU' => 'Hungary',
+    'ID' => 'Indonesia',
+    'IE' => 'Ireland',
+    'IL' => 'Israel',
+    'IM' => 'Isle of Man',
+    'IN' => 'India',
+    'IO' => 'British Indian Ocean Territory',
+    'IQ' => 'Iraq',
+    'IR' => 'Iran, Islamic Republic of',
+    'IS' => 'Iceland',
+    'IT' => 'Italy',
+    'JE' => 'Jersey',
+    'JM' => 'Jamaica',
+    'JO' => 'Jordan',
+    'JP' => 'Japan',
+    'KE' => 'Kenya',
+    'KG' => 'Kyrgyzstan',
+    'KH' => 'Cambodia',
+    'KI' => 'Kiribati',
+    'KM' => 'Comoros',
+    'KN' => 'Saint Kitts and Nevis',
+    'KP' => "Korea, Democratic People's Republic of",
+    'KR' => 'Korea, Republic of',
+    'KW' => 'Kuwait',
+    'KY' => 'Cayman Islands',
+    'KZ' => 'Kazakhstan',
+    'LA' => "Lao People's Democratic Republic",
+    'LB' => 'Lebanon',
+    'LC' => 'Saint Lucia',
+    'LI' => 'Liechtenstein',
+    'LK' => 'Sri Lanka',
+    'LR' => 'Liberia',
+    'LS' => 'Lesotho',
+    'LT' => 'Lithuania',
+    'LU' => 'Luxembourg',
+    'LV' => 'Latvia',
+    'LY' => 'Libya',
+    'MA' => 'Morocco',
+    'MC' => 'Monaco',
+    'MD' => 'Moldova, Republic of',
+    'ME' => 'Montenegro',
+    'MF' => 'Saint Martin (French part)',
+    'MG' => 'Madagascar',
+    'MH' => 'Marshall Islands',
+    'MK' => 'Macedonia, the Former Yugoslav Republic of',
+    'ML' => 'Mali',
+    'MM' => 'Myanmar',
+    'MN' => 'Mongolia',
+    'MO' => 'Macao',
+    'MP' => 'Northern Mariana Islands',
+    'MQ' => 'Martinique',
+    'MR' => 'Mauritania',
+    'MS' => 'Montserrat',
+    'MT' => 'Malta',
+    'MU' => 'Mauritius',
+    'MV' => 'Maldives',
+    'MW' => 'Malawi',
+    'MX' => 'Mexico',
+    'MY' => 'Malaysia',
+    'MZ' => 'Mozambique',
+    'N/A' => 'Not Applicable (local IP…)',
+    'NA' => 'Namibia',
+    'NC' => 'New Caledonia',
+    'NE' => 'Niger',
+    'NF' => 'Norfolk Island',
+    'NG' => 'Nigeria',
+    'NI' => 'Nicaragua',
+    'NL' => 'Netherlands',
+    'NO' => 'Norway',
+    'NP' => 'Nepal',
+    'NR' => 'Nauru',
+    'NU' => 'Niue',
+    'NZ' => 'New Zealand',
+    'OM' => 'Oman',
+    'PA' => 'Panama',
+    'PE' => 'Peru',
+    'PF' => 'French Polynesia',
+    'PG' => 'Papua New Guinea',
+    'PH' => 'Philippines',
+    'PK' => 'Pakistan',
+    'PL' => 'Poland',
+    'PM' => 'Saint Pierre and Miquelon',
+    'PN' => 'Pitcairn',
+    'PR' => 'Puerto Rico',
+    'PS' => 'Palestine, State of',
+    'PT' => 'Portugal',
+    'PW' => 'Palau',
+    'PY' => 'Paraguay',
+    'QA' => 'Qatar',
+    'RE' => 'Réunion',
+    'RO' => 'Romania',
+    'RS' => 'Serbia',
+    'RU' => 'Russian Federation',
+    'RW' => 'Rwanda',
+    'SA' => 'Saudi Arabia',
+    'SB' => 'Solomon Islands',
+    'SC' => 'Seychelles',
+    'SD' => 'Sudan',
+    'SE' => 'Sweden',
+    'SG' => 'Singapore',
+    'SH' => 'Saint Helena, Ascension and Tristan da Cunha',
+    'SI' => 'Slovenia',
+    'SJ' => 'Svalbard and Jan Mayen',
+    'SK' => 'Slovakia',
+    'SL' => 'Sierra Leone',
+    'SM' => 'San Marino',
+    'SN' => 'Senegal',
+    'SO' => 'Somalia',
+    'SR' => 'Suriname',
+    'SS' => 'South Sudan',
+    'ST' => 'Sao Tome and Principe',
+    'SV' => 'El Salvador',
+    'SX' => 'Sint Maarten (Dutch part)',
+    'SY' => 'Syrian Arab Republic',
+    'SZ' => 'Swaziland',
+    'TC' => 'Turks and Caicos Islands',
+    'TD' => 'Chad',
+    'TF' => 'French Southern Territories',
+    'TG' => 'Togo',
+    'TH' => 'Thailand',
+    'TJ' => 'Tajikistan',
+    'TK' => 'Tokelau',
+    'TL' => 'Timor-Leste',
+    'TM' => 'Turkmenistan',
+    'TN' => 'Tunisia',
+    'TO' => 'Tonga',
+    'TR' => 'Turkey',
+    'TT' => 'Trinidad and Tobago',
+    'TV' => 'Tuvalu',
+    'TW' => 'Taiwan, Province of China',
+    'TZ' => 'Tanzania, United Republic of',
+    'UA' => 'Ukraine',
+    'UG' => 'Uganda',
+    'UM' => 'United States Minor Outlying Islands',
+    'US' => 'United States',
+    'UY' => 'Uruguay',
+    'UZ' => 'Uzbekistan',
+    'VA' => 'Holy See (Vatican City State)',
+    'VC' => 'Saint Vincent and the Grenadines',
+    'VE' => 'Venezuela, Bolivarian Republic of',
+    'VG' => 'Virgin Islands, British',
+    'VI' => 'Virgin Islands, U.S.',
+    'VN' => 'Viet Nam',
+    'VU' => 'Vanuatu',
+    'WF' => 'Wallis and Futuna',
+    'WS' => 'Samoa',
+    'YE' => 'Yemen',
+    'YT' => 'Mayotte',
+    'ZA' => 'South Africa',
+    'ZM' => 'Zambia',
+    'ZW' => 'Zimbabwe',
+];
diff --git a/modules/Admin/Language/uk/Dashboard.php b/modules/Admin/Language/uk/Dashboard.php
new file mode 100644
index 0000000000..881073fd26
--- /dev/null
+++ b/modules/Admin/Language/uk/Dashboard.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
+    'podcasts' => [
+        'title' => 'Podcasts',
+        'not_found' => 'No published podcast',
+        'last_published' => 'Last published on {lastPublicationDate}',
+    ],
+    'episodes' => [
+        'title' => 'Episodes',
+        'not_found' => 'No published episode',
+        'last_published' => 'Last published on {lastPublicationDate}',
+    ],
+    'storage' => [
+        'title' => 'Storage',
+        'subtitle' => '{totalUploaded} out of {totalStorage}',
+    ],
+];
diff --git a/modules/Admin/Language/uk/Episode.php b/modules/Admin/Language/uk/Episode.php
new file mode 100644
index 0000000000..98498bee21
--- /dev/null
+++ b/modules/Admin/Language/uk/Episode.php
@@ -0,0 +1,214 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Season {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Episode {episodeNumber}',
+    'number_abbr' => 'Ep. {episodeNumber}',
+    'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
+    'number_of_comments' => '{numberOfComments, plural,
+        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',
+    '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',
+    'create' => 'Add an episode',
+    'publication_status' => [
+        'published' => 'Published',
+        'with_podcast' => 'Published',
+        'scheduled' => 'Scheduled',
+        'not_published' => 'Not published',
+    ],
+    'with_podcast_hint' => 'To be published at the same time as the podcast',
+    'list' => [
+        'search' => [
+            'placeholder' => 'Search for an episode',
+            'clear' => 'Clear search',
+            'submit' => 'Search',
+        ],
+        'number_of_episodes' => '{numberOfEpisodes, plural,
+            one {# episode}
+            other {# episodes}
+        }',
+        'episode' => 'Episode',
+        'visibility' => 'Visibility',
+        'downloads' => 'Downloads',
+        'comments' => 'Comments',
+        'actions' => 'Actions',
+    ],
+    'messages' => [
+        'createSuccess' => 'Episode has been successfully created!',
+        'editSuccess' => 'Episode has been successfully updated!',
+        'publishSuccess' => '{publication_status, select,
+            published {Episode successfully published!}
+            scheduled {Episode publication successfully scheduled!}
+            with_podcast {This episode will be published at the same time as the podcast.}
+            other {This episode is not published.}
+        }',
+        'publishCancelSuccess' => 'Episode publication successfully cancelled!',
+        'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.',
+        'scheduleDateError' => 'Schedule date must be set!',
+        'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.',
+        'deleteSuccess' => 'Episode successfully deleted!',
+        'deleteError' => 'Failed to delete episode {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        }.',
+        'deleteFileError' => 'Failed to delete {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        } file {file_path}. You may manually remove it from your disk.',
+        'sameSlugError' => 'An episode with the chosen slug already exists.',
+    ],
+    'form' => [
+        'file_size_error' =>
+            'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.',
+        'audio_file' => 'Audio file',
+        'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.',
+        'info_section_title' => 'Episode info',
+        'cover' => 'Episode cover',
+        'cover_hint' =>
+            'If you do not set a cover, the podcast cover will be used instead.',
+        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'title' => 'Title',
+        'title_hint' =>
+            'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.',
+        'permalink' => 'Permalink',
+        'season_number' => 'Season',
+        'episode_number' => 'Episode',
+        'type' => [
+            'label' => 'Type',
+            'full' => 'Full',
+            'full_hint' => 'Complete content (the episode)',
+            'trailer' => 'Trailer',
+            'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show',
+            '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?',
+            'undefined' => 'undefined',
+            'clean' => 'Clean',
+            'explicit' => 'Explicit',
+        ],
+        'show_notes_section_title' => 'Show notes',
+        'show_notes_section_subtitle' =>
+            'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
+        'description' => 'Description',
+        'description_footer' => 'Description footer',
+        'description_footer_hint' =>
+            'This text is added at the end of each episode description, it is a good place to input your social links for example.',
+        'additional_files_section_title' => 'Additional files',
+        'additional_files_section_subtitle' =>
+            'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this episode about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real or fictional location',
+        'transcript' => 'Transcript (subtitles / closed captions)',
+        'transcript_hint' => 'Only .srt are allowed.',
+        'transcript_download' => 'Download transcript',
+        'transcript_file' => 'Transcript file (.srt)',
+        'transcript_remote_url' => 'Remote url for transcript',
+        'transcript_file_delete' => 'Delete transcript file',
+        'chapters' => 'Chapters',
+        'chapters_hint' => 'File must be in JSON Chapters format.',
+        'chapters_download' => 'Download chapters',
+        'chapters_file' => 'Chapters file',
+        'chapters_remote_url' => 'Remote url for chapters file',
+        'chapters_file_delete' => 'Delete chapters file',
+        'advanced_section_title' => 'Advanced Parameters',
+        'advanced_section_subtitle' =>
+            'If you need RSS tags that Castopod does not handle, set them here.',
+        'custom_rss' => 'Custom RSS tags for the episode',
+        'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.',
+        'block' => 'Episode should be hidden from public catalogues',
+        'block_hint' =>
+            'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
+        'submit_create' => 'Create episode',
+        'submit_edit' => 'Save episode',
+    ],
+    'publish_form' => [
+        'back_to_episode_dashboard' => 'Back to episode dashboard',
+        'post' => 'Your announcement post',
+        'post_hint' =>
+            "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.",
+        'message_placeholder' => 'Write your message…',
+        'publication_date' => 'Publication date',
+        'publication_method' => [
+            'now' => 'Now',
+            'schedule' => 'Schedule',
+            'with_podcast' => 'Publish alongside podcast',
+        ],
+        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date_clear' => 'Clear publication date',
+        'scheduled_publication_date_hint' =>
+            'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
+        'submit' => 'Publish',
+        'submit_edit' => 'Edit publication',
+        'cancel_publication' => 'Cancel publication',
+        'message_warning' => 'You did not write a message for your announcement post!',
+        '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.",
+        'understand' => 'I understand, I want to unpublish the episode',
+        'submit' => 'Unpublish',
+    ],
+    'delete_form' => [
+        'disclaimer' =>
+            "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.",
+        'understand' => 'I understand, I want to delete the episode',
+        'submit' => 'Delete',
+    ],
+    'embed' => [
+        'title' => 'Embeddable player',
+        'label' =>
+            'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.',
+        'clipboard_iframe' => 'Copy embeddable player to clipboard',
+        'clipboard_url' => 'Copy address to clipboard',
+        'dark' => 'Dark',
+        'dark-transparent' => 'Dark transparent',
+        'light' => 'Light',
+        'light-transparent' => 'Light transparent',
+    ],
+];
diff --git a/modules/Admin/Language/uk/EpisodeNavigation.php b/modules/Admin/Language/uk/EpisodeNavigation.php
new file mode 100644
index 0000000000..1406e3010e
--- /dev/null
+++ b/modules/Admin/Language/uk/EpisodeNavigation.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'go_to_page' => 'View episode page',
+    'dashboard' => 'Episode dashboard',
+    'episode-view' => 'Home',
+    'episode-edit' => 'Edit episode',
+    'episode-persons-manage' => 'Manage persons',
+    'embed-add' => 'Embeddable player',
+    'clips' => 'Clips',
+    'video-clips-list' => 'Video clips',
+    'video-clips-create' => 'New video clip',
+    'soundbites-list' => 'Soundbites',
+    'soundbites-create' => 'New soundbite',
+];
diff --git a/modules/Admin/Language/uk/Fediverse.php b/modules/Admin/Language/uk/Fediverse.php
new file mode 100644
index 0000000000..0e4ca66d89
--- /dev/null
+++ b/modules/Admin/Language/uk/Fediverse.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'messages' => [
+        'actorNotFound' => 'The account could not be found!',
+        'blockActorSuccess' => '{actor} has been blocked!',
+        'unblockActorSuccess' => 'Actor has been unblocked!',
+        'blockDomainSuccess' => '{domain} has been blocked!',
+        'unblockDomainSuccess' => '{domain} has been unblocked!',
+    ],
+    'blocked_actors' => 'Blocked accounts',
+    'blocked_domains' => 'Blocked domains',
+    'block_lists_form' => [
+        'handle' => 'Account handle',
+        'handle_hint' => 'Input @username@domain account.',
+        'domain' => 'Domain name',
+        'submit' => 'Block!',
+    ],
+    'list' => [
+        'actor' => 'Account',
+        'domain' => 'Domain name',
+        'unblock' => 'Unblock',
+    ],
+];
diff --git a/modules/Admin/Language/uk/Home.php b/modules/Admin/Language/uk/Home.php
new file mode 100644
index 0000000000..6249bab145
--- /dev/null
+++ b/modules/Admin/Language/uk/Home.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'Усі подкасти',
+    'no_podcast' => 'Подкастів не знайдено',
+];
diff --git a/modules/Admin/Language/uk/Install.php b/modules/Admin/Language/uk/Install.php
new file mode 100644
index 0000000000..814cd8c265
--- /dev/null
+++ b/modules/Admin/Language/uk/Install.php
@@ -0,0 +1,61 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'manual_config' => 'Ручне налаштування',
+    'manual_config_subtitle' =>
+        'Create a `.env` file with your settings and refresh the page to continue installation.',
+    'form' => [
+        'instance_config' => 'Instance configuration',
+        'hostname' => 'Hostname',
+        'media_base_url' => 'Media base URL',
+        'media_base_url_hint' =>
+            'If you use a CDN and/or an external analytics service, you may set them here.',
+        'admin_gateway' => 'Admin gateway',
+        'admin_gateway_hint' =>
+            'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.',
+        'auth_gateway' => 'Auth gateway',
+        'auth_gateway_hint' =>
+            'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.',
+        'database_config' => 'Database configuration',
+        'database_config_hint' =>
+            'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.',
+        'db_hostname' => 'Ім\'я хоста бази даних',
+        'db_name' => 'Назва бази даних',
+        'db_username' => 'Ім\'я користувача бази даних',
+        'db_password' => 'Пароль бази даних',
+        'db_prefix' => 'Префікс бази даних',
+        'db_prefix_hint' =>
+            "The prefix of the Castopod table names, leave as is if you don't know what it means.",
+        'cache_config' => 'Cache configuration',
+        'cache_config_hint' =>
+            'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.',
+        'cache_handler' => 'Обробник кешу',
+        'cacheHandlerOptions' => [
+            'file' => 'Файл',
+            'redis' => 'Redis',
+            'predis' => 'Predis',
+        ],
+        'next' => 'Далі',
+        'submit' => 'Завершити установку',
+        'create_superadmin' => 'Створіть свій обліковий запис головного адміністратора',
+        'email' => 'Пошта',
+        'username' => 'Ім\'я користувача',
+        'password' => 'Пароль',
+    ],
+    'messages' => [
+        'createSuperAdminSuccess' =>
+            'Ваш обліковий запис суперадміністратора було успішно створено. Увійдіть, щоб почати подкасти!',
+        'databaseConnectError' =>
+            'Кастопод не зміг підключитись до бази даних. Змініть конфігурацію бази даних і повторіть спробу.',
+        'writeError' =>
+            "Не вдалося створити/записати файл `.env`. Ви повинні створити його вручну, перейшовши шаблон файлу `.env.example` в пакеті Castopode.",
+    ],
+];
diff --git a/modules/Admin/Language/uk/Navigation.php b/modules/Admin/Language/uk/Navigation.php
new file mode 100644
index 0000000000..610f14345d
--- /dev/null
+++ b/modules/Admin/Language/uk/Navigation.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'toggle_sidebar' => 'Toggle sidebar',
+    'go_to_website' => 'Go to website',
+    'go_to_admin' => 'Go to admin',
+    'dashboard' => 'Dashboard',
+    'admin' => 'Home',
+    'podcasts' => 'Podcasts',
+    'podcast-list' => 'All podcasts',
+    'podcast-create' => 'New podcast',
+    'podcast-import' => 'Import a podcast',
+    'persons' => 'Persons',
+    'person-list' => 'All persons',
+    'person-create' => 'New person',
+    'fediverse' => 'Fediverse',
+    'fediverse-blocked-actors' => 'Blocked accounts',
+    'fediverse-blocked-domains' => 'Blocked domains',
+    'users' => 'Users',
+    'user-list' => 'All users',
+    'user-create' => 'New user',
+    'pages' => 'Pages',
+    'page-list' => 'All pages',
+    'page-create' => 'New Page',
+    'settings' => 'Settings',
+    'settings-general' => 'General',
+    'settings-theme' => 'Theme',
+    'about' => 'About',
+    'account' => [
+        'my-account' => 'My account',
+        'change-password' => 'Change password',
+        'logout' => 'Logout',
+    ],
+];
diff --git a/modules/Admin/Language/uk/Notifications.php b/modules/Admin/Language/uk/Notifications.php
new file mode 100644
index 0000000000..2b139d5181
--- /dev/null
+++ b/modules/Admin/Language/uk/Notifications.php
@@ -0,0 +1,19 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Notifications',
+    'reply' => '{actor_username} replied to your post',
+    'favourite' => '{actor_username} favourited your post',
+    'reblog' => '{actor_username} shared your post',
+    'follow' => '{actor_username} started following you',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/uk/Page.php b/modules/Admin/Language/uk/Page.php
new file mode 100644
index 0000000000..b6f49de574
--- /dev/null
+++ b/modules/Admin/Language/uk/Page.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'back_to_home' => 'Back to home',
+    'page' => 'Page',
+    'all_pages' => 'All pages',
+    'create' => 'New page',
+    'go_to_page' => 'Go to page',
+    'edit' => 'Edit page',
+    'delete' => 'Delete page',
+    'form' => [
+        'title' => 'Title',
+        'permalink' => 'Permalink',
+        'content' => 'Content',
+        'submit_create' => 'Create page',
+        'submit_edit' => 'Save',
+    ],
+    'messages' => [
+        'createSuccess' => 'The page “{pageTitle}” was created successfully!',
+        'editSuccess' => 'The page was successfully updated!',
+    ],
+];
diff --git a/modules/Admin/Language/uk/Pager.php b/modules/Admin/Language/uk/Pager.php
new file mode 100644
index 0000000000..c940f60471
--- /dev/null
+++ b/modules/Admin/Language/uk/Pager.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'pageNavigation' => 'Навігація між сторінками',
+    'first' => 'Перший',
+    'previous' => 'Попередній',
+    'next' => 'Наступний',
+    'last' => 'Останній',
+    'older' => 'Старші',
+    'newer' => 'Новіші',
+    'invalidTemplate' => '{0} не є правильним шаблоном Пейджера.',
+    'invalidPaginationGroup' => '{0} - некоректна група нумерацій.',
+];
diff --git a/modules/Admin/Language/uk/Person.php b/modules/Admin/Language/uk/Person.php
new file mode 100644
index 0000000000..a652be9fda
--- /dev/null
+++ b/modules/Admin/Language/uk/Person.php
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'persons' => 'Persons',
+    'all_persons' => 'All persons',
+    'no_person' => 'Nobody found!',
+    'create' => 'Create a person',
+    'view' => 'View person',
+    'edit' => 'Edit person',
+    'delete' => 'Delete person',
+    'messages' => [
+        'createSuccess' => 'Person has been successfully created!',
+        'editSuccess' => 'Person has been successfully updated!',
+        'deleteSuccess' => 'Person has been removed!',
+    ],
+    'form' => [
+        'avatar' => 'Avatar',
+        'avatar_size_hint' =>
+            'Avatar must be squared and at least 400px wide and tall.',
+        'full_name' => 'Full name',
+        'full_name_hint' => 'This is the full name or alias of the person.',
+        'unique_name' => 'Unique name',
+        'unique_name_hint' => 'Used for URLs',
+        'information_url' => 'Information URL',
+        'information_url_hint' =>
+            'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.',
+        'submit_create' => 'Create person',
+        'submit_edit' => 'Save person',
+    ],
+    'podcast_form' => [
+        'title' => 'Manage persons',
+        'add_section_title' => 'Add persons to this podcast',
+        'add_section_subtitle' => 'You may pick several persons and roles.',
+        'persons' => 'Persons',
+        'persons_hint' =>
+            'You may select one or several persons with the same roles. You need to create the persons first.',
+        'roles' => 'Roles',
+        'roles_hint' =>
+            'You may select none, one or several roles for a person.',
+        'submit_add' => 'Add person(s)',
+        'remove' => 'Remove',
+    ],
+    'episode_form' => [
+        'title' => 'Manage persons',
+        'add_section_title' => 'Add persons to this episode',
+        'add_section_subtitle' => 'You may pick several persons and roles.',
+        'persons' => 'Persons',
+        'persons_hint' =>
+            'You may select one or several persons with the same roles. You need to create the persons first.',
+        'roles' => 'Roles',
+        'roles_hint' =>
+            'You may select none, one or several roles for a person.',
+        'submit_add' => 'Add person(s)',
+        'remove' => 'Remove',
+    ],
+    'credits' => 'Credits',
+];
diff --git a/modules/Admin/Language/uk/Platforms.php b/modules/Admin/Language/uk/Platforms.php
new file mode 100644
index 0000000000..ab17d5999b
--- /dev/null
+++ b/modules/Admin/Language/uk/Platforms.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Platforms',
+    'home_url' => 'Go to {platformName} website',
+    'submit_url' => 'Submit your podcast on {platformName}',
+    'visible' => 'Display in podcast homepage?',
+    'on_embed' => 'Display on embeddable player?',
+    'remove' => 'Remove {platformName}',
+    'submit' => 'Save',
+    'messages' => [
+        'updateSuccess' => 'Platform links have been successfully updated!',
+        'removeLinkSuccess' => 'The platform link has been removed.',
+        'removeLinkError' =>
+            'The platform link could not be removed. Try again.',
+    ],
+    'description' => [
+        'podcasting' => 'The podcast ID on this platform',
+        'social' => 'The podcast account ID on this platform',
+        'funding' => 'Call to action message',
+    ],
+];
diff --git a/modules/Admin/Language/uk/Podcast.php b/modules/Admin/Language/uk/Podcast.php
new file mode 100644
index 0000000000..2d46aff531
--- /dev/null
+++ b/modules/Admin/Language/uk/Podcast.php
@@ -0,0 +1,314 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'no_podcast' => 'No podcast found!',
+    'create' => 'Create podcast',
+    'import' => 'Import podcast',
+    'new_episode' => 'New Episode',
+    'view' => 'View podcast',
+    'edit' => 'Edit podcast',
+    'publish' => 'Publish podcast',
+    'publish_edit' => 'Edit publication',
+    'delete' => 'Delete podcast',
+    'see_episodes' => 'See episodes',
+    'see_contributors' => 'See contributors',
+    'go_to_page' => 'Go to page',
+    'latest_episodes' => 'Latest episodes',
+    'see_all_episodes' => 'See all episodes',
+    'draft' => 'Draft',
+    'messages' => [
+        'createSuccess' => 'Podcast successfully created!',
+        'editSuccess' => 'Podcast has been successfully updated!',
+        'importSuccess' => 'Podcast has been successfully imported!',
+        'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!',
+        'deletePodcastMediaError' => 'Failed to delete podcast {type, select,
+            cover {cover}
+            banner {banner}
+            other {media}
+        }.',
+        'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select,
+            transcript {transcript}
+            chapters {chapters}
+            image {cover}
+            audio {audio}
+            other {media}
+        }.',
+        'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.',
+        'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural,
+            one {# episode was}
+            other {# episodes were}
+        } added to the podcast!',
+        'podcastFeedUpToDate' => 'Podcast is already up to date.',
+        'podcastNotImported' => 'Podcast could not be updated as it was not imported.',
+        'publishError' => 'This podcast is either already published or scheduled for publication.',
+        'publishEditError' => 'This podcast is not scheduled for publication.',
+        'publishCancelSuccess' => 'Podcast publication successfully cancelled!',
+        'scheduleDateError' => 'Schedule date must be set!',
+    ],
+    'form' => [
+        'identity_section_title' => 'Podcast identity',
+        'identity_section_subtitle' => 'These fields allow you to get noticed.',
+        'cover' => 'Podcast cover',
+        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'banner' => 'Podcast banner',
+        'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
+        'banner_delete' => 'Delete podcast banner',
+        'title' => 'Title',
+        'handle' => 'Handle',
+        'handle_hint' =>
+            'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.',
+        'type' => [
+            'label' => 'Type',
+            'episodic' => 'Episodic',
+            'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.',
+            'serial' => 'Serial',
+            'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.',
+        ],
+        'description' => 'Description',
+        'classification_section_title' => 'Classification',
+        'classification_section_subtitle' =>
+            'These fields will impact your audience and competition.',
+        'language' => 'Language',
+        'category' => 'Category',
+        'category_placeholder' => 'Select a category…',
+        'other_categories' => 'Other categories',
+        'parental_advisory' => [
+            'label' => 'Parental advisory',
+            'hint' => 'Does it contain explicit content?',
+            'undefined' => 'undefined',
+            'clean' => 'Clean',
+            'explicit' => 'Explicit',
+        ],
+        'author_section_title' => 'Author',
+        'author_section_subtitle' => 'Who is managing the podcast?',
+        'owner_name' => 'Owner name',
+        'owner_name_hint' =>
+            'For administrative use only. Visible in the public RSS feed.',
+        'owner_email' => 'Owner email',
+        'owner_email_hint' =>
+            'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.',
+        'publisher' => 'Publisher',
+        'publisher_hint' =>
+            'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.',
+        'copyright' => 'Copyright',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this podcast about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real place or fictional',
+        '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.',
+        'op3' => 'Open Podcast Prefix Project (OP3)',
+        'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.',
+        'op3_enable' => 'Enable OP3 analytics service',
+        'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.',
+        'payment_pointer' => 'Payment Pointer for Web Monetization',
+        'payment_pointer_hint' =>
+            'This is your where you will receive money thanks to Web Monetization',
+        'advanced_section_title' => 'Advanced Parameters',
+        'advanced_section_subtitle' =>
+            'If you need RSS tags that Castopod does not handle, set them here.',
+        'custom_rss' => 'Custom RSS tags for the podcast',
+        'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.',
+        'new_feed_url' => 'New feed URL',
+        'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.',
+        'old_feed_url' => 'Old feed URL',
+        'update_feed' => 'Update feed',
+        'update_feed_tip' => 'Import this podcast\'s latest episodes',
+        'partnership' => 'Partnership',
+        'partner_id' => 'ID',
+        'partner_link_url' => 'Link URL',
+        'partner_image_url' => 'Image URL',
+        'partner_id_hint' => 'Your own partner ID',
+        'partner_link_url_hint' => 'The generic partner link address',
+        'partner_image_url_hint' => 'The generic partner image address',
+        'status_section_title' => 'Status',
+        'block' => 'Podcast should be hidden from public catalogues',
+        'block_hint' =>
+            'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)',
+        'complete' => 'Podcast will not be having new episodes',
+        'lock' => 'Prevent podcast from being copied',
+        'lock_hint' =>
+            'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.',
+        'submit_create' => 'Create podcast',
+        'submit_edit' => 'Save podcast',
+    ],
+    'category_options' => [
+        'uncategorized' => 'uncategorized',
+        'arts' => 'Arts',
+        'business' => 'Business',
+        'comedy' => 'Comedy',
+        'education' => 'Education',
+        'fiction' => 'Fiction',
+        'government' => 'Government',
+        'health_and_fitness' => 'Health &amp Fitness',
+        'history' => 'History',
+        'kids_and_family' => 'Kids &amp Family',
+        'leisure' => 'Leisure',
+        'music' => 'Music',
+        'news' => 'News',
+        'religion_and_spirituality' => 'Religion &amp Spirituality',
+        'science' => 'Science',
+        'society_and_culture' => 'Society &amp Culture',
+        'sports' => 'Sports',
+        'technology' => 'Technology',
+        'true_crime' => 'True Crime',
+        'tv_and_film' => 'TV &amp Film',
+        'books' => 'Books',
+        'design' => 'Design',
+        'fashion_and_beauty' => 'Fashion &amp Beauty',
+        'food' => 'Food',
+        'performing_arts' => 'Performing Arts',
+        'visual_arts' => 'Visual Arts',
+        'careers' => 'Careers',
+        'entrepreneurship' => 'Entrepreneurship',
+        'investing' => 'Investing',
+        'management' => 'Management',
+        'marketing' => 'Marketing',
+        'non_profit' => 'Non-Profit',
+        'comedy_interviews' => 'Comedy Interviews',
+        'improv' => 'Improv',
+        'stand_up' => 'Stand-Up',
+        'courses' => 'Courses',
+        'how_to' => 'How To',
+        'language_learning' => 'Language Learning',
+        'self_improvement' => 'Self-Improvement',
+        'comedy_fiction' => 'Comedy Fiction',
+        'drama' => 'Drama',
+        'science_fiction' => 'Science Fiction',
+        'alternative_health' => 'Alternative Health',
+        'fitness' => 'Fitness',
+        'medicine' => 'Medicine',
+        'mental_health' => 'Mental Health',
+        'nutrition' => 'Nutrition',
+        'sexuality' => 'Sexuality',
+        'education_for_kids' => 'Education for Kids',
+        'parenting' => 'Parenting',
+        'pets_and_animals' => 'Pets &amp Animals',
+        'stories_for_kids' => 'Stories for Kids',
+        'animation_and_manga' => 'Animation &amp Manga',
+        'automotive' => 'Automotive',
+        'aviation' => 'Aviation',
+        'crafts' => 'Crafts',
+        'games' => 'Games',
+        'hobbies' => 'Hobbies',
+        'home_and_garden' => 'Home &amp Garden',
+        'video_games' => 'Video Games',
+        'music_commentary' => 'Music Commentary',
+        'music_history' => 'Music History',
+        'music_interviews' => 'Music Interviews',
+        'business_news' => 'Business News',
+        'daily_news' => 'Daily News',
+        'entertainment_news' => 'Entertainment News',
+        'news_commentary' => 'News Commentary',
+        'politics' => 'Politics',
+        'sports_news' => 'Sports News',
+        'tech_news' => 'Tech News',
+        'buddhism' => 'Buddhism',
+        'christianity' => 'Christianity',
+        'hinduism' => 'Hinduism',
+        'islam' => 'Islam',
+        'judaism' => 'Judaism',
+        'religion' => 'Religion',
+        'spirituality' => 'Spirituality',
+        'astronomy' => 'Astronomy',
+        'chemistry' => 'Chemistry',
+        'earth_sciences' => 'Earth Sciences',
+        'life_sciences' => 'Life Sciences',
+        'mathematics' => 'Mathematics',
+        'natural_sciences' => 'Natural Sciences',
+        'nature' => 'Nature',
+        'physics' => 'Physics',
+        'social_sciences' => 'Social Sciences',
+        'documentary' => 'Documentary',
+        'personal_journals' => 'Personal Journals',
+        'philosophy' => 'Philosophy',
+        'places_and_travel' => 'Places &amp Travel',
+        'relationships' => 'Relationships',
+        'baseball' => 'Baseball',
+        'basketball' => 'Basketball',
+        'cricket' => 'Cricket',
+        'fantasy_sports' => 'Fantasy Sports',
+        'football' => 'Football',
+        'golf' => 'Golf',
+        'hockey' => 'Hockey',
+        'rugby' => 'Rugby',
+        'running' => 'Running',
+        'soccer' => 'Soccer',
+        'swimming' => 'Swimming',
+        'tennis' => 'Tennis',
+        'volleyball' => 'Volleyball',
+        'wilderness' => 'Wilderness',
+        'wrestling' => 'Wrestling',
+        'after_shows' => 'After Shows',
+        'film_history' => 'Film History',
+        'film_interviews' => 'Film Interviews',
+        'film_reviews' => 'Film Reviews',
+        'tv_reviews' => 'TV Reviews',
+    ],
+    'publish_form' => [
+        'back_to_podcast_dashboard' => 'Back to podcast dashboard',
+        'post' => 'Your announcement post',
+        'post_hint' =>
+            "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.",
+        'message_placeholder' => 'Write your message…',
+        'submit' => 'Publish',
+        'publication_date' => 'Publication date',
+        'publication_method' => [
+            'now' => 'Now',
+            'schedule' => 'Schedule',
+        ],
+        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date_hint' =>
+            'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
+        'submit_edit' => 'Edit publication',
+        'cancel_publication' => 'Cancel publication',
+        'message_warning' => 'You did not write a message for your announcement post!',
+        'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.',
+        'message_warning_submit' => 'Publish anyway',
+    ],
+    'publication_status_banner' => [
+        'draft_mode' => 'draft mode',
+        'not_published' => 'This podcast is not yet published.',
+        'scheduled' => 'This podcast is scheduled for publication on {publication_date}.',
+    ],
+    'delete_form' => [
+        'disclaimer' =>
+            "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.",
+        'understand' => 'I understand, I want the podcast to be permanently deleted',
+        'submit' => 'Delete',
+    ],
+    'by' => 'By {publisher}',
+    'season' => 'Season {seasonNumber}',
+    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Season {seasonNumber} episodes ({episodeCount})',
+    'no_episode' => 'No episode found!',
+    'follow' => 'Follow',
+    'followers' => '{numberOfFollowers, plural,
+        one {# follower}
+        other {# followers}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {# post}
+        other {# posts}
+    }',
+    'activity' => 'Activity',
+    'episodes' => 'Episodes',
+    'sponsor' => 'Sponsor',
+    'funding_links' => 'Funding links for {podcastTitle}',
+    'find_on' => 'Find {podcastTitle} on',
+    'listen_on' => 'Listen on',
+];
diff --git a/modules/Admin/Language/uk/PodcastImport.php b/modules/Admin/Language/uk/PodcastImport.php
new file mode 100644
index 0000000000..7c3ef67d1f
--- /dev/null
+++ b/modules/Admin/Language/uk/PodcastImport.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'warning' =>
+        'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.',
+    'old_podcast_section_title' => 'The podcast to import',
+    'old_podcast_section_subtitle' =>
+        'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.',
+    'imported_feed_url' => 'Feed URL',
+    'imported_feed_url_hint' => 'The feed must be in xml or rss format.',
+    'new_podcast_section_title' => 'The new podcast',
+    'advanced_params_section_title' => 'Advanced parameters',
+    'advanced_params_section_subtitle' =>
+        'Keep the default values if you have no idea of what the fields are for.',
+    'slug_field' => 'Field to be used to calculate episode slug',
+    'description_field' =>
+        'Source field used for episode description / show notes',
+    'force_renumber' => 'Force episodes renumbering',
+    'force_renumber_hint' =>
+        'Use this if your podcast does not have episode numbers but wish to set them during import.',
+    'season_number' => 'Season number',
+    'season_number_hint' =>
+        'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.',
+    'max_episodes' => 'Maximum number of episodes to import',
+    'max_episodes_hint' => 'Leave blank to import all episodes',
+    'lock_import' =>
+        'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.',
+    'submit' => 'Import podcast',
+];
diff --git a/modules/Admin/Language/uk/PodcastNavigation.php b/modules/Admin/Language/uk/PodcastNavigation.php
new file mode 100644
index 0000000000..b4d7ddc089
--- /dev/null
+++ b/modules/Admin/Language/uk/PodcastNavigation.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'go_to_page' => 'Go to podcast page',
+    'dashboard' => 'Podcast dashboard',
+    'podcast-view' => 'Home',
+    'podcast-edit' => 'Edit podcast',
+    'podcast-persons-manage' => 'Manage persons',
+    'episodes' => 'Episodes',
+    'episode-list' => 'All episodes',
+    'episode-create' => 'New episode',
+    'analytics' => 'Analytics',
+    'podcast-analytics' => 'Audience overview',
+    'podcast-analytics-webpages' => 'Web pages visits',
+    'podcast-analytics-locations' => 'Locations',
+    'podcast-analytics-unique-listeners' => 'Unique listeners',
+    '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',
+    'platforms' => 'External platforms',
+    'platforms-podcasting' => 'Podcasting',
+    'platforms-social' => 'Social networks',
+    'platforms-funding' => 'Funding',
+];
diff --git a/modules/Admin/Language/uk/Settings.php b/modules/Admin/Language/uk/Settings.php
new file mode 100644
index 0000000000..4a70dcbaa0
--- /dev/null
+++ b/modules/Admin/Language/uk/Settings.php
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'General settings',
+    'instance' => [
+        'title' => 'Instance',
+        'site_icon' => 'Site icon',
+        'site_icon_delete' => 'Delete site icon',
+        'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.',
+        'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.',
+        'site_name' => 'Site name',
+        'site_description' => 'Site description',
+        'submit' => 'Save',
+        'editSuccess' => 'Instance has been updated successfully!',
+        'deleteIconSuccess' => 'Site icon has been remove successfully!',
+    ],
+    'images' => [
+        'title' => 'Images',
+        'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.',
+        'regenerate' => 'Regenerate images',
+        'regenerationSuccess' => 'All images have been regenerated successfully!',
+    ],
+    'housekeeping' => [
+        'title' => 'Housekeeping',
+        'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.',
+        'reset_counts' => 'Reset counts',
+        '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',
+        'runSuccess' => 'Housekeeping has been run successfully!',
+    ],
+    'theme' => [
+        'title' => 'Theme',
+        'accent_section_title' => 'Accent color',
+        'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.',
+        'pine' => 'Pine',
+        'crimson' => 'Crimson',
+        'amber' => 'Amber',
+        'lake' => 'Lake',
+        'jacaranda' => 'Jacaranda',
+        'onyx' => 'Onyx',
+        'submit' => 'Save',
+        'setInstanceThemeSuccess' => 'Theme has been updated successfully!',
+    ],
+];
diff --git a/modules/Admin/Language/uk/Soundbite.php b/modules/Admin/Language/uk/Soundbite.php
new file mode 100644
index 0000000000..a3f828fe09
--- /dev/null
+++ b/modules/Admin/Language/uk/Soundbite.php
@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'list' => [
+        'title' => 'Soundbites',
+        'soundbite' => 'Soundbite',
+    ],
+    'messages' => [
+        'createSuccess' => 'Soundbite has been successfully created!',
+        'deleteSuccess' => 'Soundbite has been successfully removed!',
+    ],
+    'form' => [
+        'title' => 'New soundbite',
+        'soundbite_title' => 'Soundbite title',
+        'start_time' => 'Start at',
+        'duration' => 'Duration',
+        'submit' => 'Create soundbite',
+    ],
+    'play' => 'Play soundbite',
+    'stop' => 'Stop soundbite',
+    'create' => 'New soundbite',
+    'delete' => 'Delete soundbite',
+];
diff --git a/modules/Admin/Language/uk/Validation.php b/modules/Admin/Language/uk/Validation.php
new file mode 100644
index 0000000000..3bc78cfe18
--- /dev/null
+++ b/modules/Admin/Language/uk/Validation.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'min_dims' =>
+        '{field} is either not an image, or it is not wide or tall enough.',
+    'is_image_ratio' =>
+        '{field} is either not an image or not of the right ratio.',
+];
diff --git a/modules/Admin/Language/uk/VideoClip.php b/modules/Admin/Language/uk/VideoClip.php
new file mode 100644
index 0000000000..638de697bb
--- /dev/null
+++ b/modules/Admin/Language/uk/VideoClip.php
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'list' => [
+        'title' => 'Video clips',
+        'status' => [
+            'label' => 'Status',
+            'queued' => 'queued',
+            'queued_hint' => 'Clip is waiting to be processed.',
+            'pending' => 'pending',
+            'pending_hint' => 'Clip will be generated shortly.',
+            'running' => 'running',
+            'running_hint' => 'Clip is being generated.',
+            'failed' => 'failed',
+            'failed_hint' => 'Clip could not be generated: script failure.',
+            'passed' => 'passed',
+            'passed_hint' => 'Clip was generated successfully!',
+        ],
+        'clip' => 'Clip',
+        'duration' => 'Job duration',
+    ],
+    'title' => 'Video clip: {videoClipLabel}',
+    'download_clip' => 'Download clip',
+    'create' => 'New video clip',
+    'go_to_page' => 'Go to clip page',
+    'retry' => 'Retry clip generation',
+    'delete' => 'Delete clip',
+    'logs' => 'Job logs',
+    'messages' => [
+        'alreadyExistingError' => 'The video clip you are trying to create already exists!',
+        'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!',
+        'deleteSuccess' => 'Video clip has been successfully removed!',
+    ],
+    'format' => [
+        'landscape' => 'Landscape',
+        'portrait' => 'Portrait',
+        'squared' => 'Squared',
+    ],
+    'form' => [
+        'title' => 'New video clip',
+        'params_section_title' => 'Video clip parameters',
+        'clip_title' => 'Clip title',
+        'format' => [
+            'label' => 'Choose a format',
+            'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.',
+            'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.',
+            'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.',
+        ],
+        'theme' => 'Select a theme',
+        'start_time' => 'Start at',
+        'duration' => 'Duration',
+        'trim_start' => 'Trim start',
+        'trim_end' => 'Trim end',
+        'submit' => 'Create video clip',
+    ],
+    'requirements' => [
+        'title' => 'Missing requirements',
+        'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!',
+        'ffmpeg' => 'FFmpeg',
+        'gd' => 'Graphics Draw (GD)',
+        'freetype' => 'Freetype library for GD',
+        'transcript' => 'Transcript file (.srt)',
+    ],
+];
diff --git a/modules/Admin/Language/zh-Hans/Charts.php b/modules/Admin/Language/zh-Hans/Charts.php
index e623691a91..92a6e4c279 100644
--- a/modules/Admin/Language/zh-Hans/Charts.php
+++ b/modules/Admin/Language/zh-Hans/Charts.php
@@ -37,4 +37,5 @@ return [
     'podcast_by_bandwidth' => '每日使用带宽(MB)',
     'total_storage_by_month' => '每月存储量 (MB)',
     'total_bandwidth_by_month' => '每月使用带宽(MB)',
+    'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month',
 ];
diff --git a/modules/Admin/Language/zh-Hans/Episode.php b/modules/Admin/Language/zh-Hans/Episode.php
index 6495f1a35a..3c0afc818f 100644
--- a/modules/Admin/Language/zh-Hans/Episode.php
+++ b/modules/Admin/Language/zh-Hans/Episode.php
@@ -55,6 +55,7 @@ return [
         }',
         'episode' => '剧集',
         'visibility' => '可见性',
+        'downloads' => 'Downloads',
         'comments' => '评论',
         'actions' => '操作',
     ],
diff --git a/modules/Auth/Language/ca/Auth.php b/modules/Auth/Language/ca/Auth.php
index a47932e317..b939afe21a 100644
--- a/modules/Auth/Language/ca/Auth.php
+++ b/modules/Auth/Language/ca/Auth.php
@@ -11,84 +11,84 @@ declare(strict_types=1);
 return [
     'instance_groups' => [
         'owner' => [
-            'title' => 'Instance Owner',
-            'description' => 'The Castopod owner.',
+            'title' => 'Propietari de la instància',
+            'description' => 'Propietari del Castopod.',
         ],
         'superadmin' => [
-            'title' => 'Super admin',
-            'description' => 'Has complete control over Castopod.',
+            'title' => 'Super administrador',
+            'description' => 'Té control complet sobre Castopod.',
         ],
         'manager' => [
-            'title' => 'Manager',
-            'description' => 'Manages Castopod\'s content.',
+            'title' => 'Administrador',
+            'description' => 'Administra el contingut de Castopod.',
         ],
         'podcaster' => [
             'title' => 'Podcaster',
-            'description' => 'General users of Castopod.',
+            'description' => 'Usos generals de Castopod.',
         ],
     ],
     'instance_permissions' => [
-        'admin.access' => 'Can access the Castopod admin area.',
-        'admin.settings' => 'Can access the Castopod settings.',
-        'users.manage' => 'Can manage Castopod users.',
-        'persons.manage' => 'Can manage persons.',
-        'pages.manage' => 'Can manage pages.',
-        'podcasts.view' => 'Can view all podcasts.',
-        'podcasts.create' => 'Can create new podcasts.',
-        'podcasts.import' => 'Can import podcasts.',
-        'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.',
+        'admin.access' => 'Pot accedir a l\'àrea d\'administració de Castopod.',
+        'admin.settings' => 'Pot accedir a la configuració de Castopod.',
+        'users.manage' => 'Pot administrar els usuaris de Castopod.',
+        'persons.manage' => 'Pot administrar persones.',
+        'pages.manage' => 'Pot administrar pàgines.',
+        'podcasts.view' => 'Pot veure els pòdcasts.',
+        'podcasts.create' => 'Pot crear nous pòdcasts.',
+        'podcasts.import' => 'Pot importar pòdcasts.',
+        'fediverse.manage-blocks' => 'Pot evitar que actors/dominis del fedivers interactuen amb Castopod.',
     ],
     'podcast_groups' => [
         'owner' => [
-            'title' => 'Podcast Owner',
-            'description' => 'The podcast owner.',
+            'title' => 'Propietari del pòdcast',
+            'description' => 'El propietari del pòdcast.',
         ],
         'admin' => [
-            'title' => 'Admin',
-            'description' => 'Has complete control of podcast #{id}.',
+            'title' => 'Administrador',
+            'description' => 'Té control complet del pòdcast #{id}.',
         ],
         'editor' => [
             'title' => 'Editor',
-            'description' => 'Manages content and publications of podcast #{id}.',
+            'description' => 'Administra els continguts i la publicació del pòdcast #{id}.',
         ],
         'author' => [
-            'title' => 'Author',
-            'description' => 'Manages content of podcast #{id} but cannot publish them.',
+            'title' => 'Autor',
+            'description' => 'Administra el contingut del podcast #{id} però no el pot publicar.',
         ],
         'guest' => [
-            'title' => 'Guest',
-            'description' => 'General contributor of the podcast #{id}.',
+            'title' => 'Convidat',
+            'description' => 'Col·laborador general del podcast #{id}.',
         ],
     ],
     'podcast_permissions' => [
-        'view' => 'Can view dashboard and analytics of podcast #{id}.',
-        'edit' => 'Can edit podcast #{id}.',
-        'delete' => 'Can delete podcast #{id}.',
-        'manage-import' => 'Can synchronize imported podcast #{id}.',
-        'manage-persons' => 'Can manage subscriptions of podcast #{id}.',
-        'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.',
-        'manage-contributors' => 'Can manage contributors of podcast #{id}.',
-        'manage-platforms' => 'Can set/remove platform links of podcast #{id}.',
-        'manage-publications' => 'Can publish podcast #{id}.',
-        'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.',
-        'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.',
-        'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.',
-        'episodes.create' => 'Can create episodes for podcast #{id}.',
-        'episodes.edit' => 'Can edit episodes of podcast #{id}.',
-        'episodes.delete' => 'Can delete episodes of podcast #{id}.',
-        'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.',
-        'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.',
-        'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.',
-        'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.',
+        'view' => 'Pot veure el tauler i les estadístiques del podcast #{id}.',
+        'edit' => 'Pot editar el podcast #{id}.',
+        'delete' => 'Pot suprimir el podcast #{id}.',
+        'manage-import' => 'Pot sincronitzar el podcast importat #{id}.',
+        'manage-persons' => 'Pot gestionar les subscripcions del podcast #{id}.',
+        'manage-subscriptions' => 'Pot gestionar les subscripcions del podcast #{id}.',
+        'manage-contributors' => 'Pot gestionar els col·laboradors del podcast #{id}.',
+        'manage-platforms' => 'Pot establir/eliminar enllaços de plataforma del podcast #{id}.',
+        'manage-publications' => 'Pot publicar el podcast #{id}.',
+        'manage-notifications' => 'Pot veure i marcar les notificacions com a llegides per al podcast #{id}.',
+        'interact-as' => 'Pot interactuar en nom del podcast #{id} per marcar les publicacions com a preferides, compartir-les o respondre-hi.',
+        'episodes.view' => 'Pot veure taulers i estadístiques dels episodis del podcast #{id}.',
+        'episodes.create' => 'Pot crear episodis per al podcast #{id}.',
+        'episodes.edit' => 'Pot editar episodis del podcast #{id}.',
+        'episodes.delete' => 'Pot suprimir episodis del podcast #{id}.',
+        'episodes.manage-persons' => 'Pot gestionar persones d\'episodi del podcast #{id}.',
+        'episodes.manage-clips' => 'Pot gestionar clips de vídeo o fragments de so del pòdcast #{id}.',
+        'episodes.manage-publications' => 'Pot publicar/anul·lar la publicació d\'episodis i publicacions del pòdcast #{id}.',
+        'episodes.manage-comments' => 'Pot crear/eliminar comentaris d\'episodi del pòdcast #{id}.',
     ],
 
     // missing keys
-    'code' => 'Your 6-digit code',
+    'code' => 'El teu codi de 6 dígits',
 
-    'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.',
-    'set_password' => 'Set your password',
+    'notEnoughPrivilege' => 'No teniu prou permisos per accedir a aquesta pàgina.',
+    'set_password' => 'Estableix la teva contrasenya',
 
     // Welcome email
-    'welcomeSubject' => 'You\'ve been invited to {siteName}',
-    'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.',
+    'welcomeSubject' => 'Has estat convidat a {siteName}',
+    'emailWelcomeMailBody' => 'S\'ha creat un compte per a tu a {domain}, fes clic a l\'enllaç d\'inici de sessió següent per configurar la teva contrasenya. L\'enllaç és vàlid durant {numberOfHours} hores després de l\'hora d\'enviament d\'aquest correu electrònic.',
 ];
diff --git a/modules/Auth/Language/ca/Contributor.php b/modules/Auth/Language/ca/Contributor.php
index e17f7fe048..4105f38e92 100644
--- a/modules/Auth/Language/ca/Contributor.php
+++ b/modules/Auth/Language/ca/Contributor.php
@@ -29,15 +29,15 @@ return [
         'submit_edit' => 'Actualitzar el rol',
     ],
     'delete_form' => [
-        'title' => 'Remove {contributor}',
+        'title' => 'Suprimeix {contributor}',
         'disclaimer' =>
-            'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.',
-        'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"',
-        'submit' => 'Remove',
+            'Esteu a punt d\'eliminar {contributor} dels col·laboradors. Ja no podrà accedir a "{podcastTitle}".',
+        'understand' => 'Entenc, vull eliminar {contributor} de "{podcastTitle}"',
+        'submit' => 'Suprimeix',
     ],
     'messages' => [
-        'editSuccess' => 'Role successfully changed!',
-        'editOwnerError' => "You can't edit the podcast owner!",
+        'editSuccess' => 'El rol ha canviat correctament!',
+        'editOwnerError' => "No pots editar el propietari del podcast!",
         'removeOwnerError' => "No podeu eliminar al propietari del podcast!",
         'removeSuccess' =>
             'S\'ha eliminat a {username} de {podcastTitle}',
diff --git a/modules/Auth/Language/ca/User.php b/modules/Auth/Language/ca/User.php
index 6520db7089..c269cfa4fc 100644
--- a/modules/Auth/Language/ca/User.php
+++ b/modules/Auth/Language/ca/User.php
@@ -9,7 +9,7 @@ declare(strict_types=1);
  */
 
 return [
-    'edit_role' => "Edit {username}'s role",
+    'edit_role' => "Editeu el rol de {username}",
     'ban' => 'Bandejar',
     'unban' => 'Re-admetre',
     'delete' => 'Eliminar',
@@ -18,7 +18,7 @@ return [
     'all_users' => 'Tots els usuaris',
     'list' => [
         'user' => 'Usuari',
-        'role' => 'Role',
+        'role' => 'Rol',
         'banned' => 'Bandejat?',
     ],
     'form' => [
@@ -26,7 +26,7 @@ return [
         'username' => 'Nom de l\'usuari',
         'password' => 'Contrasenya',
         'new_password' => 'Nova contrasenya',
-        'role' => 'Role',
+        'role' => 'Rol',
         'roles' => 'Rols',
         'permissions' => 'Permisos',
         'submit_create' => 'Crea un usuari',
@@ -34,11 +34,11 @@ return [
         'submit_password_change' => 'Canviat!',
     ],
     'delete_form' => [
-        'title' => 'Delete {user}',
+        'title' => 'Suprimeix {user}',
         'disclaimer' =>
-            "You are about to delete {user} permanently. They will not be able to access the admin area anymore.",
-        'understand' => 'I understand, I want to delete {user} permanently',
-        'submit' => 'Delete',
+            "Esteu a punt de suprimir {user} permanentment. Ja no podrà accedir a l'àrea d'administració.",
+        'understand' => 'Entenc, vull suprimir {user} permanentment',
+        'submit' => 'Suprimeix',
     ],
     'messages' => [
         'createSuccess' =>
@@ -52,7 +52,7 @@ return [
         'banSuperAdminError' =>
             '{username} és un superadministrador, hom simplement no bandeja a un superadministrador...',
         'deleteOwnerError' =>
-            '{username} is the instance owner, one does not simply delete the owner…',
+            '{username} és el propietari de la instància, un no pot suprimir senzillament el propietari…',
         'deleteSuperAdminError' =>
             '{username} és un superadministrador, hom simplement no elimina a un superadministrador...',
         'deleteSuccess' => '{username} ha estat eliminat.',
diff --git a/modules/Auth/Language/de/Auth.php b/modules/Auth/Language/de/Auth.php
index e64fbec740..1cef24ad40 100644
--- a/modules/Auth/Language/de/Auth.php
+++ b/modules/Auth/Language/de/Auth.php
@@ -36,7 +36,7 @@ return [
         'podcasts.view' => 'Kann alle Podcasts einsehen.',
         'podcasts.create' => 'Kann neue Podcasts erstellen.',
         'podcasts.import' => 'Kann Podcasts importieren.',
-        'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.',
+        'fediverse.manage-blocks' => 'Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren.',
     ],
     'podcast_groups' => [
         'owner' => [
@@ -71,14 +71,14 @@ return [
         'manage-platforms' => 'Kann Plattform-Links des Podcasts #{id} verwalten.',
         'manage-publications' => 'Kann Podcast #{id} veröffentlichen.',
         'manage-notifications' => 'Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren.',
-        'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.',
+        'interact-as' => 'Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten.',
         'episodes.view' => 'Kann Dashboards und Analysen von Episoden des Podcasts #{id} einsehen.',
         'episodes.create' => 'Kann Folgen für Podcast #{id} erstellen.',
         'episodes.edit' => 'Kann Folgen von Podcast #{id} bearbeiten.',
         'episodes.delete' => 'Kann Folgen von Podcast #{id} löschen.',
         'episodes.manage-persons' => 'Kann Personen von Episoden des Podcasts #{id} verwalten.',
         'episodes.manage-clips' => 'Kann Videoclips und Soundbites des Podcasts #{id} verwalten.',
-        'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.',
+        'episodes.manage-publications' => 'Kann Episoden und Posts von Podcast #{id} veröffentlichen/zurückziehen.',
         'episodes.manage-comments' => 'Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen.',
     ],
 
@@ -90,5 +90,5 @@ return [
 
     // Welcome email
     'welcomeSubject' => 'Sie wurden zu {siteName} eingeladen',
-    'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.',
+    'emailWelcomeMailBody' => 'Ein Account auf {domain} wurde für Sie angelegt, klicken Sie auf den unten stehenden Login-Link, um Ihr Passwort festzulegen. Der Link ist mit Versand der Mail für {numberOfHours} gültig.',
 ];
diff --git a/modules/Auth/Language/de/Contributor.php b/modules/Auth/Language/de/Contributor.php
index 89e53d1c25..27ff60dc29 100644
--- a/modules/Auth/Language/de/Contributor.php
+++ b/modules/Auth/Language/de/Contributor.php
@@ -10,9 +10,9 @@ declare(strict_types=1);
 
 return [
     'podcast_contributors' => 'Podcast-Administratoren',
-    'view' => "{username}'s Administration von {podcastTitle}",
-    'add' => 'Adminstrator zufügen',
-    'add_contributor' => 'Administrator zufügen für {0}',
+    'view' => "{username}'s Mitwirkung an {podcastTitle}",
+    'add' => 'Mitwirkenden zufügen',
+    'add_contributor' => 'Mitwirkenden zufügen für {0}',
     'edit_role' => 'Rolle aktualisieren für {0}',
     'edit' => 'Bearbeiten',
     'remove' => 'Entfernen',
diff --git a/modules/Auth/Language/de/User.php b/modules/Auth/Language/de/User.php
index 47c7ad2f5f..68649b0a4d 100644
--- a/modules/Auth/Language/de/User.php
+++ b/modules/Auth/Language/de/User.php
@@ -9,17 +9,17 @@ declare(strict_types=1);
  */
 
 return [
-    'edit_role' => "{username}'s Rolle bearbeiten",
-    'ban' => 'Bannen',
-    'unban' => 'Entbannen',
+    'edit_role' => "Die Rolle(n) von {username} bearbeiten",
+    'ban' => 'Sperren',
+    'unban' => 'Entsperren',
     'delete' => 'Löschen',
     'create' => 'Neuer Benutzer',
-    'view' => "{username}'s Info",
+    'view' => "{username}-Infos",
     'all_users' => 'Alle Benutzer',
     'list' => [
         'user' => 'Benutzer',
         'role' => 'Rolle',
-        'banned' => 'Gebannt?',
+        'banned' => 'Gesperrt?',
     ],
     'form' => [
         'email' => 'E-mail',
@@ -48,7 +48,7 @@ return [
         'banSuccess' => '{username} wurde gebannt.',
         'unbanSuccess' => '{username} wurde entbannt.',
         'editOwnerError' =>
-            '{username} is the instance owner, you cannot edit its roles.',
+            '{username} ist Eigentümer der Instanz, Eigentümer können nicht gelöscht werden…',
         'banSuperAdminError' =>
             '{username} ist ein Superadmin, man bannt nicht einfach einen Superadmin…',
         'deleteOwnerError' =>
diff --git a/modules/Auth/Language/fr/Auth.php b/modules/Auth/Language/fr/Auth.php
index a47932e317..39a0aaefdb 100644
--- a/modules/Auth/Language/fr/Auth.php
+++ b/modules/Auth/Language/fr/Auth.php
@@ -11,84 +11,84 @@ declare(strict_types=1);
 return [
     'instance_groups' => [
         'owner' => [
-            'title' => 'Instance Owner',
-            'description' => 'The Castopod owner.',
+            'title' => 'Propriétaire de l\'instance',
+            'description' => 'Le propriétaire du Castopod.',
         ],
         'superadmin' => [
-            'title' => 'Super admin',
-            'description' => 'Has complete control over Castopod.',
+            'title' => 'Super administrat·rice·eur',
+            'description' => 'A un contrôle complet sur Castopod.',
         ],
         'manager' => [
-            'title' => 'Manager',
-            'description' => 'Manages Castopod\'s content.',
+            'title' => 'Gestionnaire',
+            'description' => 'Gère le contenu de Castopod.',
         ],
         'podcaster' => [
-            'title' => 'Podcaster',
-            'description' => 'General users of Castopod.',
+            'title' => 'Podcast·rice·eur',
+            'description' => 'Utilisateurs généraux de Castopod.',
         ],
     ],
     'instance_permissions' => [
-        'admin.access' => 'Can access the Castopod admin area.',
-        'admin.settings' => 'Can access the Castopod settings.',
-        'users.manage' => 'Can manage Castopod users.',
-        'persons.manage' => 'Can manage persons.',
-        'pages.manage' => 'Can manage pages.',
-        'podcasts.view' => 'Can view all podcasts.',
-        'podcasts.create' => 'Can create new podcasts.',
-        'podcasts.import' => 'Can import podcasts.',
-        'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.',
+        'admin.access' => 'Peut accéder à la zone d\'administration Castopod.',
+        'admin.settings' => 'Peut accéder aux paramètres de Castopod.',
+        'users.manage' => 'Peut gérer les utilisateurs de Castopod.',
+        'persons.manage' => 'Permet de gérer les personnes.',
+        'pages.manage' => 'Permet de gérer les pages.',
+        'podcasts.view' => 'Peut voir tous les podcasts.',
+        'podcasts.create' => 'Peut créer de nouveaux podcasts.',
+        'podcasts.import' => 'Peut importer des podcasts.',
+        'fediverse.manage-blocks' => 'Peut empêcher des act·rice·eur·s/domaines d\'interagir avec Castopod.',
     ],
     'podcast_groups' => [
         'owner' => [
-            'title' => 'Podcast Owner',
-            'description' => 'The podcast owner.',
+            'title' => 'Propriétaire du Podcast',
+            'description' => 'Le/la propriétaire du podcast.',
         ],
         'admin' => [
-            'title' => 'Admin',
-            'description' => 'Has complete control of podcast #{id}.',
+            'title' => 'Administrateur',
+            'description' => 'A un contrôle total sur le podcast #{id}.',
         ],
         'editor' => [
-            'title' => 'Editor',
-            'description' => 'Manages content and publications of podcast #{id}.',
+            'title' => 'Éditeur',
+            'description' => 'Gère le contenu et les publications du podcast #{id}.',
         ],
         'author' => [
-            'title' => 'Author',
-            'description' => 'Manages content of podcast #{id} but cannot publish them.',
+            'title' => 'Auteur / Autrice',
+            'description' => 'Gère le contenu du podcast #{id} , mais ne peut pas le publier.',
         ],
         'guest' => [
-            'title' => 'Guest',
-            'description' => 'General contributor of the podcast #{id}.',
+            'title' => 'Invité',
+            'description' => 'Contributeur général du podcast #{id}.',
         ],
     ],
     'podcast_permissions' => [
-        'view' => 'Can view dashboard and analytics of podcast #{id}.',
-        'edit' => 'Can edit podcast #{id}.',
-        'delete' => 'Can delete podcast #{id}.',
-        'manage-import' => 'Can synchronize imported podcast #{id}.',
-        'manage-persons' => 'Can manage subscriptions of podcast #{id}.',
-        'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.',
-        'manage-contributors' => 'Can manage contributors of podcast #{id}.',
-        'manage-platforms' => 'Can set/remove platform links of podcast #{id}.',
-        'manage-publications' => 'Can publish podcast #{id}.',
-        'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.',
-        'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.',
-        'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.',
-        'episodes.create' => 'Can create episodes for podcast #{id}.',
-        'episodes.edit' => 'Can edit episodes of podcast #{id}.',
-        'episodes.delete' => 'Can delete episodes of podcast #{id}.',
-        'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.',
-        'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.',
-        'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.',
-        'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.',
+        'view' => 'Peut voir le tableau de bord et les analyses du podcast #{id}.',
+        'edit' => 'Peut éditer le podcast #{id}.',
+        'delete' => 'Peut supprimer le podcast #{id}.',
+        'manage-import' => 'Peut synchroniser le podcast importé #{id}.',
+        'manage-persons' => 'Permet de gérer les abonnements au podcast #{id}.',
+        'manage-subscriptions' => 'Permet de gérer les abonnements au podcast #{id}.',
+        'manage-contributors' => 'Permet de gérer les contributeurs du podcast #{id}.',
+        'manage-platforms' => 'Peut configurer/supprimer les liens de la plateforme du podcast #{id}.',
+        'manage-publications' => 'Peut publier le podcast #{id}.',
+        'manage-notifications' => 'Peut afficher et marquer les notifications comme lues pour le podcast #{id}.',
+        'interact-as' => 'Peut interagir en tant que podcast #{id} pour mettre en favori, partager ou répondre aux messages.',
+        'episodes.view' => 'Peut voir le tableau de bord et les statistiques du podcast #{id}.',
+        'episodes.create' => 'Peut créer des épisodes pour le podcast #{id}.',
+        'episodes.edit' => 'Peut modifier les épisodes du podcast #{id}.',
+        'episodes.delete' => 'Peut supprimer les épisodes du podcast #{id}.',
+        'episodes.manage-persons' => 'Peut gérer les intervenants des épisodes du podcast #{id}.',
+        'episodes.manage-clips' => 'Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}.',
+        'episodes.manage-publications' => 'Peut publier/dépublier des épisodes et des messages de podcast #{id}.',
+        'episodes.manage-comments' => 'Peut créer/supprimer les commentaires de l\'épisode du podcast #{id}.',
     ],
 
     // missing keys
-    'code' => 'Your 6-digit code',
+    'code' => 'Votre code à 6 chiffres',
 
-    'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.',
-    'set_password' => 'Set your password',
+    'notEnoughPrivilege' => 'Vous n\'avez pas les autorisations pour accéder à cette page.',
+    'set_password' => 'Choisis ton mot de passe',
 
     // Welcome email
-    'welcomeSubject' => 'You\'ve been invited to {siteName}',
-    'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.',
+    'welcomeSubject' => 'Vous avez été invité·e à rejoindre {siteName}',
+    'emailWelcomeMailBody' => 'Un compte a été créé pour vous sur {domain}, cliquez sur le lien de connexion ci-dessous pour définir votre mot de passe. Le lien est valide pendant {numberOfHours} heures après l\'envoi de cet e-mail.',
 ];
diff --git a/modules/Auth/Language/fr/Contributor.php b/modules/Auth/Language/fr/Contributor.php
index 2a1f9dd2cf..a9006130a4 100644
--- a/modules/Auth/Language/fr/Contributor.php
+++ b/modules/Auth/Language/fr/Contributor.php
@@ -29,15 +29,15 @@ return [
         'submit_edit' => 'Mettre à jour le rôle',
     ],
     'delete_form' => [
-        'title' => 'Remove {contributor}',
+        'title' => 'Supprimer {contributor}',
         'disclaimer' =>
-            'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.',
-        'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"',
-        'submit' => 'Remove',
+            'Vous êtes sur le point de supprimer {contributor} des contributeurs. Ils ne pourront plus accéder à "{podcastTitle}".',
+        'understand' => 'Je comprends, je veux retirer {contributor} de "{podcastTitle}"',
+        'submit' => 'Retirer',
     ],
     'messages' => [
-        'editSuccess' => 'Role successfully changed!',
-        'editOwnerError' => "You can't edit the podcast owner!",
+        'editSuccess' => 'Rôle modifié avec succès !',
+        'editOwnerError' => "Vous ne pouvez pas modifier le propriétaire du podcast !",
         'removeOwnerError' => "Vous ne pouvez pas retirer le propriétaire du podcast !",
         'removeSuccess' =>
             'Vous avez retiré {username} de {podcastTitle}',
diff --git a/modules/Auth/Language/fr/User.php b/modules/Auth/Language/fr/User.php
index 69d864d1ed..911391583d 100644
--- a/modules/Auth/Language/fr/User.php
+++ b/modules/Auth/Language/fr/User.php
@@ -9,7 +9,7 @@ declare(strict_types=1);
  */
 
 return [
-    'edit_role' => "Edit {username}'s role",
+    'edit_role' => "Modifier le rôle de {username}",
     'ban' => 'Bloquer',
     'unban' => 'Débloquer',
     'delete' => 'Supprimer',
@@ -18,7 +18,7 @@ return [
     'all_users' => 'Tous les utilisateurs',
     'list' => [
         'user' => 'Utilisateurs',
-        'role' => 'Role',
+        'role' => 'Rôle',
         'banned' => 'Bloqué ?',
     ],
     'form' => [
@@ -26,7 +26,7 @@ return [
         'username' => 'Identifiant',
         'password' => 'Mot de passe',
         'new_password' => 'Nouveau mot de passe',
-        'role' => 'Role',
+        'role' => 'Rôle',
         'roles' => 'Rôles',
         'permissions' => 'Permissions',
         'submit_create' => 'Créer un utilisateur',
@@ -34,11 +34,11 @@ return [
         'submit_password_change' => 'Valider !',
     ],
     'delete_form' => [
-        'title' => 'Delete {user}',
+        'title' => 'Supprimer {user}',
         'disclaimer' =>
-            "You are about to delete {user} permanently. They will not be able to access the admin area anymore.",
-        'understand' => 'I understand, I want to delete {user} permanently',
-        'submit' => 'Delete',
+            "Vous êtes sur le point de supprimer {user} définitivement. Ils ne pourront plus accéder à la zone d'administration.",
+        'understand' => 'Je comprends, je veux supprimer {user} définitivement',
+        'submit' => 'Supprimer',
     ],
     'messages' => [
         'createSuccess' =>
@@ -52,7 +52,7 @@ return [
         'banSuperAdminError' =>
             '{username} est un super-utilisateur, on ne bloque pas un super-utilisateur comme ça…',
         'deleteOwnerError' =>
-            '{username} is the instance owner, one does not simply delete the owner…',
+            '{username} est le propriétaire de l\'instance, on ne supprime pas le propriétaire…',
         'deleteSuperAdminError' =>
             '{username} est un super-utilisateur, on ne supprime pas un super-utilisateur comme ça…',
         'deleteSuccess' => '{username} a été supprimé.',
diff --git a/modules/Auth/Language/fr_CA/Auth.php b/modules/Auth/Language/fr_CA/Auth.php
new file mode 100644
index 0000000000..a47932e317
--- /dev/null
+++ b/modules/Auth/Language/fr_CA/Auth.php
@@ -0,0 +1,94 @@
+<?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 [
+    'instance_groups' => [
+        'owner' => [
+            'title' => 'Instance Owner',
+            'description' => 'The Castopod owner.',
+        ],
+        'superadmin' => [
+            'title' => 'Super admin',
+            'description' => 'Has complete control over Castopod.',
+        ],
+        'manager' => [
+            'title' => 'Manager',
+            'description' => 'Manages Castopod\'s content.',
+        ],
+        'podcaster' => [
+            'title' => 'Podcaster',
+            'description' => 'General users of Castopod.',
+        ],
+    ],
+    'instance_permissions' => [
+        'admin.access' => 'Can access the Castopod admin area.',
+        'admin.settings' => 'Can access the Castopod settings.',
+        'users.manage' => 'Can manage Castopod users.',
+        'persons.manage' => 'Can manage persons.',
+        'pages.manage' => 'Can manage pages.',
+        'podcasts.view' => 'Can view all podcasts.',
+        'podcasts.create' => 'Can create new podcasts.',
+        'podcasts.import' => 'Can import podcasts.',
+        'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.',
+    ],
+    'podcast_groups' => [
+        'owner' => [
+            'title' => 'Podcast Owner',
+            'description' => 'The podcast owner.',
+        ],
+        'admin' => [
+            'title' => 'Admin',
+            'description' => 'Has complete control of podcast #{id}.',
+        ],
+        'editor' => [
+            'title' => 'Editor',
+            'description' => 'Manages content and publications of podcast #{id}.',
+        ],
+        'author' => [
+            'title' => 'Author',
+            'description' => 'Manages content of podcast #{id} but cannot publish them.',
+        ],
+        'guest' => [
+            'title' => 'Guest',
+            'description' => 'General contributor of the podcast #{id}.',
+        ],
+    ],
+    'podcast_permissions' => [
+        'view' => 'Can view dashboard and analytics of podcast #{id}.',
+        'edit' => 'Can edit podcast #{id}.',
+        'delete' => 'Can delete podcast #{id}.',
+        'manage-import' => 'Can synchronize imported podcast #{id}.',
+        'manage-persons' => 'Can manage subscriptions of podcast #{id}.',
+        'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.',
+        'manage-contributors' => 'Can manage contributors of podcast #{id}.',
+        'manage-platforms' => 'Can set/remove platform links of podcast #{id}.',
+        'manage-publications' => 'Can publish podcast #{id}.',
+        'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.',
+        'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.',
+        'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.',
+        'episodes.create' => 'Can create episodes for podcast #{id}.',
+        'episodes.edit' => 'Can edit episodes of podcast #{id}.',
+        'episodes.delete' => 'Can delete episodes of podcast #{id}.',
+        'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.',
+        'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.',
+        'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.',
+        'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.',
+    ],
+
+    // missing keys
+    'code' => 'Your 6-digit code',
+
+    'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.',
+    'set_password' => 'Set your password',
+
+    // Welcome email
+    'welcomeSubject' => 'You\'ve been invited to {siteName}',
+    'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.',
+];
diff --git a/modules/Auth/Language/fr_CA/Contributor.php b/modules/Auth/Language/fr_CA/Contributor.php
new file mode 100644
index 0000000000..c70badc0a1
--- /dev/null
+++ b/modules/Auth/Language/fr_CA/Contributor.php
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_contributors' => 'Podcast contributors',
+    'view' => "{username}'s contribution to {podcastTitle}",
+    'add' => 'Add contributor',
+    'add_contributor' => 'Add a contributor for {0}',
+    'edit_role' => 'Update role for {0}',
+    'edit' => 'Edit',
+    'remove' => 'Remove',
+    'list' => [
+        'username' => 'Username',
+        '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',
+    ],
+    'delete_form' => [
+        'title' => 'Remove {contributor}',
+        'disclaimer' =>
+            'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.',
+        'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"',
+        'submit' => 'Remove',
+    ],
+    'messages' => [
+        'editSuccess' => 'Role successfully changed!',
+        'editOwnerError' => "You can't edit the podcast owner!",
+        'removeOwnerError' => "You can't remove the podcast owner!",
+        'removeSuccess' =>
+            'You have successfully removed {username} from {podcastTitle}',
+        'alreadyAddedError' =>
+            "The contributor you're trying to add has already been added!",
+    ],
+];
diff --git a/modules/Auth/Language/fr_CA/MyAccount.php b/modules/Auth/Language/fr_CA/MyAccount.php
new file mode 100644
index 0000000000..6ebbb30ef7
--- /dev/null
+++ b/modules/Auth/Language/fr_CA/MyAccount.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'info' => 'My account info',
+    'changePassword' => 'Change my password',
+    'messages' => [
+        'wrongPasswordError' => "You've entered the wrong password, try again.",
+        'passwordChangeSuccess' => 'Password has been successfully changed!',
+    ],
+];
diff --git a/modules/Auth/Language/fr_CA/User.php b/modules/Auth/Language/fr_CA/User.php
new file mode 100644
index 0000000000..32ec560cd5
--- /dev/null
+++ b/modules/Auth/Language/fr_CA/User.php
@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'edit_role' => "Edit {username}'s role",
+    'ban' => 'Ban',
+    'unban' => 'Unban',
+    'delete' => 'Delete',
+    'create' => 'New user',
+    'view' => "{username}'s info",
+    'all_users' => 'All users',
+    'list' => [
+        'user' => 'User',
+        'role' => 'Role',
+        'banned' => 'Banned?',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'username' => 'Username',
+        'password' => 'Password',
+        'new_password' => 'New Password',
+        'role' => 'Role',
+        'roles' => 'Roles',
+        'permissions' => 'Permissions',
+        'submit_create' => 'Create user',
+        'submit_edit' => 'Save',
+        'submit_password_change' => 'Change!',
+    ],
+    'delete_form' => [
+        'title' => 'Delete {user}',
+        'disclaimer' =>
+            "You are about to delete {user} permanently. They will not be able to access the admin area anymore.",
+        'understand' => 'I understand, I want to delete {user} permanently',
+        'submit' => 'Delete',
+    ],
+    'messages' => [
+        'createSuccess' =>
+            'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.',
+        'roleEditSuccess' =>
+            "{username}'s roles have been successfully updated.",
+        'banSuccess' => '{username} has been banned.',
+        'unbanSuccess' => '{username} has been unbanned.',
+        'editOwnerError' =>
+            '{username} is the instance owner, one does not simply touch the owner…',
+        'banSuperAdminError' =>
+            '{username} is a superadmin, one does not simply ban a superadmin…',
+        'deleteOwnerError' =>
+            '{username} is the instance owner, one does not simply delete the owner…',
+        'deleteSuperAdminError' =>
+            '{username} is a superadmin, one does not simply delete a superadmin…',
+        'deleteSuccess' => '{username} has been deleted.',
+    ],
+];
diff --git a/modules/Auth/Language/fr_trad/Auth.php b/modules/Auth/Language/fr_trad/Auth.php
new file mode 100644
index 0000000000..a47932e317
--- /dev/null
+++ b/modules/Auth/Language/fr_trad/Auth.php
@@ -0,0 +1,94 @@
+<?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 [
+    'instance_groups' => [
+        'owner' => [
+            'title' => 'Instance Owner',
+            'description' => 'The Castopod owner.',
+        ],
+        'superadmin' => [
+            'title' => 'Super admin',
+            'description' => 'Has complete control over Castopod.',
+        ],
+        'manager' => [
+            'title' => 'Manager',
+            'description' => 'Manages Castopod\'s content.',
+        ],
+        'podcaster' => [
+            'title' => 'Podcaster',
+            'description' => 'General users of Castopod.',
+        ],
+    ],
+    'instance_permissions' => [
+        'admin.access' => 'Can access the Castopod admin area.',
+        'admin.settings' => 'Can access the Castopod settings.',
+        'users.manage' => 'Can manage Castopod users.',
+        'persons.manage' => 'Can manage persons.',
+        'pages.manage' => 'Can manage pages.',
+        'podcasts.view' => 'Can view all podcasts.',
+        'podcasts.create' => 'Can create new podcasts.',
+        'podcasts.import' => 'Can import podcasts.',
+        'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.',
+    ],
+    'podcast_groups' => [
+        'owner' => [
+            'title' => 'Podcast Owner',
+            'description' => 'The podcast owner.',
+        ],
+        'admin' => [
+            'title' => 'Admin',
+            'description' => 'Has complete control of podcast #{id}.',
+        ],
+        'editor' => [
+            'title' => 'Editor',
+            'description' => 'Manages content and publications of podcast #{id}.',
+        ],
+        'author' => [
+            'title' => 'Author',
+            'description' => 'Manages content of podcast #{id} but cannot publish them.',
+        ],
+        'guest' => [
+            'title' => 'Guest',
+            'description' => 'General contributor of the podcast #{id}.',
+        ],
+    ],
+    'podcast_permissions' => [
+        'view' => 'Can view dashboard and analytics of podcast #{id}.',
+        'edit' => 'Can edit podcast #{id}.',
+        'delete' => 'Can delete podcast #{id}.',
+        'manage-import' => 'Can synchronize imported podcast #{id}.',
+        'manage-persons' => 'Can manage subscriptions of podcast #{id}.',
+        'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.',
+        'manage-contributors' => 'Can manage contributors of podcast #{id}.',
+        'manage-platforms' => 'Can set/remove platform links of podcast #{id}.',
+        'manage-publications' => 'Can publish podcast #{id}.',
+        'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.',
+        'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.',
+        'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.',
+        'episodes.create' => 'Can create episodes for podcast #{id}.',
+        'episodes.edit' => 'Can edit episodes of podcast #{id}.',
+        'episodes.delete' => 'Can delete episodes of podcast #{id}.',
+        'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.',
+        'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.',
+        'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.',
+        'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.',
+    ],
+
+    // missing keys
+    'code' => 'Your 6-digit code',
+
+    'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.',
+    'set_password' => 'Set your password',
+
+    // Welcome email
+    'welcomeSubject' => 'You\'ve been invited to {siteName}',
+    'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.',
+];
diff --git a/modules/Auth/Language/fr_trad/Contributor.php b/modules/Auth/Language/fr_trad/Contributor.php
new file mode 100644
index 0000000000..c70badc0a1
--- /dev/null
+++ b/modules/Auth/Language/fr_trad/Contributor.php
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_contributors' => 'Podcast contributors',
+    'view' => "{username}'s contribution to {podcastTitle}",
+    'add' => 'Add contributor',
+    'add_contributor' => 'Add a contributor for {0}',
+    'edit_role' => 'Update role for {0}',
+    'edit' => 'Edit',
+    'remove' => 'Remove',
+    'list' => [
+        'username' => 'Username',
+        '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',
+    ],
+    'delete_form' => [
+        'title' => 'Remove {contributor}',
+        'disclaimer' =>
+            'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.',
+        'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"',
+        'submit' => 'Remove',
+    ],
+    'messages' => [
+        'editSuccess' => 'Role successfully changed!',
+        'editOwnerError' => "You can't edit the podcast owner!",
+        'removeOwnerError' => "You can't remove the podcast owner!",
+        'removeSuccess' =>
+            'You have successfully removed {username} from {podcastTitle}',
+        'alreadyAddedError' =>
+            "The contributor you're trying to add has already been added!",
+    ],
+];
diff --git a/modules/Auth/Language/fr_trad/MyAccount.php b/modules/Auth/Language/fr_trad/MyAccount.php
new file mode 100644
index 0000000000..6ebbb30ef7
--- /dev/null
+++ b/modules/Auth/Language/fr_trad/MyAccount.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'info' => 'My account info',
+    'changePassword' => 'Change my password',
+    'messages' => [
+        'wrongPasswordError' => "You've entered the wrong password, try again.",
+        'passwordChangeSuccess' => 'Password has been successfully changed!',
+    ],
+];
diff --git a/modules/Auth/Language/fr_trad/User.php b/modules/Auth/Language/fr_trad/User.php
new file mode 100644
index 0000000000..32ec560cd5
--- /dev/null
+++ b/modules/Auth/Language/fr_trad/User.php
@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'edit_role' => "Edit {username}'s role",
+    'ban' => 'Ban',
+    'unban' => 'Unban',
+    'delete' => 'Delete',
+    'create' => 'New user',
+    'view' => "{username}'s info",
+    'all_users' => 'All users',
+    'list' => [
+        'user' => 'User',
+        'role' => 'Role',
+        'banned' => 'Banned?',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'username' => 'Username',
+        'password' => 'Password',
+        'new_password' => 'New Password',
+        'role' => 'Role',
+        'roles' => 'Roles',
+        'permissions' => 'Permissions',
+        'submit_create' => 'Create user',
+        'submit_edit' => 'Save',
+        'submit_password_change' => 'Change!',
+    ],
+    'delete_form' => [
+        'title' => 'Delete {user}',
+        'disclaimer' =>
+            "You are about to delete {user} permanently. They will not be able to access the admin area anymore.",
+        'understand' => 'I understand, I want to delete {user} permanently',
+        'submit' => 'Delete',
+    ],
+    'messages' => [
+        'createSuccess' =>
+            'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.',
+        'roleEditSuccess' =>
+            "{username}'s roles have been successfully updated.",
+        'banSuccess' => '{username} has been banned.',
+        'unbanSuccess' => '{username} has been unbanned.',
+        'editOwnerError' =>
+            '{username} is the instance owner, one does not simply touch the owner…',
+        'banSuperAdminError' =>
+            '{username} is a superadmin, one does not simply ban a superadmin…',
+        'deleteOwnerError' =>
+            '{username} is the instance owner, one does not simply delete the owner…',
+        'deleteSuperAdminError' =>
+            '{username} is a superadmin, one does not simply delete a superadmin…',
+        'deleteSuccess' => '{username} has been deleted.',
+    ],
+];
diff --git a/modules/Auth/Language/nl/Auth.php b/modules/Auth/Language/nl/Auth.php
index bdfcaf996d..60a631a06f 100644
--- a/modules/Auth/Language/nl/Auth.php
+++ b/modules/Auth/Language/nl/Auth.php
@@ -11,7 +11,7 @@ declare(strict_types=1);
 return [
     'instance_groups' => [
         'owner' => [
-            'title' => 'Instance Owner',
+            'title' => 'Instance eigenaar',
             'description' => 'De Castopod eigenaar.',
         ],
         'superadmin' => [
@@ -31,12 +31,12 @@ return [
         'admin.access' => 'Kan toegang krijgen tot de beheeromgeving van Castopod.',
         'admin.settings' => 'Kan toegang krijgen tot de instellingen van Castopod.',
         'users.manage' => 'Kan Castopod-gebruikers beheren.',
-        'persons.manage' => 'Can manage persons.',
+        'persons.manage' => 'Kan personen beheren.',
         'pages.manage' => 'Kan pagina\'s beheren.',
         'podcasts.view' => 'Kan alle podcasts bekijken.',
         'podcasts.create' => 'Kan nieuwe podcast aanmaken.',
         'podcasts.import' => 'Kan podcasts importeren.',
-        'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.',
+        'fediverse.manage-blocks' => 'Kan fediverse actors/domains blokkeren voor interactie met Castopod.',
     ],
     'podcast_groups' => [
         'owner' => [
@@ -65,21 +65,21 @@ return [
         'edit' => 'Kan podcast #{id} wijzigen.',
         'delete' => 'Kan podcast #{id} verwijderen.',
         'manage-import' => 'Kan de geïmporteerde podcast #{id} synchroniseren.',
-        'manage-persons' => 'Can manage subscriptions of podcast #{id}.',
+        'manage-persons' => 'Kan abonnementen van podcast #{id} beheren.',
         'manage-subscriptions' => 'Kan abonnementen van podcast #{id} beheren.',
         'manage-contributors' => 'Kan bijdragers van podcast #{id} beheren.',
-        'manage-platforms' => 'Can set/remove platform links of podcast #{id}.',
+        'manage-platforms' => 'Kan platform links van podcast #{id} instellen of verwijderen.',
         'manage-publications' => 'Kan podcast #{id} publiceren.',
         'manage-notifications' => 'Kan meldingen bekijken en markeren als gelezen voor podcast #{id}.',
-        'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.',
+        'interact-as' => 'Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten.',
         'episodes.view' => 'Kan dashboard en analyses van de afleveringen van podcast #{id} zien.',
         'episodes.create' => 'Kan afleveringen voor podcast #{id} aanmaken.',
         'episodes.edit' => 'Kan afleveringen van podcast #{id} wijzigen.',
         'episodes.delete' => 'Kan afleveringen van podcast #{id} verwijderen.',
-        'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.',
+        'episodes.manage-persons' => 'Kan aflevering personen van podcast #{id} beheren.',
         'episodes.manage-clips' => 'Kan videoclips of soundbites van podcast #{id} beheren.',
         'episodes.manage-publications' => 'Kan afleveringen en berichten van podcast #{id} publiceren/depubliceren.',
-        'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.',
+        'episodes.manage-comments' => 'Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen.',
     ],
 
     // missing keys
diff --git a/modules/Auth/Language/nl/Contributor.php b/modules/Auth/Language/nl/Contributor.php
index 3754bb92b2..f6b11364e0 100644
--- a/modules/Auth/Language/nl/Contributor.php
+++ b/modules/Auth/Language/nl/Contributor.php
@@ -29,15 +29,15 @@ return [
         'submit_edit' => 'Rol bijwerken',
     ],
     'delete_form' => [
-        'title' => 'Remove {contributor}',
+        'title' => 'Verwijder {contributor}',
         'disclaimer' =>
-            'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.',
-        'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"',
-        'submit' => 'Remove',
+            'Je staat op het punt {contributor} te verwijderen van bijdragers. Ze zullen geen toegang meer hebben tot "{podcastTitle}".',
+        'understand' => 'Ik begrijp het, ik wil {contributor} verwijderen van "{podcastTitle}"',
+        'submit' => 'Verwijder',
     ],
     'messages' => [
-        'editSuccess' => 'Role successfully changed!',
-        'editOwnerError' => "You can't edit the podcast owner!",
+        'editSuccess' => 'Rol succesvol veranderd!',
+        'editOwnerError' => "Je kunt de eigenaar van podcast niet bewerken!",
         'removeOwnerError' => "Je kunt de eigenaar van podcast niet verwijderen!",
         'removeSuccess' =>
             'Je hebt {username} met succes verwijderd van {podcastTitle}',
diff --git a/modules/Auth/Language/nl/MyAccount.php b/modules/Auth/Language/nl/MyAccount.php
index 6ebbb30ef7..c7a5d5cfc5 100644
--- a/modules/Auth/Language/nl/MyAccount.php
+++ b/modules/Auth/Language/nl/MyAccount.php
@@ -9,10 +9,10 @@ declare(strict_types=1);
  */
 
 return [
-    'info' => 'My account info',
-    'changePassword' => 'Change my password',
+    'info' => 'Mijn accountgegevens',
+    'changePassword' => 'Wijzig mijn wachtwoord',
     'messages' => [
-        'wrongPasswordError' => "You've entered the wrong password, try again.",
-        'passwordChangeSuccess' => 'Password has been successfully changed!',
+        'wrongPasswordError' => "Je hebt een verkeerd wachtwoord ingevoerd, probeer het opnieuw.",
+        'passwordChangeSuccess' => 'Wachtwoord is succesvol gewijzigd!',
     ],
 ];
diff --git a/modules/Auth/Language/nl/User.php b/modules/Auth/Language/nl/User.php
index e7908f5b9c..ee321721fe 100644
--- a/modules/Auth/Language/nl/User.php
+++ b/modules/Auth/Language/nl/User.php
@@ -9,52 +9,52 @@ declare(strict_types=1);
  */
 
 return [
-    'edit_role' => "Edit {username}'s role",
-    'ban' => 'Ban',
-    'unban' => 'Unban',
-    'delete' => 'Delete',
-    'create' => 'New user',
-    'view' => "{username}'s info",
-    'all_users' => 'All users',
+    'edit_role' => "Rol van {username} wijzigen",
+    'ban' => 'Blokkeren',
+    'unban' => 'Deblokkeren',
+    'delete' => 'Verwijderen',
+    'create' => 'Nieuwe gebruiker',
+    'view' => "Info van {username}",
+    'all_users' => 'Alle gebruikers',
     'list' => [
-        'user' => 'User',
-        'role' => 'Role',
-        'banned' => 'Banned?',
+        'user' => 'Gebruiker',
+        'role' => 'Rol',
+        'banned' => 'Geblokkeerd?',
     ],
     'form' => [
-        'email' => 'Email',
-        'username' => 'Username',
-        'password' => 'Password',
-        'new_password' => 'New Password',
-        'role' => 'Role',
-        'roles' => 'Roles',
-        'permissions' => 'Permissions',
-        'submit_create' => 'Create user',
-        'submit_edit' => 'Save',
-        'submit_password_change' => 'Change!',
+        'email' => 'E-mail',
+        'username' => 'Gebruikersnaam',
+        'password' => 'Wachtwoord',
+        'new_password' => 'Nieuw Wachtwoord',
+        'role' => 'Rol',
+        'roles' => 'Rollen',
+        'permissions' => 'Rechten',
+        'submit_create' => 'Gebruiker aanmaken',
+        'submit_edit' => 'Opslaan',
+        'submit_password_change' => 'Wijzigen!',
     ],
     'delete_form' => [
-        'title' => 'Delete {user}',
+        'title' => 'Verwijder {user}',
         'disclaimer' =>
-            "You are about to delete {user} permanently. They will not be able to access the admin area anymore.",
-        'understand' => 'I understand, I want to delete {user} permanently',
-        'submit' => 'Delete',
+            "Je staat op het punt {user} permanent te verwijderen. Deze zal geen toegang meer hebben tot de beheerdersomgeving.",
+        'understand' => 'Ik begrijp het, ik wil {user} permanent verwijderen',
+        'submit' => 'Verwijderen',
     ],
     'messages' => [
         'createSuccess' =>
-            'User created successfully! {username} will be prompted with a password reset upon first authentication.',
+            'Gebruiker succesvol aangemaakt! Een welkomsmail is naar {username} verzonden met een inloglink, bij de eerste authenticatie zal er om een wachtwoordreset gevraagd worden.',
         'roleEditSuccess' =>
-            "{username}'s roles have been successfully updated.",
-        'banSuccess' => '{username} has been banned.',
-        'unbanSuccess' => '{username} has been unbanned.',
+            "De rollen van {username} zijn succesvol bijgewerkt.",
+        'banSuccess' => '{username} is geblokkeerd.',
+        'unbanSuccess' => '{username} is gedeblokkeerd.',
         'editOwnerError' =>
-            '{username} is the instance owner, you cannot edit its roles.',
+            '{username} is de instance eigenaar, men raakt niet zomaar de eigenaar aan…',
         'banSuperAdminError' =>
-            '{username} is a superadmin, one does not simply ban a superadmin…',
+            '{username} is een super beheerder, men raakt niet zomaar een super beheerder aan…',
         'deleteOwnerError' =>
-            '{username} is the instance owner, one does not simply delete the owner…',
+            '{username} is de instance eigenaar, men verwijderd niet zomaar de eigenaar…',
         'deleteSuperAdminError' =>
-            '{username} is a superadmin, one does not simply delete a superadmin…',
-        'deleteSuccess' => '{username} has been deleted.',
+            '{username} is een superadmin, men verwijderd niet zomaar een superadmin…',
+        'deleteSuccess' => '{username} is verwijderd.',
     ],
 ];
diff --git a/modules/Auth/Language/pl/Contributor.php b/modules/Auth/Language/pl/Contributor.php
index 162a6dd815..ac394200db 100644
--- a/modules/Auth/Language/pl/Contributor.php
+++ b/modules/Auth/Language/pl/Contributor.php
@@ -29,15 +29,15 @@ return [
         'submit_edit' => 'Zaktualizuj rolę',
     ],
     'delete_form' => [
-        'title' => 'Remove {contributor}',
+        'title' => 'Usuń {contributor}',
         'disclaimer' =>
-            'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.',
-        'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"',
-        'submit' => 'Remove',
+            'Zamierzasz usunąć {contributor} z wspierających. Nie będzie miał już mieć dostępu do "{podcastTitle}".',
+        'understand' => 'Rozumiem, chcę usunąć {contributor} z "{podcastTitle}"',
+        'submit' => 'Usuń',
     ],
     'messages' => [
-        'editSuccess' => 'Role successfully changed!',
-        'editOwnerError' => "You can't edit the podcast owner!",
+        'editSuccess' => 'Pomyślnie zmieniono rolę!',
+        'editOwnerError' => "Nie możesz usunąć właściciela podcastu!",
         'removeOwnerError' => "Nie możesz usunąć właściciela podcastu!",
         'removeSuccess' =>
             'Pomyślnie usunąłeś/aś {username} z {podcastTitle}',
diff --git a/modules/Auth/Language/pl/User.php b/modules/Auth/Language/pl/User.php
index b0c8d87f3e..69f2d96bee 100644
--- a/modules/Auth/Language/pl/User.php
+++ b/modules/Auth/Language/pl/User.php
@@ -9,7 +9,7 @@ declare(strict_types=1);
  */
 
 return [
-    'edit_role' => "Edit {username}'s role",
+    'edit_role' => "Edytuj role użytkownika {username}",
     'ban' => 'Zablokuj',
     'unban' => 'Odblokuj',
     'delete' => 'Usuń',
@@ -18,7 +18,7 @@ return [
     'all_users' => 'Wszyscy użytkownicy',
     'list' => [
         'user' => 'Użytkownik',
-        'role' => 'Role',
+        'role' => 'Rola',
         'banned' => 'Zablokowany?',
     ],
     'form' => [
@@ -26,7 +26,7 @@ return [
         'username' => 'Nazwa użytkownika',
         'password' => 'Hasło',
         'new_password' => 'Nowe hasło',
-        'role' => 'Role',
+        'role' => 'Rola',
         'roles' => 'Role',
         'permissions' => 'Uprawnienia',
         'submit_create' => 'Stwórz użytkownika',
@@ -34,11 +34,11 @@ return [
         'submit_password_change' => 'Zmień!',
     ],
     'delete_form' => [
-        'title' => 'Delete {user}',
+        'title' => 'Usuń użytkownika {user}',
         'disclaimer' =>
-            "You are about to delete {user} permanently. They will not be able to access the admin area anymore.",
-        'understand' => 'I understand, I want to delete {user} permanently',
-        'submit' => 'Delete',
+            "Zamierzasz usunąć {user} na stałe. Nie będą już mogli uzyskać dostępu do obszaru administratora.",
+        'understand' => 'Rozumiem, chcę trwale usunąć {user}',
+        'submit' => 'Usuń',
     ],
     'messages' => [
         'createSuccess' =>
@@ -52,7 +52,7 @@ return [
         'banSuperAdminError' =>
             '{username} jest superadministratorem, nie można po prostu zablokować superadministratora…',
         'deleteOwnerError' =>
-            '{username} is the instance owner, one does not simply delete the owner…',
+            '{username} jest właścicielem instancji, nie można usunąć właściciela…',
         'deleteSuperAdminError' =>
             '{username} jest superadministratorem, nie można po prostu usunąć superadministratora…',
         'deleteSuccess' => '{username} został usunięty.',
diff --git a/modules/Auth/Language/pt-BR/Contributor.php b/modules/Auth/Language/pt-BR/Contributor.php
index a2188fe8a9..5dc72942c3 100644
--- a/modules/Auth/Language/pt-BR/Contributor.php
+++ b/modules/Auth/Language/pt-BR/Contributor.php
@@ -29,15 +29,15 @@ return [
         'submit_edit' => 'Atualizar cargo',
     ],
     'delete_form' => [
-        'title' => 'Remove {contributor}',
+        'title' => 'Remover {contributor}',
         'disclaimer' =>
-            'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.',
-        'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"',
-        'submit' => 'Remove',
+            'Você está prestes a remover {contributor} dos colaboradores. Eles não poderão mais acessar "{podcastTitle}".',
+        'understand' => 'Eu entendo, eu desejo remover {contributor} de "{podcastTitle}"',
+        'submit' => 'Remover',
     ],
     'messages' => [
-        'editSuccess' => 'Role successfully changed!',
-        'editOwnerError' => "You can't edit the podcast owner!",
+        'editSuccess' => 'Cargo alterado com sucesso!',
+        'editOwnerError' => "Você não pode editar o dono do podcast!",
         'removeOwnerError' => "Você não pode remover o dono do podcast!",
         'removeSuccess' =>
             'Você removeu {username} com sucesso de {podcastTitle}',
diff --git a/modules/Auth/Language/uk/Auth.php b/modules/Auth/Language/uk/Auth.php
new file mode 100644
index 0000000000..a47932e317
--- /dev/null
+++ b/modules/Auth/Language/uk/Auth.php
@@ -0,0 +1,94 @@
+<?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 [
+    'instance_groups' => [
+        'owner' => [
+            'title' => 'Instance Owner',
+            'description' => 'The Castopod owner.',
+        ],
+        'superadmin' => [
+            'title' => 'Super admin',
+            'description' => 'Has complete control over Castopod.',
+        ],
+        'manager' => [
+            'title' => 'Manager',
+            'description' => 'Manages Castopod\'s content.',
+        ],
+        'podcaster' => [
+            'title' => 'Podcaster',
+            'description' => 'General users of Castopod.',
+        ],
+    ],
+    'instance_permissions' => [
+        'admin.access' => 'Can access the Castopod admin area.',
+        'admin.settings' => 'Can access the Castopod settings.',
+        'users.manage' => 'Can manage Castopod users.',
+        'persons.manage' => 'Can manage persons.',
+        'pages.manage' => 'Can manage pages.',
+        'podcasts.view' => 'Can view all podcasts.',
+        'podcasts.create' => 'Can create new podcasts.',
+        'podcasts.import' => 'Can import podcasts.',
+        'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.',
+    ],
+    'podcast_groups' => [
+        'owner' => [
+            'title' => 'Podcast Owner',
+            'description' => 'The podcast owner.',
+        ],
+        'admin' => [
+            'title' => 'Admin',
+            'description' => 'Has complete control of podcast #{id}.',
+        ],
+        'editor' => [
+            'title' => 'Editor',
+            'description' => 'Manages content and publications of podcast #{id}.',
+        ],
+        'author' => [
+            'title' => 'Author',
+            'description' => 'Manages content of podcast #{id} but cannot publish them.',
+        ],
+        'guest' => [
+            'title' => 'Guest',
+            'description' => 'General contributor of the podcast #{id}.',
+        ],
+    ],
+    'podcast_permissions' => [
+        'view' => 'Can view dashboard and analytics of podcast #{id}.',
+        'edit' => 'Can edit podcast #{id}.',
+        'delete' => 'Can delete podcast #{id}.',
+        'manage-import' => 'Can synchronize imported podcast #{id}.',
+        'manage-persons' => 'Can manage subscriptions of podcast #{id}.',
+        'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.',
+        'manage-contributors' => 'Can manage contributors of podcast #{id}.',
+        'manage-platforms' => 'Can set/remove platform links of podcast #{id}.',
+        'manage-publications' => 'Can publish podcast #{id}.',
+        'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.',
+        'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.',
+        'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.',
+        'episodes.create' => 'Can create episodes for podcast #{id}.',
+        'episodes.edit' => 'Can edit episodes of podcast #{id}.',
+        'episodes.delete' => 'Can delete episodes of podcast #{id}.',
+        'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.',
+        'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.',
+        'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.',
+        'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.',
+    ],
+
+    // missing keys
+    'code' => 'Your 6-digit code',
+
+    'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.',
+    'set_password' => 'Set your password',
+
+    // Welcome email
+    'welcomeSubject' => 'You\'ve been invited to {siteName}',
+    'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.',
+];
diff --git a/modules/Auth/Language/uk/Contributor.php b/modules/Auth/Language/uk/Contributor.php
new file mode 100644
index 0000000000..c70badc0a1
--- /dev/null
+++ b/modules/Auth/Language/uk/Contributor.php
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'podcast_contributors' => 'Podcast contributors',
+    'view' => "{username}'s contribution to {podcastTitle}",
+    'add' => 'Add contributor',
+    'add_contributor' => 'Add a contributor for {0}',
+    'edit_role' => 'Update role for {0}',
+    'edit' => 'Edit',
+    'remove' => 'Remove',
+    'list' => [
+        'username' => 'Username',
+        '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',
+    ],
+    'delete_form' => [
+        'title' => 'Remove {contributor}',
+        'disclaimer' =>
+            'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.',
+        'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"',
+        'submit' => 'Remove',
+    ],
+    'messages' => [
+        'editSuccess' => 'Role successfully changed!',
+        'editOwnerError' => "You can't edit the podcast owner!",
+        'removeOwnerError' => "You can't remove the podcast owner!",
+        'removeSuccess' =>
+            'You have successfully removed {username} from {podcastTitle}',
+        'alreadyAddedError' =>
+            "The contributor you're trying to add has already been added!",
+    ],
+];
diff --git a/modules/Auth/Language/uk/MyAccount.php b/modules/Auth/Language/uk/MyAccount.php
new file mode 100644
index 0000000000..0b511d5115
--- /dev/null
+++ b/modules/Auth/Language/uk/MyAccount.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'info' => 'Інформація про аккаунт',
+    'changePassword' => 'Змінити мій пароль',
+    'messages' => [
+        'wrongPasswordError' => "Ви ввели неправильний пароль, спробуйте ще раз.",
+        'passwordChangeSuccess' => 'Ваш пароль успішно змінено.',
+    ],
+];
diff --git a/modules/Auth/Language/uk/User.php b/modules/Auth/Language/uk/User.php
new file mode 100644
index 0000000000..a9383f65e9
--- /dev/null
+++ b/modules/Auth/Language/uk/User.php
@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'edit_role' => "Змінити роль «%{name}»",
+    'ban' => 'Забанити',
+    'unban' => 'Розбанити',
+    'delete' => 'Видалити',
+    'create' => 'Новий користувач',
+    'view' => "{username}інформація",
+    'all_users' => 'Усі користувачі',
+    'list' => [
+        'user' => 'Користувач',
+        'role' => 'Роль',
+        'banned' => 'Забанені?',
+    ],
+    'form' => [
+        'email' => 'Пошта',
+        'username' => 'Ім\'я користувача',
+        'password' => 'Пароль',
+        'new_password' => 'Новий пароль',
+        'role' => 'Роль',
+        'roles' => 'Ролі',
+        'permissions' => 'Дозволи',
+        'submit_create' => 'Створити користувача',
+        'submit_edit' => 'Зберегти',
+        'submit_password_change' => 'Змінити',
+    ],
+    'delete_form' => [
+        'title' => 'Видалити користувача?',
+        'disclaimer' =>
+            "You are about to delete {user} permanently. They will not be able to access the admin area anymore.",
+        'understand' => 'I understand, I want to delete {user} permanently',
+        'submit' => 'Delete',
+    ],
+    'messages' => [
+        'createSuccess' =>
+            'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.',
+        'roleEditSuccess' =>
+            "{username}'s roles have been successfully updated.",
+        'banSuccess' => '{username} has been banned.',
+        'unbanSuccess' => '{username} has been unbanned.',
+        'editOwnerError' =>
+            '{username} is the instance owner, one does not simply touch the owner…',
+        'banSuperAdminError' =>
+            '{username} is a superadmin, one does not simply ban a superadmin…',
+        'deleteOwnerError' =>
+            '{username} is the instance owner, one does not simply delete the owner…',
+        'deleteSuperAdminError' =>
+            '{username} is a superadmin, one does not simply delete a superadmin…',
+        'deleteSuccess' => '{username} has been deleted.',
+    ],
+];
diff --git a/modules/Install/Language/de/Install.php b/modules/Install/Language/de/Install.php
index b3269fdb32..ecebbfa7c7 100644
--- a/modules/Install/Language/de/Install.php
+++ b/modules/Install/Language/de/Install.php
@@ -21,10 +21,10 @@ return [
             'Wenn du einen CDN und/oder einen externen Analysedienst verwendest, kannst du diesen hier festlegen.',
         'admin_gateway' => 'Admin-Gateway',
         'admin_gateway_hint' =>
-            'Die Route zum Zugriff auf den Admin-Bereich (z.B. https://example.com/cp-admin), wird standardmäßig als "cp-admin" festgelegt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.',
+            'Der Pfad zum Zugriff auf den Admin-Bereich (z.B. https://example.com/cp-admin), wird standardmäßig als "cp-admin" festgelegt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.',
         'auth_gateway' => 'Auth-Gateway',
         'auth_gateway_hint' =>
-            'Die Route zum Zugriff auf die Authentifizierungsseiten (z. B. https://example.com/cp-auth), wird standardmäßig als "cp-auth" gesetzt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.',
+            'Der Pfad zum Zugriff auf die Authentifizierungsseiten (z. B. https://example.com/cp-auth), wird standardmäßig als "cp-auth" gesetzt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.',
         'database_config' => 'Datenbankkonfiguration',
         'database_config_hint' =>
             'Castopod muss sich mit der MySQL-Datenbank (oder MariaDB) verbinden. Wenn diese erforderlichen Informationen nicht verfügbar sind, wende dich bitte an deinen Serveradministrator.',
diff --git a/modules/Install/Language/fr_CA/Install.php b/modules/Install/Language/fr_CA/Install.php
new file mode 100644
index 0000000000..45d2608580
--- /dev/null
+++ b/modules/Install/Language/fr_CA/Install.php
@@ -0,0 +1,62 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Castopod installer',
+    'manual_config' => 'Manual configuration',
+    'manual_config_subtitle' =>
+        'Create a `.env` file with your settings and refresh the page to continue installation.',
+    'form' => [
+        'instance_config' => 'Instance configuration',
+        'hostname' => 'Hostname',
+        'media_base_url' => 'Media base URL',
+        'media_base_url_hint' =>
+            'If you use a CDN and/or an external analytics service, you may set them here.',
+        'admin_gateway' => 'Admin gateway',
+        'admin_gateway_hint' =>
+            'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.',
+        'auth_gateway' => 'Auth gateway',
+        'auth_gateway_hint' =>
+            'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.',
+        'database_config' => 'Database configuration',
+        'database_config_hint' =>
+            'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.',
+        'db_hostname' => 'Database hostname',
+        'db_name' => 'Database name',
+        'db_username' => 'Database username',
+        'db_password' => 'Database password',
+        'db_prefix' => 'Database prefix',
+        'db_prefix_hint' =>
+            "The prefix of the Castopod table names, leave as is if you don't know what it means.",
+        'cache_config' => 'Cache configuration',
+        'cache_config_hint' =>
+            'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.',
+        'cache_handler' => 'Cache handler',
+        'cacheHandlerOptions' => [
+            'file' => 'File',
+            'redis' => 'Redis',
+            'predis' => 'Predis',
+        ],
+        'next' => 'Next',
+        'submit' => 'Finish install',
+        'create_superadmin' => 'Create your Super Admin account',
+        'email' => 'Email',
+        'username' => 'Username',
+        'password' => 'Password',
+    ],
+    'messages' => [
+        'createSuperAdminSuccess' =>
+            'Your superadmin account has been created successfully. Login to start podcasting!',
+        'databaseConnectError' =>
+            'Castopod could not connect to your database. Edit your database configuration and try again.',
+        'writeError' =>
+            "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.",
+    ],
+];
diff --git a/modules/Install/Language/fr_trad/Install.php b/modules/Install/Language/fr_trad/Install.php
new file mode 100644
index 0000000000..45d2608580
--- /dev/null
+++ b/modules/Install/Language/fr_trad/Install.php
@@ -0,0 +1,62 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Castopod installer',
+    'manual_config' => 'Manual configuration',
+    'manual_config_subtitle' =>
+        'Create a `.env` file with your settings and refresh the page to continue installation.',
+    'form' => [
+        'instance_config' => 'Instance configuration',
+        'hostname' => 'Hostname',
+        'media_base_url' => 'Media base URL',
+        'media_base_url_hint' =>
+            'If you use a CDN and/or an external analytics service, you may set them here.',
+        'admin_gateway' => 'Admin gateway',
+        'admin_gateway_hint' =>
+            'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.',
+        'auth_gateway' => 'Auth gateway',
+        'auth_gateway_hint' =>
+            'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.',
+        'database_config' => 'Database configuration',
+        'database_config_hint' =>
+            'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.',
+        'db_hostname' => 'Database hostname',
+        'db_name' => 'Database name',
+        'db_username' => 'Database username',
+        'db_password' => 'Database password',
+        'db_prefix' => 'Database prefix',
+        'db_prefix_hint' =>
+            "The prefix of the Castopod table names, leave as is if you don't know what it means.",
+        'cache_config' => 'Cache configuration',
+        'cache_config_hint' =>
+            'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.',
+        'cache_handler' => 'Cache handler',
+        'cacheHandlerOptions' => [
+            'file' => 'File',
+            'redis' => 'Redis',
+            'predis' => 'Predis',
+        ],
+        'next' => 'Next',
+        'submit' => 'Finish install',
+        'create_superadmin' => 'Create your Super Admin account',
+        'email' => 'Email',
+        'username' => 'Username',
+        'password' => 'Password',
+    ],
+    'messages' => [
+        'createSuperAdminSuccess' =>
+            'Your superadmin account has been created successfully. Login to start podcasting!',
+        'databaseConnectError' =>
+            'Castopod could not connect to your database. Edit your database configuration and try again.',
+        'writeError' =>
+            "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.",
+    ],
+];
diff --git a/modules/Install/Language/sk/Install.php b/modules/Install/Language/sk/Install.php
index 1f66ef118f..2dc1ed4dea 100644
--- a/modules/Install/Language/sk/Install.php
+++ b/modules/Install/Language/sk/Install.php
@@ -25,7 +25,7 @@ return [
         'auth_gateway' => 'Auth gateway',
         'auth_gateway_hint' =>
             'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.',
-        'database_config' => 'Database configuration',
+        'database_config' => 'Nastavenie databázy',
         'database_config_hint' =>
             'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.',
         'db_hostname' => 'Database hostname',
diff --git a/modules/Install/Language/uk/Install.php b/modules/Install/Language/uk/Install.php
new file mode 100644
index 0000000000..a06569bb08
--- /dev/null
+++ b/modules/Install/Language/uk/Install.php
@@ -0,0 +1,62 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Кастопод інсталятор',
+    'manual_config' => 'Ручне налаштування',
+    'manual_config_subtitle' =>
+        'Створіть файл `.env` з налаштуваннями та перезавантажте сторінку, щоб продовжити встановлення.',
+    'form' => [
+        'instance_config' => 'Конфігурація екземпляру',
+        'hostname' => 'Ім\'я хоста',
+        'media_base_url' => 'URL-адреса бази даних медіа',
+        'media_base_url_hint' =>
+            'Якщо ви використовуєте CDN та/або зовнішній аналітичний сервіс, ви можете встановити їх тут.',
+        'admin_gateway' => 'Шлюз Адміністратора',
+        'admin_gateway_hint' =>
+            'Шлях до сторінки аутентифікації (наприклад https://example.com/cp-admin). Встановлений за замовчуванням cp-auth, Ми рекомендуємо вам змінити його з міркувань безпеки.',
+        'auth_gateway' => 'Шлюз авторизації',
+        'auth_gateway_hint' =>
+            'Шлях до сторінки аутентифікації (наприклад https://example.com/cp-auth). Встановлений за замовчуванням cp-auth, Ми рекомендуємо вам змінити його з міркувань безпеки.',
+        'database_config' => 'Налаштування бази даних',
+        'database_config_hint' =>
+            'Кастопод потребує підключення до бази даних MySQL (або MariaDB) для відновлення. Якщо у вас немає такої необхідної інформації, будь ласка, зверніться до адміністратора вашого сервера.',
+        'db_hostname' => 'Ім\'я хоста бази даних',
+        'db_name' => 'Назва бази даних',
+        'db_username' => 'Ім\'я користувача бази даних',
+        'db_password' => 'Пароль бази даних',
+        'db_prefix' => 'Префікс бази даних',
+        'db_prefix_hint' =>
+            "Залишайте префікс імен таблиць Castopod, якщо ви не знаєте що це значить.",
+        'cache_config' => 'Конфігурація кешу',
+        'cache_config_hint' =>
+            'Виберіть бажаний обробник кешу або залиште без змін, як стандартне значення, якщо ви не знаєте, що це означає.',
+        'cache_handler' => 'Обробник кешу',
+        'cacheHandlerOptions' => [
+            'file' => 'Файл',
+            'redis' => 'Redis',
+            'predis' => 'Predis',
+        ],
+        'next' => 'Далі',
+        'submit' => 'Завершити установку',
+        'create_superadmin' => 'Створіть свій обліковий запис головного адміністратора',
+        'email' => 'Пошта',
+        'username' => 'Ім\'я користувача',
+        'password' => 'Пароль',
+    ],
+    'messages' => [
+        'createSuperAdminSuccess' =>
+            'Ваш обліковий запис головного адміністратора було успішно створено. Увійдіть, щоб почати подкасти!',
+        'databaseConnectError' =>
+            'Castopod не зміг під\'єднатися до вашої бази даних. Перевірте конфігурацію бази даних і повторіть спробу.',
+        'writeError' =>
+            "Не вдалося створити/записати файл `.env`. Ви повинні створити його вручну, перейшовши шаблон файлу `.env.example` в пакеті Castopode.",
+    ],
+];
diff --git a/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php
index c7a5e116e6..178640eddd 100644
--- a/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php
+++ b/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php
@@ -10,8 +10,8 @@ declare(strict_types=1);
 
 return [
     'podcast_is_premium' => 'Podcast enthält Premium-Episoden',
-    'episode_is_premium' => 'Diese Episode ist Premium, nur verfügbar für Premium-Abonnenten',
-    'unlock_episode' => 'Diese Episode ist nur für Premium-Abonnenten. Klicken Sie hier zum entsperren!',
+    'episode_is_premium' => 'Diese Episode ist nur verfügbar für Premium-Abonnenten',
+    'unlock_episode' => 'Diese Episode ist nur für Premium-Abonnenten. Klicke, um sie freizuschalten!',
     'banner_unlock' => 'Dieser Podcast enthält Premium-Episoden, nur verfügbar für Premium-Abonnenten.',
     'banner_lock' => 'Der Podcast ist freigeschaltet, viel Spaß mit den Premium-Episoden!',
     'subscribe' => 'Abonnieren',
diff --git a/modules/PremiumPodcasts/Language/de/Subscription.php b/modules/PremiumPodcasts/Language/de/Subscription.php
index 32043a805e..17e6fe9e8b 100644
--- a/modules/PremiumPodcasts/Language/de/Subscription.php
+++ b/modules/PremiumPodcasts/Language/de/Subscription.php
@@ -38,63 +38,63 @@ return [
         'submit_edit' => 'Abonnement bearbeiten',
     ],
     '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.',
+        'link' => 'Link zur Abonnement-Seite',
+        'link_hint' => 'Dies fügt einen CTA (Call to Action) zur Webseite hinzu, der Hörer dazu einlädt, den Podcast zu abonnieren.',
         'submit' => 'Link speichern',
     ],
     '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.',
+        'disclaimer' => 'Das Pausieren des Abonnements wird dem Abonnenten den Zugang zu den Premium-Inhalten einschränken. Sie können die Pausierung jederzeit wieder aufheben.',
         'reason' => 'Grund',
         'reason_placeholder' => 'Warum unterbrechen Sie Ihr Abonnement?',
         "submit" => 'Abonnement unterbrechen',
     ],
     'delete_form' => [
-        'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.',
+        'disclaimer' => 'Durch das Löschen des Abonnements von {subscriber} werden alle damit verbundenen Analysedaten entfernt.',
         'understand' => 'Ich verstehe, entferne das Abonnement dauerhaft',
         'submit' => 'Abonnement entfernen',
     ],
     '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}.',
+        'addSuccess' => 'Neues Abonnement hinzugefügt! Eine Willkommens-E-Mail wurde an {subscriber} gesendet.',
+        'addError' => 'Abonnement konnte nicht hinzugefügt werden.',
+        'editSuccess' => 'Das Ablaufdatum des Abonnements wurde aktualisiert! Es wurde eine E-Mail an {subscriber} gesendet.',
         'editError' => 'Abonnement konnte nicht bearbeitet werden.',
-        'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.',
+        'regenerateTokenSuccess' => 'Der Schlüssel wurde neu generiert! Eine E-Mail mit dem neuen Schlüssel wurde an {subscriber} gesendet.',
         'regenerateTokenError' => 'Schlüssel konnte nicht neu generiert werden.',
-        '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!',
+        'deleteSuccess' => 'Das Abonnement wurde entfernt! Es wurde eine E-Mail an {subscriber} gesendet.',
+        'deleteError' => 'Abonnement konnte nicht entfernt werden.',
+        'suspendSuccess' => 'Das Abonnement wurde pausiert! Es wurde eine E-Mail an {subscriber} gesendet.',
+        'suspendError' => 'Abonnement konnte nicht pausiert werden.',
+        'resumeSuccess' => 'Das Abonnement wurde fortgesetzt! Es wurde eine E-Mail an {subscriber} gesendet.',
+        'resumeError' => 'Abonnement konnte nicht fortgesetzt werden.',
+        'linkSaveSuccess' => 'Der Abonnement-Link wurde erfolgreich gespeichert! Dieser wird als CTA (Call to Action) auf der Webseite erscheinen!',
+        'linkRemoveSuccess' => 'Der Abonnement-Link wurde erfolgreich entfernt!',
     ],
     'emails' => [
         'greeting' => 'Hey,',
         'token' => 'Ihr Token: {0}',
         'unique_feed_link' => 'Ihr eindeutiger Feed-Link: {0}',
         'how_to_use' => 'Wie nutzt man es?',
-        '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.',
+        'two_ways' => 'Sie haben zwei Möglichkeiten, die Premium-Episoden freizuschalten:',
+        'import_into_app' => 'Kopieren Sie Ihre einmalige Feed-URL in Ihre Lieblings-Podcast-App (importieren sie diesen als privaten Feed, um Ihre Anmeldedaten geheim zu halten).',
+        'go_to_website' => 'Gehen Sie zu der Webseite von {podcastWebsite} und entsperren Sie den Podcast mit Ihrem Schlüssel.',
         'welcome_subject' => 'Willkommen bei {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:',
+        'welcome' => 'Sie haben {podcastTitle} abonniert, vielen Dank und herzlich willkommen!',
+        'welcome_token_title' => 'Hier sind Ihre Anmeldedaten, um die Premium-Episoden des Podcasts freizuschalten:',
+        'welcome_expires' => 'Ihr Abonnement läuft am {0} ab.',
+        'welcome_never_expires' => 'Ihr Abonnement läuft nicht ab.',
+        'reset_subject' => 'Ihr Schlüssel wurde zurückgesetzt!',
+        'reset_token' => 'Ihr Zugriff auf {podcastTitle} wurde zurückgesetzt!',
+        'reset_token_title' => 'Es wurden neue Anmeldedaten generiert, um die Premium-Episoden des Podcasts freizuschalten:',
         'edited_subject' => 'Ihr Abonnement wurde aktualisiert!',
-        'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.',
-        'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!',
+        'edited_expires' => 'Ihr Abonnement für {podcastTitle} läuft am {expiresAt} ab.',
+        'edited_never_expires' => 'Ihr Abonnement für {podcastTitle} läuft nie ab!',
         'suspended_subject' => 'Ihr Abonnement wurde pausiert!',
-        'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.',
+        'suspended' => 'Ihr Abonnement für {podcastTitle} wurde pausiert! Sie können nun nicht mehr auf die Premium-Episoden des Podcasts zugreifen.',
         'suspended_reason' => 'Das ist aus dem folgenden Grund: {0}',
         'resumed_subject' => 'Ihr Abonnement wurde wieder aufgenommen!',
-        'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.',
+        'resumed' => 'Ihr Abonnement für {podcastTitle} wurde fortgesetzt! Sie können nun wieder auf die Premium-Episoden des Podcasts zugreifen.',
         'deleted_subject' => 'Ihr Abonnement wurde entfernt!',
-        'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.',
+        'deleted' => 'Ihr Abonnement für {podcastTitle} wurde entfernt! Sie können nun nicht mehr auf die Premium-Episoden des Podcasts zugreifen.',
         'footer' => '{castopod} betrieben auf {host}',
     ],
 ];
diff --git a/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php
index 18c0dd4e4e..007b90bdb8 100644
--- a/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php
+++ b/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php
@@ -9,26 +9,26 @@ declare(strict_types=1);
  */
 
 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',
+    'podcast_is_premium' => 'Le Podcast contient des épisodes premium',
+    'episode_is_premium' => 'Cet épisode est premium, uniquement disponible pour les abonnés premium',
+    'unlock_episode' => 'Cet épisode est réservé aux abonnés premium. Cliquez pour le débloquer !',
+    'banner_unlock' => 'Ce podcast contient des épisodes premium, uniquement disponibles pour les abonnés premium.',
+    'banner_lock' => 'Podcast débloqué avec succès ! Profitez des épisodes premium !',
+    'subscribe' => 'S\'abonner',
+    'lock' => 'Verrouiller',
+    'unlock' => 'Déverrouiller',
     '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!',
+        'title' => 'Contenu Premium',
+        'subtitle' => 'Ce podcast contient des épisodes premium verrouillés ! Avez-vous la clé pour les déverrouiller ?',
+        'token' => 'Entrez votre clé',
+        'token_hint' => 'Si vous êtes abonné à {podcastTitle}, vous pouvez copier la clé qui vous a été envoyée par e-mail et la coller ici.',
+        'submit' => 'Débloquer tous les épisodes!',
+        'call_to_action' => 'Débloquer tous les épisodes de {podcastTitle}:',
+        'subscribe_cta' => 'Je m’inscris maintenant !',
     ],
     'messages' => [
-        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
-        'unlockBadAttempt' => 'Your key does not seem to be working…',
-        'lockSuccess' => 'Podcast was successfully locked!',
+        'unlockSuccess' => 'Podcast débloqué avec succès ! Profitez des épisodes premium !',
+        'unlockBadAttempt' => 'Votre clé ne semble pas fonctionner…',
+        'lockSuccess' => 'Le podcast a été verouillé avec succès !',
     ],
 ];
diff --git a/modules/PremiumPodcasts/Language/fr/Subscription.php b/modules/PremiumPodcasts/Language/fr/Subscription.php
index f8af256f70..c20be9d2cc 100644
--- a/modules/PremiumPodcasts/Language/fr/Subscription.php
+++ b/modules/PremiumPodcasts/Language/fr/Subscription.php
@@ -9,92 +9,92 @@ declare(strict_types=1);
  */
 
 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',
+    'podcast_subscriptions' => 'Abonnements au podcast',
+    'add' => 'Nouvel abonnement',
+    'view' => 'Afficher l\'abonnement',
+    'edit' => 'Modifier l\'inscription',
+    'regenerate_token' => 'Regenerer le token',
+    'suspend' => 'Suspendre l\'abonnement',
+    'resume' => 'Reprendre l\'abonnement',
+    'delete' => 'Supprimer l\'abonnement',
     'status' => [
-        'active' => 'Active',
-        'suspended' => 'Suspended',
-        'expired' => 'Expired',
+        'active' => 'Actif',
+        'suspended' => 'Suspendu',
+        'expired' => 'Expiré',
     ],
     'list' => [
-        'number' => 'Number',
-        'email' => 'Email',
-        'expiration_date' => 'Expiration date',
-        'unlimited' => 'Unlimited',
-        'downloads' => 'Downloads',
-        'status' => 'Status',
+        'number' => 'Numéro',
+        'email' => 'Adresse e-mail',
+        'expiration_date' => 'Date d\'expiration',
+        'unlimited' => 'Illimité',
+        'downloads' => 'Téléchargements',
+        'status' => 'Statut',
     ],
     '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',
+        'email' => 'Adresse e-mail',
+        'expiration_date' => 'Date d\'expiration',
+        'expiration_date_hint' => 'La date et l\'heure à laquelle l\'abonnement expire. Laissez vide pour un abonnement illimité.',
+        'submit_add' => 'Ajouter un abonnement',
+        'submit_edit' => 'Modifier l\'inscription',
     ],
     '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',
+        'link' => 'Lien vers la page d\'abonnement',
+        'link_hint' => 'Cela va ajouter un appel à l\'action dans le site Web invitant les auditeurs à s\'abonner au podcast.',
+        'submit' => 'Enregistrer le lien',
     ],
     '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',
+        'disclaimer' => 'Suspendre l\'abonnement empêchera l\'abonné d\'avoir accès au contenu premium. Vous pourrez toujours lever la suspension par la suite.',
+        'reason' => 'Raison',
+        'reason_placeholder' => 'Pour quelle raison arrêtez vous votre abonnement ?',
+        "submit" => 'Suspendre l\'abonnement',
     ],
     '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',
+        'disclaimer' => 'La suppression de l\'abonnement de {subscriber} supprimera toutes les données d\'analyse qui lui sont associées.',
+        'understand' => 'Je comprends, supprimez l\'abonnement définitivement',
+        'submit' => 'Supprimer l\'abonnement',
     ],
     '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!',
+        'addSuccess' => 'Un nouvel abonnement a été ajouté ! Un e-mail de bienvenue a été envoyé à {subscriber}.',
+        'addError' => 'L\'abonnement n\'a pu être ajouté.',
+        'editSuccess' => 'La date d\'expiration de l\'abonnement a été mise à jour ! Un e-mail a été envoyé à {subscriber}.',
+        'editError' => 'L\'abonnement n\'a pas pu être modifié.',
+        'regenerateTokenSuccess' => 'Jeton régénéré ! Un email a été envoyé à {subscriber} avec le nouveau jeton.',
+        'regenerateTokenError' => 'Le jeton n\'a pas pu être régénéré.',
+        'deleteSuccess' => 'L\'abonnement a été suspendu! Un e-mail a été envoyé à {subscriber}.',
+        'deleteError' => 'L\'abonnement n\'a pas pu être supprimé.',
+        'suspendSuccess' => 'L\'abonnement a été suspendu! Un e-mail a été envoyé à {subscriber}.',
+        'suspendError' => 'L\'abonnement ne peut pas être suspendu.',
+        'resumeSuccess' => 'L\'abonnement a été suspendu! Un e-mail a été envoyé à {subscriber}.',
+        'resumeError' => 'L\'abonnement n\'a pas pu être repris.',
+        'linkSaveSuccess' => 'Le lien de l\'abonnement a été enregistré avec succès ! Il apparaîtra sur le site comme un Appel à l\'action !',
+        'linkRemoveSuccess' => 'Le lien de l\'abonnement a été supprimé avec succès !',
     ],
     '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}',
+        'greeting' => 'Hé,',
+        'token' => 'Votre jeton : {0}',
+        'unique_feed_link' => 'Votre lien de flux unique : {0}',
+        'how_to_use' => 'Comment l\'utiliser ?',
+        'two_ways' => 'Vous avez deux façons de débloquer les épisodes premium :',
+        'import_into_app' => 'Copiez votre URL de flux unique dans votre application de baladodiffusion préférée (importez-la en tant que flux privé pour éviter de dévoiler vos identifiants).',
+        'go_to_website' => 'Rendez-vous sur le site web de {podcastWebsite} et débloquez le podcast avec votre jeton.',
+        'welcome_subject' => 'Bienvenue sur {podcastTitle}',
+        'welcome' => 'Vous vous êtes abonné à {podcastTitle}, merci et bienvenue à bord !',
+        'welcome_token_title' => 'Voici vos identifiants pour débloquer les épisodes premium du podcast:',
+        'welcome_expires' => 'Votre abonnement a été configuré pour expirer le {0}.',
+        'welcome_never_expires' => 'Votre abonnement a été configuré pour ne jamais expirer.',
+        'reset_subject' => 'Votre jeton a été réinitialisé !',
+        'reset_token' => 'Votre accès à {podcastTitle} a été réinitialisé !',
+        'reset_token_title' => 'De nouveaux identifiants ont été générés pour vous permettre de déverrouiller les épisodes premium du podcast:',
+        'edited_subject' => 'Votre abonnement a été mis à jour !',
+        'edited_expires' => 'Votre abonnement pour {podcastTitle} a été configuré pour expirer le {expiresAt}.',
+        'edited_never_expires' => 'Votre abonnement pour {podcastTitle} a été configuré pour ne jamais expirer !',
+        'suspended_subject' => 'Votre abonnement a été suspendu !',
+        'suspended' => 'Votre abonnement à {podcastTitle} a été suspendu ! Vous ne pouvez plus accéder aux épisodes premium du podcast.',
+        'suspended_reason' => 'Pour la raison suivante : {0}',
+        'resumed_subject' => 'Votre abonnement a été réactivé !',
+        'resumed' => 'Votre abonnement à {podcastTitle} a été réactivé ! Vous pouvez à nouveau accéder aux épisodes premium du podcast.',
+        'deleted_subject' => 'Votre abonnement a été supprimé !',
+        'deleted' => 'Votre abonnement pour {podcastTitle} a été supprimé ! Vous n\'avez plus accès aux épisodes premium du podcast.',
+        'footer' => '{castopod} hébergé sur {host}',
     ],
 ];
diff --git a/modules/PremiumPodcasts/Language/fr_CA/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fr_CA/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/fr_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/fr_CA/Subscription.php b/modules/PremiumPodcasts/Language/fr_CA/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/fr_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/fr_trad/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fr_trad/PremiumPodcasts.php
new file mode 100644
index 0000000000..18c0dd4e4e
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/fr_trad/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_trad/Subscription.php b/modules/PremiumPodcasts/Language/fr_trad/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/fr_trad/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
index 18c0dd4e4e..8c05e6236d 100644
--- a/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php
+++ b/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php
@@ -9,26 +9,26 @@ declare(strict_types=1);
  */
 
 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',
+    'podcast_is_premium' => 'Podcast bevat premium afleveringen',
+    'episode_is_premium' => 'Aflevering is premium, alleen beschikbaar voor premium abonnees',
+    'unlock_episode' => 'Deze aflevering is alleen voor premium abonnees. Klik om te ontgrendelen!',
+    'banner_unlock' => 'Deze podcast bevat premium afleveringen, alleen beschikbaar voor premium abonnees.',
+    'banner_lock' => 'Podcast is ontgrendeld, geniet van de premium afleveringen!',
+    'subscribe' => 'Abonneren',
+    'lock' => 'Vergrendel',
+    'unlock' => 'Ontgrendel',
     '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!',
+        'title' => 'Premium inhoud',
+        'subtitle' => 'Deze podcast bevat vergrendelde premium afleveringen! Heb je de sleutel om ze te ontgrendelen?',
+        'token' => 'Voer jouw sleutel in',
+        'token_hint' => 'Als je geabonneerd bent op {podcastTitle}, kun je de sleutel die naar je verzonden is via e-mail kopiëren en deze hier plakken.',
+        'submit' => 'Ontgrendel alle afleveringen!',
+        'call_to_action' => 'Ontgrendel alle afleveringen van {podcastTitle}:',
+        'subscribe_cta' => 'Nu abonneren!',
     ],
     'messages' => [
-        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
-        'unlockBadAttempt' => 'Your key does not seem to be working…',
-        'lockSuccess' => 'Podcast was successfully locked!',
+        'unlockSuccess' => 'Podcast is succesvol ontgrendeld! Geniet van de premium afleveringen!',
+        'unlockBadAttempt' => 'Jouw sleutel lijkt niet te werken…',
+        'lockSuccess' => 'Podcast is succesvol vergrendeld!',
     ],
 ];
diff --git a/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php
index 18c0dd4e4e..356bda0753 100644
--- a/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php
+++ b/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php
@@ -9,26 +9,26 @@ declare(strict_types=1);
  */
 
 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',
+    'podcast_is_premium' => 'Podcast zawiera odcinki premium',
+    'episode_is_premium' => 'Odcinek jest dostępny tylko dla subskrybentów premium',
+    'unlock_episode' => 'Ten odcinek jest tylko dla subskrybentów premium. Kliknij, aby go odblokować!',
+    'banner_unlock' => 'Ten podcast zawiera odcinki premium, dostępne tylko dla subskrybentów premium.',
+    'banner_lock' => 'Podcast został odblokowany, ciesz się odcinkami premium!',
+    'subscribe' => 'Subskrybuj',
+    'lock' => 'Zablokuj',
+    'unlock' => 'Odblokuj',
     '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!',
+        'title' => 'Zawartość premium',
+        'subtitle' => 'Ten podcast zawiera zablokowane odcinki premium! Czy masz klucz do ich odblokowania?',
+        'token' => 'Wprowadź swój klucz',
+        'token_hint' => 'Jeśli subskrybujesz {podcastTitle} możesz skopiować klucz wysłany do Ciebie pocztą elektroniczną i wkleić go tutaj.',
+        'submit' => 'Odblokuj wszystkie odcinki!',
+        'call_to_action' => 'Odblokuj wszystkie odcinki {podcastTitle}:',
+        'subscribe_cta' => 'Subskrybuj teraz!',
     ],
     'messages' => [
-        'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!',
-        'unlockBadAttempt' => 'Your key does not seem to be working…',
-        'lockSuccess' => 'Podcast was successfully locked!',
+        'unlockSuccess' => 'Podcast został pomyślnie odblokowany! Ciesz się odcinkami premium!',
+        'unlockBadAttempt' => 'Twój klucz nie działa…',
+        'lockSuccess' => 'Podcast został pomyślnie zablokowany!',
     ],
 ];
diff --git a/modules/PremiumPodcasts/Language/pl/Subscription.php b/modules/PremiumPodcasts/Language/pl/Subscription.php
index f8af256f70..0d90840d4b 100644
--- a/modules/PremiumPodcasts/Language/pl/Subscription.php
+++ b/modules/PremiumPodcasts/Language/pl/Subscription.php
@@ -9,92 +9,92 @@ declare(strict_types=1);
  */
 
 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',
+    'podcast_subscriptions' => 'Subskrypcje podcastu',
+    'add' => 'Nowa subskrypcja',
+    'view' => 'Wyświetl subskrypcję',
+    'edit' => 'Edytuj subskrypcję',
+    'regenerate_token' => 'Wygeneruj nowy token',
+    'suspend' => 'Wstrzymaj subskrypcję',
+    'resume' => 'Wznów subskrypcję',
+    'delete' => 'Usuń subskrypcję',
     'status' => [
-        'active' => 'Active',
-        'suspended' => 'Suspended',
-        'expired' => 'Expired',
+        'active' => 'Aktywne',
+        'suspended' => 'Zawieszony',
+        'expired' => 'Wygasły',
     ],
     'list' => [
-        'number' => 'Number',
+        'number' => 'Numer',
         'email' => 'Email',
-        'expiration_date' => 'Expiration date',
-        'unlimited' => 'Unlimited',
-        'downloads' => 'Downloads',
+        'expiration_date' => 'Data ważności',
+        'unlimited' => 'Nielimitowany',
+        'downloads' => 'Pobrane',
         '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',
+        'expiration_date' => 'Data ważności',
+        'expiration_date_hint' => 'Data i godzina wygaśnięcia subskrypcji. Pozostaw puste dla nieograniczonej subskrypcji.',
+        'submit_add' => 'Dodaj subskrypcję',
+        'submit_edit' => 'Edytuj subskrypcję',
     ],
     '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',
+        'link' => 'Link do strony subskrypcji',
+        'link_hint' => 'Spowoduje to dodanie przycisku w witrynie zapraszając słuchaczy do subskrypcji podcastu.',
+        'submit' => 'Zapisz 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',
+        'disclaimer' => 'Zawieszenie subskrypcji ograniczy abonentowi dostęp do treści premium. Wciąż będziesz mógł później usunąć zawieszenie.',
+        'reason' => 'Powód',
+        'reason_placeholder' => 'Dlaczego zawieszasz subskrypcję?',
+        "submit" => 'Wstrzymaj subskrypcję',
     ],
     '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',
+        'disclaimer' => 'Usunięcie subskrypcji {subscriber} spowoduje usunięcie wszystkich danych analitycznych z nią związanych.',
+        'understand' => 'Rozumiem, usuń subskrypcję na stałe',
+        'submit' => 'Usuń subskrypcję',
     ],
     '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!',
+        'addSuccess' => 'Dodano nową subskrypcję! Wiadomość powitalna została wysłana na adres {subscriber}.',
+        'addError' => 'Subskrypcja nie może zostać dodana.',
+        'editSuccess' => 'Data wygaśnięcia subskrypcji została zaktualizowana! Wiadomość e-mail została wysłana do {subscriber}.',
+        'editError' => 'Subskrypcja nie może być edytowana.',
+        'regenerateTokenSuccess' => 'Token został odnowiony! Wiadomość e-mail została wysłana do {subscriber} z nowym tokenem.',
+        'regenerateTokenError' => 'Token nie mógł zostać odnowiony.',
+        'deleteSuccess' => 'Subskrypcja została usunięta! Wiadomość e-mail została wysłana do {subscriber}.',
+        'deleteError' => 'Twoja subskrypcja nie mogła zostać anulowana.',
+        'suspendSuccess' => 'Subskrypcja została zawieszona! Wiadomość e-mail została wysłana do {subscriber}.',
+        'suspendError' => 'Twoja subskrypcja nie mogła zostać anulowana.',
+        'resumeSuccess' => 'Subskrypcja została usunięta! Wiadomość e-mail została wysłana do {subscriber}.',
+        'resumeError' => 'Subskrypcja nie może być wznowiona.',
+        'linkSaveSuccess' => 'Link do subskrypcji został pomyślnie zapisany! Pojawi się na stronie internetowej jako wywołanie Akcji!',
+        'linkRemoveSuccess' => 'Link do subskrypcji został pomyślnie usunięty!',
     ],
     '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}',
+        'greeting' => 'Cześć,',
+        'token' => 'Twój token: {0}',
+        'unique_feed_link' => 'Twój unikalny link do kanału: {0}',
+        'how_to_use' => 'Jak używać?',
+        'two_ways' => 'Masz dwa sposoby odblokowania odcinków premium:',
+        'import_into_app' => 'Skopiuj swój unikalny adres Url kanału w swojej ulubionej aplikacji podcastowej (zaimportuj go jako prywatny kanał, aby zapobiec ujawnianiu Twoich poświadczeń).',
+        'go_to_website' => 'Przejdź do strony {podcastWebsite} i odblokuj podcast za pomocą swojego tokenu.',
+        'welcome_subject' => 'Witaj w {podcastTitle}',
+        'welcome' => 'Zasubskrybowałeś {podcastTitle}, dziękuję i witam serdecznie!',
+        'welcome_token_title' => 'Oto twoje dane, aby odblokować odcinki premium podcastu:',
+        'welcome_expires' => 'Twoja subskrypcja wygaśnie w dniu {0}.',
+        'welcome_never_expires' => 'Twoja subskrypcja nigdy nie wygasa.',
+        'reset_subject' => 'Twój token został zresetowany!',
+        'reset_token' => 'Twój dostęp do {podcastTitle} został zresetowany!',
+        'reset_token_title' => 'Nowe dane logowania zostały wygenerowane, aby odblokować odcinki premium podcastu:',
+        'edited_subject' => 'Subskrypcja została aktywowana!',
+        'edited_expires' => 'Twoja subskrypcja dla {podcastTitle} wygasa w dniu {expiresAt}.',
+        'edited_never_expires' => 'Twoja subskrypcja dla {podcastTitle} nigdy nie wygasa!',
+        'suspended_subject' => 'Twoja subskrypcja została zawieszona!',
+        'suspended' => 'Twoja subskrypcja dla {podcastTitle} została zawieszona! Nie możesz już uzyskać dostępu do odcinków premium podcastu.',
+        'suspended_reason' => 'Z następującego powodu: {0}',
+        'resumed_subject' => 'Twoja subskrypcja została przywrócona!',
+        'resumed' => 'Twoja subskrypcja dla {podcastTitle} została wznowiona! Masz ponownie dostęp do odcinków premium podcastu.',
+        'deleted_subject' => 'Subskrypcja została usunięta!',
+        'deleted' => 'Twoja subskrypcja dla {podcastTitle} została usunięta! Nie masz już dostępu do odcinków premium podcastu.',
+        'footer' => '{castopod} hostowany na {host}',
     ],
 ];
diff --git a/modules/PremiumPodcasts/Language/uk/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/uk/PremiumPodcasts.php
new file mode 100644
index 0000000000..bd87ddae47
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/uk/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/uk/Subscription.php b/modules/PremiumPodcasts/Language/uk/Subscription.php
new file mode 100644
index 0000000000..f8af256f70
--- /dev/null
+++ b/modules/PremiumPodcasts/Language/uk/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}',
+    ],
+];
-- 
GitLab