diff --git a/app/Language/br/Comment.php b/app/Language/br/Comment.php
index e46befd1e8e7f1058d81ceed0b4113daf5f9a9ec..5ce07ee54648a78e7b3f9d2ecb3fea2ae30a9223 100644
--- a/app/Language/br/Comment.php
+++ b/app/Language/br/Comment.php
@@ -35,7 +35,7 @@ return [
     }',
     'like' => 'Muiañ-karet',
     'reply' => 'Respont',
-    'view_replies' => 'Gwelout an evezhiadennoù ({numberOfReplies})',
+    'view_replies' => 'Gwelet an evezhiadennoù ({numberOfReplies})',
     'block_actor' => 'Stankañ an implijer·ez @{actorUsername}',
     'block_domain' => 'Stankañ @{actorDomain}',
     'delete' => 'Dilemel an evezhiadenn',
diff --git a/app/Language/br/Common.php b/app/Language/br/Common.php
index 2d2e86920b39b7b541259faf3e293a9bc0e3812d..99d3b59721c89d443ebef85c575ed50597393936 100644
--- a/app/Language/br/Common.php
+++ b/app/Language/br/Common.php
@@ -15,7 +15,7 @@ return [
     'optional' => 'Diret',
     'close' => 'Serriñ',
     'home' => 'Degemer',
-    'explicit' => 'Endalc\'had evit an oadourien',
+    'explicit' => 'Danvez evit an oadourien',
     'powered_by' => 'Lusket gant {castopod}',
     'go_back' => 'Mont war-gil',
     'play_episode_button' => [
@@ -24,7 +24,7 @@ return [
     ],
     'read_more' => 'Lenn muioc\'h',
     'read_less' => 'Lenn nebeutoc\'h',
-    'see_more' => 'Gwelout muioc\'h',
-    'see_less' => 'Gwelout nebeutoc\'h',
-    'legal_notice' => 'Legal notice',
+    'see_more' => 'Gwelet muioc\'h',
+    'see_less' => 'Gwelet nebeutoc\'h',
+    'legal_notice' => 'Evezhiadennoù a-fet lezenn',
 ];
diff --git a/app/Language/br/Podcast.php b/app/Language/br/Podcast.php
index 4c669ee967f7d05ab9bc6974af88f4eddb85ad7c..d2b0533a10c0be45cc19a043310e222c702a88d3 100644
--- a/app/Language/br/Podcast.php
+++ b/app/Language/br/Podcast.php
@@ -114,7 +114,7 @@ return [
         'first_published_at' => 'Embannet eo bet ar rann gentañ d\'ar/d\'an {0, date, medium}',
     ],
     'sponsor' => 'Harpit',
-    'funding_links' => 'Liammoù evit arc\'hantaouiñ {podcastTitle}',
+    'funding_links' => 'Ereoù evit arc\'hantaouiñ {podcastTitle}',
     'find_on' => 'Kavit {podcastTitle} war',
     'listen_on' => 'Selaouit war',
     'persons' => '{personsCount, plural,
diff --git a/app/Language/es/Common.php b/app/Language/es/Common.php
index e15951d762ddbb028023212d25f9946548db6a8a..937fa24df8414d39ac3299dd0499ae05bb5af49e 100644
--- a/app/Language/es/Common.php
+++ b/app/Language/es/Common.php
@@ -26,5 +26,5 @@ return [
     'read_less' => 'Leer menos',
     'see_more' => 'Ver más',
     'see_less' => 'Ver menos',
-    'legal_notice' => 'Legal notice',
+    'legal_notice' => 'Aviso legal',
 ];
diff --git a/app/Language/gl/Comment.php b/app/Language/gl/Comment.php
new file mode 100644
index 0000000000000000000000000000000000000000..8da20a1239cf5d2fedf4c2cd2627d5ef91752f93
--- /dev/null
+++ b/app/Language/gl/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' => "Comentario de {actorDisplayName} en {episodeTitle}",
+    'back_to_comments' => 'Volver a comentarios',
+    'form' => [
+        'episode_message_placeholder' => 'Escribir un comentario…',
+        'reply_to_placeholder' => 'Responder a @{actorUsername}',
+        'submit' => 'Enviar',
+        'submit_reply' => 'Responder',
+    ],
+    'likes' => '{numberOfLikes, plural,
+        one {# like}
+        other {# likes}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# resposta}
+        other {# respostas}
+    }',
+    'like' => 'Agrádame',
+    'reply' => 'Responder',
+    'view_replies' => 'Ver respostas ({numberOfReplies})',
+    'block_actor' => 'Bloquear usuaria @{actorUsername}',
+    'block_domain' => 'Bloquear dominio @{actorDomain}',
+    'delete' => 'Eliminar comentario',
+];
diff --git a/app/Language/gl/Common.php b/app/Language/gl/Common.php
new file mode 100644
index 0000000000000000000000000000000000000000..59a4cc5ad4b04899eca719b2d9d2f6297da0d782
--- /dev/null
+++ b/app/Language/gl/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' => 'Si',
+    'no' => 'Non',
+    'cancel' => 'Cancelar',
+    'optional' => 'Optativo',
+    'close' => 'Pechar',
+    'home' => 'Inicio',
+    'explicit' => 'Explícito',
+    'powered_by' => 'Grazas a {castopod}',
+    'go_back' => 'Volver',
+    'play_episode_button' => [
+        'play' => 'Reproducir',
+        'playing' => 'Reproducindo',
+    ],
+    'read_more' => 'Ler máis',
+    'read_less' => 'Ler menos',
+    'see_more' => 'Ver máis',
+    'see_less' => 'Ver menos',
+    'legal_notice' => 'Aviso legal',
+];
diff --git a/app/Language/gl/Episode.php b/app/Language/gl/Episode.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d228bd9e93bcba08548bddcd97a9bb8a57293e6
--- /dev/null
+++ b/app/Language/gl/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' => 'Tempada {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Episodio {episodeNumber}',
+    'number_abbr' => 'Ep. {episodeNumber}',
+    'season_episode' => 'Tempada {seasonNumber} episodio {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
+    'persons' => '{personsCount, plural,
+        one {# persoa}
+        other {# persoas}
+    }',
+    'persons_list' => 'Persoas',
+    'back_to_episodes' => 'Volver aos episodios de {podcast}',
+    'comments' => 'Comentarios',
+    'activity' => 'Actividade',
+    'description' => 'Descrición do episodio',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# comentario}
+        other {# comentarios}
+    }',
+    'all_podcast_episodes' => 'Tódolos episodios do podcast',
+    'back_to_podcast' => 'Volver ao podcast',
+];
diff --git a/app/Language/gl/Fediverse.php b/app/Language/gl/Fediverse.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8eb9824d3901f39a495340369a4a9c993ca8cd8
--- /dev/null
+++ b/app/Language/gl/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' => 'O teu alcume',
+    'your_handle_hint' => 'Escribe o @usuaria@dominio desde onde queres actuar.',
+    'follow' => [
+        'label' => 'Seguir',
+        'title' => 'Seguir a {actorDisplayName}',
+        'subtitle' => 'Vas seguir a:',
+        'accountNotFound' => 'Non se atopou a conta.',
+        'remoteFollowNotAllowed' => 'Semella que o servidor da conta non permite o seguimento remoto…',
+        'submit' => 'Realizar seguimento',
+    ],
+    'favourite' => [
+        'title' => "Dar a favorito na publicación de {actorDisplayName}",
+        'subtitle' => 'Vas mostrar agrado por:',
+        'submit' => 'Darlle a favorito',
+    ],
+    'reblog' => [
+        'title' => "Compartir a publicación de {actorDisplayName}",
+        'subtitle' => 'Vas compartir:',
+        'submit' => 'Fai a compartición',
+    ],
+    'reply' => [
+        'title' => "Responder á publicación de {actorDisplayName}",
+        'subtitle' => 'Vas responder a:',
+        'submit' => 'Responde',
+    ],
+];
diff --git a/app/Language/gl/Home.php b/app/Language/gl/Home.php
new file mode 100644
index 0000000000000000000000000000000000000000..433b7b759e05ef616cdc90e5c55b4334fd8c2047
--- /dev/null
+++ b/app/Language/gl/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' => 'Tódolos podcast',
+    'sort_by' => 'Orde por',
+    'sort_options' => [
+        'activity' => 'Actividade recente',
+        'created_desc' => 'Primeiro o máis recente',
+        'created_asc' => 'Máis antigos primeiro',
+    ],
+    'no_podcast' => 'Non se atopan podcast',
+];
diff --git a/app/Language/gl/Page.php b/app/Language/gl/Page.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d061373cb07d8e1cef3b2899b16e4ef99325810
--- /dev/null
+++ b/app/Language/gl/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' => 'Volver ao inicio',
+    'map' => [
+        'title' => 'Mapa',
+        'description' => 'Descobre episodios de podcast en {siteName} situados nun mapa! Viaxa a través do mapa e escoita episodios que falan de lugares concretos.',
+    ],
+];
diff --git a/app/Language/gl/Podcast.php b/app/Language/gl/Podcast.php
new file mode 100644
index 0000000000000000000000000000000000000000..f26babe30e0618c99d5ad6ef130015d8a04b7b28
--- /dev/null
+++ b/app/Language/gl/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' => 'Fonte RSS do Podcast',
+    'season' => 'Tempada {seasonNumber}',
+    'list_of_episodes_year' => 'Episodios en {year} ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Episodios da tempada {seasonNumber} ({episodeCount})',
+    'no_episode' => 'Non se atoparon episodios!',
+    'follow' => 'Seguir',
+    'followTitle' => 'Segue a {actorDisplayName} no fediverso!',
+    'followers' => '{numberOfFollowers, plural,
+        one {# seguidora}
+        other {# seguidoras}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {# publicación}
+        other {# publicacións}
+    }',
+    'activity' => 'Actividade',
+    'episodes' => 'Episodios',
+    'episodes_title' => 'Episodios de {podcastTitle}',
+    'about' => 'Acerca de',
+    'stats' => [
+        'title' => 'Estatísticas',
+        'number_of_seasons' => '{0, plural,
+            one {# tempada}
+            other {# tempadas}
+        }',
+        'number_of_episodes' => '{0, plural,
+            one {# episodio}
+            other {# episodios}
+        }',
+        'first_published_at' => 'Primeiro episodio publicado o {0, date, medium}',
+    ],
+    'sponsor' => 'Apoiar',
+    'funding_links' => 'Ligazóns para apoiar a {podcastTitle}',
+    'find_on' => 'Atopa a {podcastTitle} en',
+    'listen_on' => 'Escoita en',
+    'persons' => '{personsCount, plural,
+        one {# persoa}
+        other {# persoas}
+    }',
+    'persons_list' => 'Persoas',
+];
diff --git a/app/Language/gl/Post.php b/app/Language/gl/Post.php
new file mode 100644
index 0000000000000000000000000000000000000000..5cf07f28de597ad86ea6732c26521dec7a94d231
--- /dev/null
+++ b/app/Language/gl/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' => "Publicación de {actorDisplayName}",
+    'back_to_actor_posts' => 'Volver ás publicacións de {actor}',
+    'actor_shared' => '{actor} compartiu',
+    'reply_to' => 'Responder a @{actorUsername}',
+    'form' => [
+        'message_placeholder' => 'Escribir unha mensaxe…',
+        'episode_message_placeholder' => 'Escribe unha mensaxe para o episodio…',
+        'episode_url_placeholder' => 'URL do episodio',
+        'reply_to_placeholder' => 'Responder a @{actorUsername}',
+        'submit' => 'Enviar',
+        'submit_reply' => 'Responder',
+    ],
+    'favourites' => '{numberOfFavourites, plural,
+        one {# favorito}
+        other {# favoritos}
+    }',
+    'reblogs' => '{numberOfReblogs, plural,
+        one {# compartición}
+        other {# comparticións}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# resposta}
+        other {# respostas}
+    }',
+    'expand' => 'Despregar publicación',
+    'block_actor' => 'Bloquear usuaria @{actorUsername}',
+    'block_domain' => 'Bloquear dominio @{actorDomain}',
+    'delete' => 'Eliminar publicación',
+];
diff --git a/app/Language/ru/Common.php b/app/Language/ru/Common.php
index 1463939f84bc45ea7c1d9a5e61cd9fa26d83d002..bb54fd28262e0f7b921223b350ea248a9a52432c 100644
--- a/app/Language/ru/Common.php
+++ b/app/Language/ru/Common.php
@@ -26,5 +26,5 @@ return [
     'read_less' => 'Скрыть подробности',
     'see_more' => 'Показать больше',
     'see_less' => 'Показать меньше',
-    'legal_notice' => 'Legal notice',
+    'legal_notice' => 'Правовая информация',
 ];
diff --git a/app/Language/sk/Comment.php b/app/Language/sk/Comment.php
index d40c4e5f935b518295187da567fa50cdcffae96a..5fa9788f99f77ad1c4210302632856844a5b47b9 100644
--- a/app/Language/sk/Comment.php
+++ b/app/Language/sk/Comment.php
@@ -9,26 +9,30 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => "{actorDisplayName}'s comment for {episodeTitle}",
+    'title' => "Komentár používateľa {actorDisplayName} pre epizódu {episodeTitle}",
     'back_to_comments' => 'Späť na komentáre',
     'form' => [
         'episode_message_placeholder' => 'Napísať komentár…',
-        'reply_to_placeholder' => 'Reply to @{actorUsername}',
+        'reply_to_placeholder' => 'Odpovedať používateľovi @{actorUsername}',
         'submit' => 'Poslať',
         'submit_reply' => 'Odpovedať',
     ],
     'likes' => '{numberOfLikes, plural,
-        one {# like}
-        other {# likes}
+        one {# si obľúbil}
+        few {# si obľúbili}
+        many {# si obľúbilo}
+        other {# si obľúbili}
     }',
     'replies' => '{numberOfReplies, plural,
-        one {# reply}
-        other {# replies}
+        one {# odpoveď}
+        few {# odpovede}
+        many {# odpovedí}
+        other {# odpovedí}
     }',
     'like' => 'Obľúbené',
     'reply' => 'Odpovedať',
     'view_replies' => 'Ukázať odpoved/e ({numberOfReplies})',
-    'block_actor' => 'Blokovať užívateľa @{actorUsername}',
+    'block_actor' => 'Blokovať používateľa @{actorUsername}',
     'block_domain' => 'Blokovať doménu @{actorDomain}',
     'delete' => 'Vymazať komentár',
 ];
diff --git a/app/Language/sk/Common.php b/app/Language/sk/Common.php
index 993a1ccd84b51d6453ea171543cf3464f755f369..eece433a2afcd2d7cb22225266b1067b44189e3c 100644
--- a/app/Language/sk/Common.php
+++ b/app/Language/sk/Common.php
@@ -26,5 +26,5 @@ return [
     'read_less' => 'Zobraziť menej',
     'see_more' => 'Pozrieť viac',
     'see_less' => 'Pozrieť menej',
-    'legal_notice' => 'Legal notice',
+    'legal_notice' => 'Právne informácie',
 ];
diff --git a/app/Language/sk/Episode.php b/app/Language/sk/Episode.php
index a4b232b22c886039066c79d7a918b06ac76f0b39..d8fe87596935d74ed2f10564703476f7edb95d0d 100644
--- a/app/Language/sk/Episode.php
+++ b/app/Language/sk/Episode.php
@@ -16,17 +16,21 @@ return [
     'season_episode' => 'Sezóna {seasonNumber} epizóda {episodeNumber}',
     'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
     'persons' => '{personsCount, plural,
-        one {# person}
-        other {# persons}
+        one {# osobnosť}
+        few {# osobnosti}
+        many {# osobností}
+        other {# osobností}
     }',
-    'persons_list' => 'Persons',
+    'persons_list' => 'Osobnosti',
     'back_to_episodes' => 'Späť k epizódam {podcast}',
     'comments' => 'Komentáre',
     'activity' => 'Aktivita',
     'description' => 'Popis epizódy',
     'number_of_comments' => '{numberOfComments, plural,
-        one {# comment}
-        other {# comments}
+        one {# komentár}
+        few {# komentáre}
+        many {# komentárov}
+        other {# komentárov}
     }',
     'all_podcast_episodes' => 'Všetky epizódy podcastu',
     'back_to_podcast' => 'Späť na podcast',
diff --git a/app/Language/sk/Fediverse.php b/app/Language/sk/Fediverse.php
index 33d0e923404aa17634a0488d310dcbb7695cbc23..a4851bf1212fafb37d905a954bd61b59be8b42f8 100644
--- a/app/Language/sk/Fediverse.php
+++ b/app/Language/sk/Fediverse.php
@@ -10,13 +10,13 @@ declare(strict_types=1);
 
 return [
     'your_handle' => 'Vaša prezývka',
-    'your_handle_hint' => 'Enter the @username@domain you want to act from.',
+    'your_handle_hint' => 'Vložte identifikátor v tvare @meno@doména, s ktorým si želáte vystupovať.',
     'follow' => [
         'label' => 'Nasledovať',
         'title' => 'Nasledovať {actorDisplayName}',
         'subtitle' => 'Budete nasledovať:',
         'accountNotFound' => 'Účet nemožno nájsť.',
-        'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
+        'remoteFollowNotAllowed' => 'Zdá sa, že server podľa zadaného identifikátora nepodporuje vzdialené sledovanie…',
         'submit' => 'Pokračovať k nasledovaniu',
     ],
     'favourite' => [
diff --git a/app/Language/sk/Page.php b/app/Language/sk/Page.php
index 60ffc771a0aa47cc627fa7098f6673b4f3f62f95..8a350c2b23b25536310d83f21dc60c3fa2b69cee 100644
--- a/app/Language/sk/Page.php
+++ b/app/Language/sk/Page.php
@@ -12,6 +12,6 @@ return [
     'back_to_home' => 'Späť na úvod',
     'map' => [
         'title' => 'Mapa',
-        '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.',
+        'description' => 'Objavujte epizódy podcastov zo stránky {siteName} umiestnené na mape! Cestujte zobrazenými oblasťami a vypočujte si epizódy, ktoré sa o týchto oblastiach zmieňujú.',
     ],
 ];
diff --git a/app/Language/sk/Podcast.php b/app/Language/sk/Podcast.php
index a15fe02c16c256bff0f9bc90f2a8edf99a90042b..bf3b232f7f4aed7ab7793e96162b70b3b4d12f8a 100644
--- a/app/Language/sk/Podcast.php
+++ b/app/Language/sk/Podcast.php
@@ -18,12 +18,16 @@ return [
     'follow' => 'Nasledovať',
     'followTitle' => 'Nasledovať {actorDisplayName} na fediverse!',
     'followers' => '{numberOfFollowers, plural,
-        one {# follower}
-        other {# followers}
+        one {# sledujúci}
+        few {# sledujúci}
+        many {# sledujúcich}
+        other {# sledujúcich}
     }',
     'posts' => '{numberOfPosts, plural,
-        one {# post}
-        other {# posts}
+        one {# príspevok}
+        few {# príspevky}
+        many {# príspevkov}
+        other {# príspevkov}
     }',
     'activity' => 'Aktivita',
     'episodes' => 'Epizódy',
@@ -32,22 +36,28 @@ return [
     'stats' => [
         'title' => 'Å tatistiky',
         'number_of_seasons' => '{0, plural,
-            one {# season}
-            other {# seasons}
+            one {# séria}
+            few {# série}
+            many {# sérií}
+            other {# sérií}
         }',
         'number_of_episodes' => '{0, plural,
-            one {# episode}
-            other {# episodes}
+            one {# epizóda}
+            few {# epizódy}
+            many {# epizód}
+            other {# epizód}
         }',
-        'first_published_at' => 'First episode published on {0, date, medium}',
+        'first_published_at' => 'Prvá epizóda publikovaná {0, date, medium}',
     ],
     'sponsor' => 'Sponzor',
-    'funding_links' => 'Funding links for {podcastTitle}',
-    'find_on' => 'Find {podcastTitle} on',
+    'funding_links' => 'Odkazy na financovanie podcastu {podcastTitle}',
+    'find_on' => 'Nájsť podcast {podcastTitle} na',
     'listen_on' => 'Počúvajte na',
     'persons' => '{personsCount, plural,
-        one {# person}
-        other {# persons}
+        one {# osobnosť}
+        few {# osobnosti}
+        many {# osobností}
+        other {# osobností}
     }',
-    'persons_list' => 'Persons',
+    'persons_list' => 'Osobnosti',
 ];
diff --git a/app/Language/sk/Post.php b/app/Language/sk/Post.php
index 45ec87f6ab27f2c3fca56984637251d54a51fe03..4292024eab37ad945338924764b32cbda7e2885f 100644
--- a/app/Language/sk/Post.php
+++ b/app/Language/sk/Post.php
@@ -9,32 +9,38 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => "{actorDisplayName}'s post",
-    'back_to_actor_posts' => 'Back to {actor} posts',
-    'actor_shared' => '{actor} shared',
-    'reply_to' => 'Reply to @{actorUsername}',
+    'title' => "Príspevok používateľa {actorDisplayName}",
+    'back_to_actor_posts' => 'Späť na príspevky používateľa {actor}',
+    'actor_shared' => '{actor} zdieľal',
+    'reply_to' => 'Odpoveď používateľovi @{actorUsername}',
     'form' => [
-        'message_placeholder' => 'Write a message…',
-        'episode_message_placeholder' => 'Write a message for the episode…',
-        'episode_url_placeholder' => 'Episode URL',
-        'reply_to_placeholder' => 'Reply to @{actorUsername}',
-        'submit' => 'Send',
-        'submit_reply' => 'Reply',
+        'message_placeholder' => 'Napíšte správu…',
+        'episode_message_placeholder' => 'Napíšte správu pre túto epizódu…',
+        'episode_url_placeholder' => 'Adresa URL epizódy',
+        'reply_to_placeholder' => 'Odpoveď používateľovi @{actorUsername}',
+        'submit' => 'Odoslať',
+        'submit_reply' => 'Odpovedať',
     ],
     'favourites' => '{numberOfFavourites, plural,
-        one {# favourite}
-        other {# favourites}
+        one {# si obľúbil}
+        few {# si obľúbili}
+        many {# si obľúbilo}
+        other {# si obľúbilo}
     }',
     'reblogs' => '{numberOfReblogs, plural,
-        one {# share}
-        other {# shares}
+        one {# zdieľanie}
+        few {# zdieľania}
+        many {# zdieľaní}
+        other {# zdieľaní}
     }',
     'replies' => '{numberOfReplies, plural,
-        one {# reply}
-        other {# replies}
+        one {# odpoveď}
+        few {# odpovede}
+        many {# odpovedí}
+        other {# odpovedí}
     }',
-    'expand' => 'Expand post',
-    'block_actor' => 'Block user @{actorUsername}',
-    'block_domain' => 'Block domain @{actorDomain}',
+    'expand' => 'Rozbaliť príspevok',
+    'block_actor' => 'Zablokovať používateľa @{actorUsername}',
+    'block_domain' => 'Zablokovať doménu @{actorDomain}',
     'delete' => 'Vymazať príspevok',
 ];
diff --git a/docs/src/ar/getting-started/docker.md b/docs/src/ar/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/ar/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/ar/getting-started/install.md b/docs/src/ar/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/ar/getting-started/install.md
+++ b/docs/src/ar/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/ar/index.md b/docs/src/ar/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/ar/index.md
+++ b/docs/src/ar/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/br/getting-started/docker.md b/docs/src/br/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/br/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/br/getting-started/install.md b/docs/src/br/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..f0a71a3e033b33d46bed1a2207fb0498c68c25d0 100644
--- a/docs/src/br/getting-started/install.md
+++ b/docs/src/br/getting-started/install.md
@@ -1,18 +1,19 @@
 ---
-title: Installation
+title: Staliañ
 sidebarDepth: 3
 ---
 
-# How to install Castopod?
+# Penaos staliañ 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/br/index.md b/docs/src/br/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/br/index.md
+++ b/docs/src/br/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/de/getting-started/docker.md b/docs/src/de/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/de/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/de/getting-started/install.md b/docs/src/de/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/de/getting-started/install.md
+++ b/docs/src/de/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/de/index.md b/docs/src/de/index.md
index b16a77943e7b6eed5754da0aef499b72659559ff..2d1ef4505709bfa7171a05eacfa218a0905835c7 100644
--- a/docs/src/de/index.md
+++ b/docs/src/de/index.md
@@ -219,7 +219,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/el/getting-started/docker.md b/docs/src/el/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/el/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/el/getting-started/install.md b/docs/src/el/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/el/getting-started/install.md
+++ b/docs/src/el/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/el/index.md b/docs/src/el/index.md
index 55b2ea3a7cea7eccce28e4698ad112285c049bbe..c657df590c2343bd613ff9d66bfb7c16048bafb9 100644
--- a/docs/src/el/index.md
+++ b/docs/src/el/index.md
@@ -217,7 +217,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/es/getting-started/docker.md b/docs/src/es/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..5c245a115e8e290824b9ac0544e018d988923f32
--- /dev/null
+++ b/docs/src/es/getting-started/docker.md
@@ -0,0 +1,144 @@
+---
+title: Imágenes oficiales de Docker
+sidebarDepth: 3
+---
+
+# Imágenes oficiales de Docker
+
+Castopod lanza 2 imágenes Docker al Docker Hub durante su proceso de
+construcción automatizada:
+
+- [**`castopod/aplicación`**](https://hub.docker.com/r/castopod/app): el paquete
+  de aplicación
+- [**`castopod/servidor-web`**](https://hub.docker.com/r/castopod/web-server):
+  una configuración Nginx para Castopod
+
+Adicionalmente, Castopod requiere una base de datos compatible con MySQL. Una
+base de datos Redis puede ser añadida como gestor de caché.
+
+## Etiquetas admitidas
+
+- `desarrollo` [unstable], última rama de desarrollo construida
+
+// más etiquetas por llegar!
+
+## Ejemplo de uso
+
+1.  Instalar [docker](https://docs.docker.com/get-docker/) y
+    [docker-compose](https://docs.docker.com/compose/install/)
+2.  Crear un archivo `docker-compose.yml` con lo siguiente:
+
+    ```yml
+    versión: "3.7"
+
+    servicios:
+      applicación:
+        imagen: castopod/app:develop
+        nombre_contenedor: "castopod-app"
+        volúmenes:
+          - castopod-media:/opt/castopod/public/media
+        ambiente:
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: cámbiame
+          CP_BASEURL: "http://castopod.example.com"
+          CP_ANALYTICS_SALT: cámbiame
+          CP_CACHE_HANDLER: redis
+          CP_REDIS_HOST: redis
+        redes:
+          - castopod-app
+          - castopod-db
+        reiniciar: unless-stopped
+
+      servidor-web:
+        imagen: castopod/web-server:develop
+        nombre_contenedor: "castopod-web-server"
+        volúmenes:
+          - castopod-media:/var/www/html/media
+        redes:
+          - castopod-app
+        puertos:
+          - 8080:80
+        reiniciar: unless-stopped
+
+      mariadb:
+        imagen: mariadb:10.5
+        nombre_contenedor: "castopod-mariadb"
+        redes:
+          - castopod-db
+        volúmenes:
+          - castopod-db:/var/lib/mysql
+        ambiente:
+          MYSQL_ROOT_PASSWORD: cámbiame
+          MYSQL_DATABASE: castopod
+          MYSQL_USER: castopod
+          MYSQL_PASSWORD: cámbiame
+        reiniciar: unless-stopped
+
+      redis:
+        imagen: redis:7.0-alpine
+        nombre_contenedor: "castopod-redis"
+        volúmenes:
+          - castopod-cache:/data
+        redes:
+          - castopod-app
+
+    volúmenes:
+      castopod-media:
+      castopod-db:
+      castopod-cache:
+
+    redes:
+      castopod-app:
+      castopod-db:
+    ```
+
+    Debes adaptar algunas variables a tus necesidades (ej. `CP_BASEURL`,
+    `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
+
+3.  Configura un proxy inverso para TLS (SSL/HTTPS)
+
+    TLS es obligatorio para que ActivityPub funcione. Este trabajo puede ser
+    fácilmente manejado por un proxy inverso, por ejemplo con
+    [Caddy](https://caddyserver.com/):
+
+    ```
+    #castopod
+    castopod.example.com {
+        reverse_proxy localhost:8080
+    }
+    ```
+
+4.  Ejecuta `docker-compose -d`, espera a que se inicie y ve a
+    `https://castopod.example.com/cp-install` para terminar de configurar
+    Castopod!
+
+5.  Todo listo, empieza a podcastear! 🎙️🚀
+
+## Variables del Entorno
+
+- **castopod/app**
+
+  | Nombre de la Variable         | Escribe (`predeterminado`)          |
+  | ----------------------------- | ----------------------------------- |
+  | **`CP_URLBASE`**              | string (`indefinido`)               |
+  | **`CP_MEDIA_URLBASE`**        | ?string (`(vacío)`)                 |
+  | **`CP_PUERTA_ADMINISTRADOR`** | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_PUERTA`**          | ?string (`"cp-auth"`)               |
+  | **`CP_ANALÍTICAS_SALT`**      | string (`indefinido`)               |
+  | **`CP_DATABASE_HOSTNAME`**    | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**        | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`**    | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`**    | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**      | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**        | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**           | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**       | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**           | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**       | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/es/getting-started/install.md b/docs/src/es/getting-started/install.md
index db0e0e8f94ae7de77799ac21f1a17ff583b9a818..7c2b5cee24e76a98e1970db4fde506669afd9d1b 100644
--- a/docs/src/es/getting-started/install.md
+++ b/docs/src/es/getting-started/install.md
@@ -9,11 +9,12 @@ Castopod está pensado para ser fácil de instalar. Ya sea usando un alojamiento
 dedicado o compartido, puedes instalarlo en la mayoría de servidores web
 compatibles con PHP-MySQL.
 
-::: Nota informativa
+::: tip Note
 
-Esta sección de la documentación te ayudará a configurar Castopod para la
-producción. Si estás buscando participar en el desarrollo de Castopod, debes
-pasar a la sección de contribuciones.
+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.
 
 :::
 
@@ -25,8 +26,7 @@ pasar a la sección de contribuciones.
 
 ### PHP v8.0 o superior
 
-Se requiere PHP versión 8.0 o superior con las siguientes extensiones
-instaladas:
+PHP version 8.0 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)
@@ -35,8 +35,7 @@ instaladas:
   **JPEG**, **PNG** y **WEBP**.
 - [exif](https://www.php.net/manual/en/exif.installation.php)
 
-Adicionalmente, asegúrate que las siguientes extensiones están habilitadas en tu
-PHP:
+Additionally, make sure that the following extensions are enabled in your PHP:
 
 - json (habilitada por defecto - no la desactives)
 - xml (habilitada por defecto - no la desactives)
@@ -46,28 +45,27 @@ PHP:
 
 > Recomendamos usar [MariaDB](https://mariadb.org).
 
-::: aviso Aviso
+::: warning Warning
 
-Castopod solo funciona con base de datos compatible con MySQL 5.7 o superior. Se
-romperá con la version previa MySQL v5.6 por ejemplo, ya que su vida terminó el
-5 de febrero de 2021.
+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.
 
 :::
 
-Necesitarás el nombre del anfitrión del servidor, nombre de la base de datos,
-usuario y contraseña para completar el proceso de instalación. Si no los tienes,
-por favor, contacta al administrador del servidor.
+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.
 
 #### Privilegios
 
-Los usuarios deben tener al menos estos privilegios en la base de datos para que
-Castopod funcione: `CREAR`, `ALTERAR`, `BORRAR`, `EJECUTAR`, `INDICE`,
-`INSERTAR`, `SELECCIONAR`, `ACTUALIZAR`.
+User must have at least these privileges on the database for Castopod to work:
+`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`.
 
 ### (Opcional) FFmpeg v4.1.8 o superior para clips de video
 
-Se requiere [FFmpeg](https://www.ffmpeg.org/) versión 4.1.8 o superior si
-quieres general clips de video. Se debe instalar las siguientes extensiones:
+[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:
 
 - Librería **FreeType 2** para
   [gd](https://www.php.net/manual/en/image.installation.php).
@@ -127,24 +125,24 @@ quieres general clips de video. Se debe instalar las siguientes extensiones:
 2. Sigue las instrucciones de la pantalla.
 3. ¡Empieza a crear podcasting!
 
-::: Nota informativa
+::: info Note
 
-El script de instalación escribe un archivo `.env` en la raiz de paquete. Si no
-puedes completar la instalación de wizard, puedes
-[crear y actualizar el archivo `.env` manualmente](#alternative-manual-configuration).
+The install script writes a `.env` file in the package root. If you cannot go
+through the install wizard, you can
+[create and update the `.env` file manually](#alternative-manual-configuration).
 
 :::
 
 ## Paquetes de la comunidad
 
-Si no quieres molestarte en instalar Castopod manualmente, puedes usar 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
 
-[YunoHost](https://yunohost.org/) es una distribuidora basada en Debian
-GNU/Linux compuesta por paquetes de software libres y de código abierto. It
-manages the hardships of self-hosting for you.
+[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">
 
@@ -158,19 +156,3 @@ manages the hardships of self-hosting for you.
 Repo</a>
 
 </div>
-
-### Instalar con Docker
-
-Si desea utilizar Docker para instalar Castopod, ¡es posible gracias a
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Instalar
-con
-Docker<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>
-
-::: Nota de información
-
-Dada la alta demanda de docker, planeamos mantener una imagen oficial del Docker
-de Castopod directamente en el repositorio de Castopod.
-
-:::
diff --git a/docs/src/es/index.md b/docs/src/es/index.md
index f6842362eacd475d6ee270acf5ae349c1b3270bf..3c416619a4e6a4ea24a5d6be133f79349e9dd084 100644
--- a/docs/src/es/index.md
+++ b/docs/src/es/index.md
@@ -219,7 +219,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/fa/getting-started/docker.md b/docs/src/fa/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/fa/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/fa/getting-started/install.md b/docs/src/fa/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/fa/getting-started/install.md
+++ b/docs/src/fa/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/fa/index.md b/docs/src/fa/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/fa/index.md
+++ b/docs/src/fa/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/fr/getting-started/docker.md b/docs/src/fr/getting-started/docker.md
index 6e0b0dcea02e7db151527c74f92d51c780b98513..2a35a8bb2b947c3cc888859382fbc37825c428f8 100644
--- a/docs/src/fr/getting-started/docker.md
+++ b/docs/src/fr/getting-started/docker.md
@@ -1,32 +1,32 @@
 ---
-title: Images Docker officielles
+title: Official Docker images
 sidebarDepth: 3
 ---
 
-# Images Docker officielles
+# Official Docker images
 
-Castopod publie 2 images Docker sur Docker Hub grâce à l'automatisation de la
-construction des images par la chaîne d'intégration GitLab :
+Castopod pushes 2 Docker images to the Docker Hub during its automated build
+process:
 
-- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): l'application
-  avec toutes les dépendances de Castopod
-- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): un
-  serveur Nginx avec une configuration adaptée à Castopod
+- [**`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
 
-De plus, Castopod nécessite une base de donnée compatible avec MySQL. Une base
-de donnée Redis peut être utilisée pour gérer le cache.
+Additionally, Castopod requires a MySQL-compatible database. A Redis database
+can be added as a cache handler.
 
-## Tags disponibles
+## Supported tags
 
-- `develop` [instable], dernière version de développement de Castopod
+- `develop` [unstable], latest development branch build
 
-// d'autres tags sont à venir !
+// more tags to come!
 
-## Exemple d'utilisation
+## Example usage
 
-1.  Installez [docker](https://docs.docker.com/get-docker/) et
+1.  Install [docker](https://docs.docker.com/get-docker/) and
     [docker-compose](https://docs.docker.com/compose/install/)
-2.  Créez un fichier `docker-compose.yml` contenant :
+2.  Create a `docker-compose.yml` file with the following:
 
     ```yml
     version: "3.7"
@@ -93,33 +93,31 @@ de donnée Redis peut être utilisée pour gérer le cache.
       castopod-db:
     ```
 
-    Vous devez adapter la configuration à vos besoins (e.g. `CP_BASEURL`,
+    You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
     `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
 
-3.  Mettre en place un reverse proxy pour gérer TLS (SSL/HTTPS)
+3.  Setup a reverse proxy for TLS (SSL/HTTPS)
 
-    TLS est obligatoire pour faire fonctionner ActivityPub. Cette tâche peut
-    facilement être déléguée à un reverse proxy, par exemple avec
-    [Caddy](https://caddyserver.com/):
+    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
+        reverse_proxy localhost:8080
     }
     ```
 
-4.  Lancez la commande `docker-compose up -d`, attendez l'initialisation et
-    rendez-vous sur `https://castopod.example.com/cp-install` pour finir
-    l'installation de Castopod !
+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.  Tout est bon à présent, à vos podcasts ! 🎙️🚀
+5.  You're all set, start podcasting! 🎙️🚀
 
-## Variables d'environnement
+## Environment Variables
 
 - **castopod/app**
 
-  | Nom de le variable         | Type (`default`)                    |
+  | Variable name              | Type (`default`)                    |
   | -------------------------- | ----------------------------------- |
   | **`CP_BASEURL`**           | string (`undefined`)                |
   | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
@@ -139,6 +137,6 @@ de donnée Redis peut être utilisée pour gérer le cache.
 
 - **castopod/web-server**
 
-  | Nom de la variable    | Type (`default`)  |
+  | Variable name         | Type (`default`)  |
   | --------------------- | ----------------- |
   | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/fr/getting-started/install.md b/docs/src/fr/getting-started/install.md
index 4d3bd938c403596ab4dcda4d49b0416dca2f51e9..dc8e52cfb2b2a3b3a934a54842a24d1bf21d7469 100644
--- a/docs/src/fr/getting-started/install.md
+++ b/docs/src/fr/getting-started/install.md
@@ -9,11 +9,12 @@ Castopod a été pensé pour être facile à installer. Que vous utilisiez un
 hébergement dédié ou mutualisé, vous pouvez l'installer sur la plupart des
 serveurs web compatibles avec PHP-MySQL.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -155,19 +156,3 @@ self-hosting for you.
 Github</a>
 
 </div>
-
-### Installer avec Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Installer
-avec
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md
index ee45816127a596f1131a941709218b65363c43a0..1ee8a8e52441c683ab5dcf3946abef50871a9ef5 100644
--- a/docs/src/fr/index.md
+++ b/docs/src/fr/index.md
@@ -223,7 +223,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/gd/getting-started/docker.md b/docs/src/gd/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/gd/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/gd/getting-started/install.md b/docs/src/gd/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/gd/getting-started/install.md
+++ b/docs/src/gd/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/gd/index.md
+++ b/docs/src/gd/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/gl/getting-started/docker.md b/docs/src/gl/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/gl/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/gl/getting-started/install.md b/docs/src/gl/getting-started/install.md
new file mode 100644
index 0000000000000000000000000000000000000000..05659d73eb1e9ae243c4de711e3b4ad2683faaf8
--- /dev/null
+++ b/docs/src/gl/getting-started/install.md
@@ -0,0 +1,155 @@
+---
+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.0 or higher
+- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
+- HTTPS support
+
+### PHP v8.0 or higher
+
+PHP version 8.0 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`.
+
+### (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 update the `.env` file manually](#alternative-manual-configuration).
+
+:::
+
+## 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/gl/getting-started/security.md b/docs/src/gl/getting-started/security.md
new file mode 100644
index 0000000000000000000000000000000000000000..e205698df8a8029f080840922a212f01da1baa7e
--- /dev/null
+++ b/docs/src/gl/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/gl/getting-started/update.md b/docs/src/gl/getting-started/update.md
new file mode 100644
index 0000000000000000000000000000000000000000..1f48e274922fd3affdc428ffd59a8d79909dcab7
--- /dev/null
+++ b/docs/src/gl/getting-started/update.md
@@ -0,0 +1,93 @@
+---
+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 âš¡.
+
+## Automatic update instructions
+
+> Coming soon... 👀
+
+## Manual update instructions
+
+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
+
+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. Releases may come with additional update instructions (see
+   [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They
+   are usually database migration scripts in `.sql` format to update your
+   database schema.
+
+   - 👉 Make sure you run the scripts on your phpmyadmin panel or using command
+     line to update the database along with the package files!
+   - 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)
+
+5. If you are using redis, clear your cache.
+6. ✨ Enjoy your fresh instance, you're all done!
+
+## 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/gl/index.md b/docs/src/gl/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..cb12ac591a04d5e9c3ff97212327567c954d54be
--- /dev/null
+++ b/docs/src/gl/index.md
@@ -0,0 +1,289 @@
+---
+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;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>
+  <tr>
+    <td align="center"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt=""/><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"><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=""/><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"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt=""/><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"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt=""/><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"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
+    <td align="center"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt=""/><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"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><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=""/><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"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><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"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt=""/><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"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><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"><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=""/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+  </tr>
+  <tr>
+    <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><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"><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=""/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><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=""/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
+  </tr>
+</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/id/getting-started/docker.md b/docs/src/id/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/id/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/id/getting-started/install.md b/docs/src/id/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/id/getting-started/install.md
+++ b/docs/src/id/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/id/index.md b/docs/src/id/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/id/index.md
+++ b/docs/src/id/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/it/getting-started/docker.md b/docs/src/it/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/it/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/it/getting-started/install.md b/docs/src/it/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/it/getting-started/install.md
+++ b/docs/src/it/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/it/index.md b/docs/src/it/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/it/index.md
+++ b/docs/src/it/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/nl/getting-started/docker.md b/docs/src/nl/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/nl/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/nl/getting-started/install.md
+++ b/docs/src/nl/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/nl/index.md b/docs/src/nl/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/nl/index.md
+++ b/docs/src/nl/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/nn-NO/getting-started/docker.md
index 1a057fe4ec9d4eb68b3c3be91c5aa684acbae778..2a35a8bb2b947c3cc888859382fbc37825c428f8 100644
--- a/docs/src/nn-NO/getting-started/docker.md
+++ b/docs/src/nn-NO/getting-started/docker.md
@@ -104,7 +104,7 @@ can be added as a cache handler.
     ```
     #castopod
     castopod.example.com {
-    	reverse_proxy localhost:8080
+        reverse_proxy localhost:8080
     }
     ```
 
diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md
index ea1ffea679125f421aa09d4a8935c4e1ce7a5e0d..f58f9cb079e5701edca17a3c5df6b7ec16a30ca9 100644
--- a/docs/src/nn-NO/getting-started/install.md
+++ b/docs/src/nn-NO/getting-started/install.md
@@ -9,11 +9,12 @@ Det er meininga at Castopod skal vera lett å installera. Uansett om du bruker
 eige eller delt vevhotell, kan du installera på dei fleste maskiner som har PHP
 og MySQL.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -151,19 +152,3 @@ self-hosting for you.
    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-arkiv</a>
 
 </div>
-
-### Installer med Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Installer
-med
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md
index fa83927dd96bf40df03e7430c50aa9c0323ff18e..9ead96ba73be421f2934fc699c27c59280dc6ba8 100644
--- a/docs/src/nn-NO/index.md
+++ b/docs/src/nn-NO/index.md
@@ -217,7 +217,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/oc/getting-started/docker.md b/docs/src/oc/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/oc/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/oc/getting-started/install.md
+++ b/docs/src/oc/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/oc/index.md b/docs/src/oc/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/oc/index.md
+++ b/docs/src/oc/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/pl/getting-started/docker.md b/docs/src/pl/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/pl/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/pl/getting-started/install.md
+++ b/docs/src/pl/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/pl/index.md b/docs/src/pl/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/pl/index.md
+++ b/docs/src/pl/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/pt-BR/getting-started/docker.md b/docs/src/pt-BR/getting-started/docker.md
index 1a057fe4ec9d4eb68b3c3be91c5aa684acbae778..2a35a8bb2b947c3cc888859382fbc37825c428f8 100644
--- a/docs/src/pt-BR/getting-started/docker.md
+++ b/docs/src/pt-BR/getting-started/docker.md
@@ -104,7 +104,7 @@ can be added as a cache handler.
     ```
     #castopod
     castopod.example.com {
-    	reverse_proxy localhost:8080
+        reverse_proxy localhost:8080
     }
     ```
 
diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md
index 468f4359866e65410810eddeec40cf1416cbff20..04f8f4ff54dc3e9920beebae7d09633c81ddf6a0 100644
--- a/docs/src/pt-BR/getting-started/install.md
+++ b/docs/src/pt-BR/getting-started/install.md
@@ -9,11 +9,12 @@ Castopod foi pensado para ser fácil de instalar. Seja usando hospedagem dedicad
 ou compartilhada, você pode instalá-lo na maioria dos servidores web compatíveis
 com PHP-MySQL.
 
-::: info Nota
+::: dica Nota
 
-Esta seção da documentação o ajudará a configurar o Castopod para produção. Se
-você deseja participar do desenvolvimento do Castopod, pode pular para a seção
-de contribuição.
+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.
 
 :::
 
@@ -25,7 +26,7 @@ de contribuição.
 
 ### PHP v8.0 ou superior
 
-É necessário PHP versão 8.0 ou superior, com as seguintes extensões instaladas:
+PHP version 8.0 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)
@@ -34,8 +35,7 @@ de contribuição.
   **PNG** e bibliotecas **WEBP**.
 - [exif](https://www.php.net/manual/en/exif.installation.php)
 
-Além disso, certifique-se de que as seguintes extensões estejam habilitadas em
-seu PHP:
+Additionally, make sure that the following extensions are enabled in your PHP:
 
 - json (habilitado por padrão - não desativar)
 - xml (habilitado por padrão - não desativar)
@@ -45,28 +45,27 @@ seu PHP:
 
 > Recomendamos usar o [MariaDB](https://mariadb.org).
 
-::: warning Aviso
+::: warning Warning
 
-Castopod só funciona com bancos de dados MySQL 5.7 ou superior compatíveis. Vai
-quebrar com a versão anterior MySQL v5.6, por exemplo, pois foi encerrada em 5
-de fevereiro de 2021.
+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.
 
 :::
 
-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.
+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.
 
 #### Privilégios
 
-O usuário deve ter pelo menos esses privilégios no banco de dados do Castopod
-para funcionar: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`,
-`SELECT`, `UPDATE`.
+User must have at least these privileges on the database for Castopod to work:
+`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`.
 
 ### (Opcional) FFmpeg v4.1.8 ou superior para Clipes de Vídeo
 
-[FFmpeg](https://www.ffmpeg.org/) versão 4.1.8 ou superior é necessário se você
-deseja gerar Video Clips. As seguintes extensões devem ser instaladas:
+[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:
 
 - Biblioteca **FreeType 2** para
   [gd](https://www.php.net/manual/en/image.installation.php).
@@ -125,24 +124,24 @@ deseja gerar Video Clips. As seguintes extensões devem ser instaladas:
 2. Siga as instruções na sua tela.
 3. Comece o podcast!
 
-::: info Nota
+::: info Note
 
-O script de instalação grava um arquivo `.env` na raiz do pacote. Se você não
-puder passar pelo assistente de instalação, você pode
-[criar e atualizar o arquivo `.env` manualmente](#alternative-manual-configuration).
+The install script writes a `.env` file in the package root. If you cannot go
+through the install wizard, you can
+[create and update the `.env` file manually](#alternative-manual-configuration).
 
 :::
 
 ## Pacotes comunitários
 
-Se você não quiser se preocupar em instalar o Castopod manualmente, você pode
-usar um dos pacotes criados e mantidos pela comunidade de código aberto.
+If you don't want to bother with installing Castopod manually, you may use one
+of the packages created and maintained by the open-source community.
 
 ### Instalar com YunoHost
 
-[YunoHost](https://yunohost.org/) é uma distribuição baseada no Debian GNU/Linux
-composto por pacotes de software livre e de código aberto. Ele gerencia as
-dificuldades de auto-hospedagem para você.
+[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">
 
@@ -156,19 +155,3 @@ dificuldades de auto-hospedagem para você.
 Repo</a>
 
 </div>
-
-### Instalar com o Docker
-
-Se você deseja usar o Docker para instalar o Castopod, é possível graças a
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Instalar
-com o
-Docker<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>
-
-::: info Nota
-
-Dado o alto nível de demanda por docker, planejamos manter uma imagem oficial do
-Castopod Docker diretamente no repositório do Castopod.
-
-:::
diff --git a/docs/src/pt-BR/index.md b/docs/src/pt-BR/index.md
index df6ea095c8fe22fb2303ea0e6367ccb597313897..24204271fde1fd7f3a9e911b24c7d7bc8a2f215c 100644
--- a/docs/src/pt-BR/index.md
+++ b/docs/src/pt-BR/index.md
@@ -219,7 +219,7 @@ Agradecimento vai para essas pessoas maravilhosas
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/pt/getting-started/docker.md b/docs/src/pt/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/pt/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/pt/getting-started/install.md
+++ b/docs/src/pt/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/pt/index.md b/docs/src/pt/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/pt/index.md
+++ b/docs/src/pt/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/ru/getting-started/docker.md b/docs/src/ru/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/ru/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/ru/getting-started/install.md
+++ b/docs/src/ru/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/ru/index.md b/docs/src/ru/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/ru/index.md
+++ b/docs/src/ru/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/sk/getting-started/docker.md b/docs/src/sk/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/sk/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/sk/getting-started/install.md
+++ b/docs/src/sk/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/sk/index.md b/docs/src/sk/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/sk/index.md
+++ b/docs/src/sk/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/docs/src/sv/getting-started/docker.md b/docs/src/sv/getting-started/docker.md
new file mode 100644
index 0000000000000000000000000000000000000000..2a35a8bb2b947c3cc888859382fbc37825c428f8
--- /dev/null
+++ b/docs/src/sv/getting-started/docker.md
@@ -0,0 +1,142 @@
+---
+title: Official Docker images
+sidebarDepth: 3
+---
+
+# Official Docker images
+
+Castopod pushes 2 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
+
+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
+
+// more tags to come!
+
+## 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:develop
+        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:develop
+        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
+
+    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/app**
+
+  | Variable name              | Type (`default`)                    |
+  | -------------------------- | ----------------------------------- |
+  | **`CP_BASEURL`**           | string (`undefined`)                |
+  | **`CP_MEDIA_BASEURL`**     | ?string (`(empty)`)                 |
+  | **`CP_ADMIN_GATEWAY`**     | ?string (`"cp-admin"`)              |
+  | **`CP_AUTH_GATEWAY`**      | ?string (`"cp-auth"`)               |
+  | **`CP_ANALYTICS_SALT`**    | string (`undefined`)                |
+  | **`CP_DATABASE_HOSTNAME`** | ?string (`"mariadb"`)               |
+  | **`CP_DATABASE_NAME`**     | string (`MYSQL_DATABASE`)           |
+  | **`CP_DATABASE_USERNAME`** | string (`MYSQL_USER`)               |
+  | **`CP_DATABASE_PASSWORD`** | string (`MYSQL_PASSWORD`)           |
+  | **`CP_DATABASE_PREFIX`**   | ?string (`"cp_"`)                   |
+  | **`CP_CACHE_HANDLER`**     | ?[`"file"` or `"redis"`] (`"file"`) |
+  | **`CP_REDIS_HOST`**        | ?string (`"localhost"`)             |
+  | **`CP_REDIS_PASSWORD`**    | ?string (`null`)                    |
+  | **`CP_REDIS_PORT`**        | ?number (`6379`)                    |
+  | **`CP_REDIS_DATABASE`**    | ?number (`0`)                       |
+
+- **castopod/web-server**
+
+  | Variable name         | Type (`default`)  |
+  | --------------------- | ----------------- |
+  | **`CP_APP_HOSTNAME`** | ?string (`"app"`) |
diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md
index c63d2fe13acf3b7637f6eae2542b163729f2d007..05659d73eb1e9ae243c4de711e3b4ad2683faaf8 100644
--- a/docs/src/sv/getting-started/install.md
+++ b/docs/src/sv/getting-started/install.md
@@ -8,11 +8,12 @@ sidebarDepth: 3
 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.
 
-::: info Note
+::: tip Note
+
+We've released official Docker images for Castopod!
 
-This section of the documentation will help you set up Castopod for production.
-If you are looking to partake in the development of Castopod, you may skip to
-the contributing section.
+If you prefer using Docker, you may skip this and go straight to the
+[docker documentation](./docker.md) for Castopod.
 
 :::
 
@@ -152,19 +153,3 @@ self-hosting for you.
 Repo</a>
 
 </div>
-
-### Install with Docker
-
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
-
-<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
-with
-Docker<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>
-
-::: info Note
-
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
-
-:::
diff --git a/docs/src/sv/index.md b/docs/src/sv/index.md
index 94dca16520219653853ddca41eebf92d670684b2..cb12ac591a04d5e9c3ff97212327567c954d54be 100644
--- a/docs/src/sv/index.md
+++ b/docs/src/sv/index.md
@@ -216,7 +216,7 @@ Thanks goes to these wonderful people
   </tr>
   <tr>
     <td align="center"><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=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
-    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/302a5777aff9f244.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
+    <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
     <td align="center"><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=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
diff --git a/modules/Admin/Language/ar/Breadcrumb.php b/modules/Admin/Language/ar/Breadcrumb.php
index 396ae47444525b08e3db539a4f3215536765a049..2a562d7d5f3ab18adaeb91df10abcdb33d4a6190 100644
--- a/modules/Admin/Language/ar/Breadcrumb.php
+++ b/modules/Admin/Language/ar/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/ar/Common.php b/modules/Admin/Language/ar/Common.php
index ce8a29f18e434823f51c185a86e8f8523711e024..9dff13c60241fedfbe4e7b0723b1bde25eb7ce86 100644
--- a/modules/Admin/Language/ar/Common.php
+++ b/modules/Admin/Language/ar/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'Playing',
     ],
     'size_limit' => 'Size limit: {0}.',
-    'choose_interact' => 'اختر أسلوب التفاعل',
+    'choose_interact' => 'Choose how to interact',
     'view' => 'View',
 ];
diff --git a/modules/Admin/Language/ar/Dashboard.php b/modules/Admin/Language/ar/Dashboard.php
index 3d963a7ef8116c972ea731b574767dfcd17a1084..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6 100644
--- a/modules/Admin/Language/ar/Dashboard.php
+++ b/modules/Admin/Language/ar/Dashboard.php
@@ -9,8 +9,8 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'لوحة التحكم الإدارية',
-    'welcome_message' => 'أهلًا بك في المنطقة الإدارية!',
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
     'podcasts' => [
         'title' => 'Podcasts',
         'not_found' => 'No published podcast',
diff --git a/modules/Admin/Language/ar/Notifications.php b/modules/Admin/Language/ar/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/ar/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php
index c3ea93ff27cb65a8eaf9fae284c3dca901db48a6..8702d4ce9dc9feec2ec242f31d582100c8a0bef4 100644
--- a/modules/Admin/Language/br/Breadcrumb.php
+++ b/modules/Admin/Language/br/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'tennadoù son',
     'video-clips' => 'tennadoù video',
     'embed' => 'lenner enkorfet',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/br/Charts.php b/modules/Admin/Language/br/Charts.php
index 1d70b13b5a0378001b1bd4fbd207fe17da5100c1..7de3c6acd6e64be4143d8cb5662c98526cf35d93 100644
--- a/modules/Admin/Language/br/Charts.php
+++ b/modules/Admin/Language/br/Charts.php
@@ -35,6 +35,6 @@ return [
     'by_weekday' => 'Dre zeiz ar sizhun (e-pad an 60 devezh diwezhañ)',
     'by_hour' => 'Dre eur an devezh (e-pad an 60 devezh diwezhañ)',
     'podcast_by_bandwidth' => 'Lec\'hed bann implijet bemdez (e MB)',
-    'total_storage_by_month' => 'Monthly storage (in MB)',
-    'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
+    'total_storage_by_month' => 'Kadaviñ bep miz (e MB)',
+    'total_bandwidth_by_month' => 'Lec\'hed bann implijet bep miz (e MB)',
 ];
diff --git a/modules/Admin/Language/br/Common.php b/modules/Admin/Language/br/Common.php
index e9305d4ed2854a60b9d6ce1f9c090209f8fdc568..1cb6c3b2c01f607fb12e0aa89e4c57c6d040017b 100644
--- a/modules/Admin/Language/br/Common.php
+++ b/modules/Admin/Language/br/Common.php
@@ -20,7 +20,7 @@ return [
     'copy' => 'Eilañ',
     'copied' => 'Eilet!',
     'home' => 'Degemer',
-    'explicit' => 'Endalc\'had evit an oadourien',
+    'explicit' => 'Danvez evit an oadourien',
     'powered_by' => 'Lusket gant {castopod}',
     'actions' => 'Obererezhioù',
     'pageInfo' => 'Pajenn {currentPage} diwar {pageCount}',
@@ -46,6 +46,6 @@ return [
         'playing' => 'O lenn',
     ],
     'size_limit' => 'Bevenn ar vent: {0}.',
-    'choose_interact' => 'Dibabit penaos interaktiñ',
-    'view' => 'View',
+    'choose_interact' => 'Dibabit penaos bezañ e darempred',
+    'view' => 'Gwelet',
 ];
diff --git a/modules/Admin/Language/br/Dashboard.php b/modules/Admin/Language/br/Dashboard.php
index 0b7c784fb13d70937fdd734fdd8a16607562bdcd..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6 100644
--- a/modules/Admin/Language/br/Dashboard.php
+++ b/modules/Admin/Language/br/Dashboard.php
@@ -9,8 +9,8 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Taolenn-stur',
-    'welcome_message' => 'Degemer mat en daolenn-stur!',
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
     'podcasts' => [
         'title' => 'Podcasts',
         'not_found' => 'No published podcast',
diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php
index 611955d3486157be83811bc459306d8525333837..800e64598321ac4953667f6b9a7dc0af4d5d5820 100644
--- a/modules/Admin/Language/br/Episode.php
+++ b/modules/Admin/Language/br/Episode.php
@@ -31,25 +31,26 @@ return [
     'publish_cancel_error' => 'Embannet eo bet ar rann dija.',
     'unpublish_error' => 'N\'eo ket bet embannet ar rann.',
     'delete' => 'Dilemel',
-    'go_to_page' => 'Gwelout ar bajenn',
+    'go_to_page' => 'Gwelet ar bajenn',
     'create' => 'Ouzhpennañ ur rann',
     'publication_status' => [
         'published' => 'Embannet',
-        'with_podcast' => 'Published',
+        'with_podcast' => 'Embannet',
         'scheduled' => 'Steuñvet',
         'not_published' => 'Diembann',
     ],
-    'with_podcast_hint' => 'To be published at the same time as the podcast',
+    'with_podcast_hint' => 'Embannet e vo war un dro gant ar podkast',
     'list' => [
         'search' => [
-            'placeholder' => 'Search for an episode',
-            'clear' => 'Clear search',
-            'submit' => 'Search',
+            'placeholder' => 'Klask ur rann',
+            'clear' => 'Diverkañ an enklask',
+            'submit' => 'Klask',
         ],
         'number_of_episodes' => '{numberOfEpisodes, plural,
-            one {# episode}
-            other {# episodes}
-        }',
+        0 {rann ebet}
+        one {# rann}
+        other {# rann}
+    }',
         'episode' => 'Rann',
         'visibility' => 'Gwelusted',
         'comments' => 'Evezhiadennoù',
@@ -59,30 +60,30 @@ return [
         'createSuccess' => 'Krouet eo bet ar rann gant berzh!',
         'editSuccess' => 'Hizivaet eo bet ar rann gant berzh!',
         '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 {Embannet eo bet ar rann gant berzh!}
+            scheduled {Raktreset eo bet embannadur ar rann gant berzh!}
+            with_podcast {Ar rann-mañ a vo embannet war un dro gant ar podkast.}
+            other {N\'eo ket bet embannet ar rann-mañ.}
         }',
         'publishCancelSuccess' => 'Nullet eo bet embannadur ar rann gant berzh!',
         'unpublishBeforeDeleteTip' => 'Ret eo deoc\'h diembannañ ar rann a-raok dilemel anezhi.',
-        'scheduleDateError' => 'Schedule date must be set!',
+        'scheduleDateError' => 'Ret eo lakaat un deiziad evit an embannadur!',
         'deletePublishedEpisodeError' => 'Diembannit ar rann a-raok dilemel anezhi mar plij.',
         'deleteSuccess' => 'Dilamet eo bet ar rann gant berzh!',
-        '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}
+        'deleteError' => 'C\'hwitadenn war dilemel {type, select,
+            transcript {treuzskrivadur}
+            chapters {chabistroù}
+            image {golo}
+            audio {aodio}
             other {media}
-        } file {file_path}. You may manually remove it from your disk.',
+        } ar rann.',
+        'deleteFileError' => 'C\'hwitadenn war dilemel restr {type, select,
+            transcript {an treuzskrivadur}
+            chapters {ar chabistroù}
+            image {ar golo}
+            audio {an aodio}
+            other {ar media}
+        } ({file_path}). Gallout a rit lemel kuit ar restr-mañ diouzh ar gantenn dre zorn.',
         'sameSlugError' => 'Bez ez eus eus ur rann gant ar berradur-mañ (slug) dija.',
     ],
     'form' => [
@@ -94,11 +95,11 @@ return [
         'cover' => 'Golo ar rann',
         'cover_hint' =>
             'Ma n\'ho peus ket kaset ur golo e vo implijet hini ar podkast en e blas.',
-        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'cover_size_hint' => 'Ar golo a rankfe bezañ ur c\'harrez ha 1400px e vent da nebeutañ.',
         'title' => 'Titl',
         'title_hint' =>
             'Dleout a rafe anv ar rann, sklaer ha berr. Arabat lakaat niverenn ar rann pe ar c\'houlzad amañ.',
-        'permalink' => 'Peurliamm',
+        'permalink' => 'Ere peurzalc\'hus',
         'season_number' => 'Koulzad',
         'episode_number' => 'Rann',
         'type' => [
@@ -112,10 +113,10 @@ return [
         ],
         'parental_advisory' => [
             'label' => 'Kemenn evit ar gerent',
-            'hint' => 'Hag ar rann-mañ a zo endalc\'had ha ne zlefe ket gwelet gant bugale?',
+            'hint' => 'Hag ar rann-mañ a zo danvez ha ne zlefe ket gwelet gant bugale?',
             'undefined' => 'andermenet',
             'clean' => 'Dereat',
-            'explicit' => 'Endalc\'had evit an oadourien',
+            'explicit' => 'Danvez evit an oadourien',
         ],
         'show_notes_section_title' => 'Notennoù ar rann',
         'show_notes_section_subtitle' =>
@@ -123,7 +124,7 @@ return [
         'description' => 'Deskrivadur',
         'description_footer' => 'Traoñ an deskrivadur',
         'description_footer_hint' =>
-            'Emañ ouzhpennet an destenn-mañ e dibenn an holl rannoù. Ul lec\'h mat eo evit lakaat liammoù ho rouedadoù sokial da skouer.',
+            'Emañ ouzhpennet an destenn-mañ e dibenn an holl rannoù. Ul lec\'h mat eo evit lakaat ereoù ho rouedadoù sokial da skouer.',
         'additional_files_section_title' => 'Restroù ouzhpenn',
         'additional_files_section_subtitle' =>
             'Ar restroù-mañ a c\'hell bezañ implijet gant savennoù all evit aesaat an traoù d\'ho selaouerien·ezed. Sellit ouzh {podcastNamespaceLink} evit muioc\'h a ditouroù.',
@@ -148,9 +149,9 @@ return [
             'M\'ho peus ezhomm eus balizennoù RSS ha n\'eus ket anezho e Castopod e c\'hellit o lakaat amañ.',
         'custom_rss' => 'Balizennoù RSS personelaet evit ar rann',
         'custom_rss_hint' => 'An dra-se a vo ouzhpennet e-barzh ar valizenn ❬item❭.',
-        'block' => 'Episode should be hidden from public catalogues',
+        'block' => 'Ar rann-se a rankfe bezañ kuzhet diouzh ar rolladoù publik',
         '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)',
+            'Diskouez pe kuzhat ar rann: trec\'haoliñ an afell-mañ a viro ar rann-mañ ouzh bezañ diskouezet war Apple Podcasts, Google Podcasts pe savennoù all hag a implij ar renabloù-se. (N\'eus gwarant ebet)',
         'submit_create' => 'Krouiñ ar rann',
         'submit_edit' => 'Enrollañ ar rann',
     ],
@@ -164,7 +165,7 @@ return [
         'publication_method' => [
             'now' => 'Bremañ',
             'schedule' => 'Steuñviñ',
-            'with_podcast' => 'Publish alongside podcast',
+            'with_podcast' => 'Embann asambles gant ar podkast',
         ],
         'scheduled_publication_date' => 'Deiziad embannadur steuñvet',
         'scheduled_publication_date_clear' => 'Skarzhañ deiziad embannadur',
diff --git a/modules/Admin/Language/br/Notifications.php b/modules/Admin/Language/br/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/br/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/br/Page.php b/modules/Admin/Language/br/Page.php
index 4cfefec67a62a00f8a4b9cbf53617c0cd66426da..dccaa097788255c1488ae5b92433f8b89f63c6ba 100644
--- a/modules/Admin/Language/br/Page.php
+++ b/modules/Admin/Language/br/Page.php
@@ -18,7 +18,7 @@ return [
     'delete' => 'Dilemel ar bajenn',
     'form' => [
         'title' => 'Titl',
-        'permalink' => 'Peurliamm',
+        'permalink' => 'Ere peurzalc\'hus',
         'content' => 'Danvez',
         'submit_create' => 'Krouiñ ar bajenn',
         'submit_edit' => 'Enrollañ',
diff --git a/modules/Admin/Language/br/Person.php b/modules/Admin/Language/br/Person.php
index c28087d8f724b43f4ef25d54e0bf30f5fa93190a..9a1d0f69bba835bed9985d000853b02f302afafc 100644
--- a/modules/Admin/Language/br/Person.php
+++ b/modules/Admin/Language/br/Person.php
@@ -24,42 +24,42 @@ return [
     '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',
+            'An avatar a rankfe bezañ ur c\'harrez ha 400px e vent da nebeutañ.',
+        'full_name' => 'Anv klok',
+        'full_name_hint' => 'Anv klok pe lesanv an emeller·ez.',
+        'unique_name' => 'Anv unel',
+        'unique_name_hint' => 'Implijet evit an URLioù',
+        'information_url' => 'URL an titouroù',
         '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',
+            'Un URL a gas betek titouroù an emeller·ez, evel ur bajenn bersonel pe un aelad war ur savenn all.',
+        'submit_create' => 'Krouiñ an emeller·ez',
+        'submit_edit' => 'Enrollañ an emeller·ez',
     ],
     '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' => 'Merañ an emellerien·ezed',
+        'add_section_title' => 'Ouzhpennañ emellerien·ezed d\'ar podkast-mañ',
+        'add_section_subtitle' => 'Gallout a rit dibab meur a emeller·ez ha meur a roll.',
+        'persons' => 'Emellerien·ezed',
         'persons_hint' =>
-            'You may select one or several persons with the same roles. You need to create the persons first.',
-        'roles' => 'Roles',
+            'Gallout a rit dibab un emeller·ez pe meur a hini gant ar memes roll. Rankout a reoc\'h krouiñ an emellerien·ezed a-raok avat.',
+        'roles' => 'Rolloù',
         'roles_hint' =>
-            'You may select none, one or several roles for a person.',
-        'submit_add' => 'Add person(s)',
-        'remove' => 'Remove',
+            'Gallout a rit dibab roll ebet, unan pe meur hini evit pep emeller·ez.',
+        'submit_add' => 'Ouzhpennañ emellerien·ezed',
+        'remove' => 'Lemel',
     ],
     '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' => 'Merañ an emellerien·ezed',
+        'add_section_title' => 'Ouzhpennañ emellerien·ezed d\'ar rann-mañ',
+        'add_section_subtitle' => 'Gallout a rit dibab meur a emeller·ez ha meur a roll.',
+        'persons' => 'Emellerien·ezed',
         'persons_hint' =>
-            'You may select one or several persons with the same roles. You need to create the persons first.',
-        'roles' => 'Roles',
+            'Gallout a rit dibab un emeller·ez pe meur a hini gant ar memes roll. Rankout a reoc\'h krouiñ an emellerien·ezed a-raok avat.',
+        'roles' => 'Rolloù',
         'roles_hint' =>
-            'You may select none, one or several roles for a person.',
-        'submit_add' => 'Add person(s)',
-        'remove' => 'Remove',
+            'Gallout a rit dibab roll ebet, unan pe meur hini evit pep emeller·ez.',
+        'submit_add' => 'Ouzhpennañ emellerien·ezed',
+        'remove' => 'Lemel',
     ],
-    'credits' => 'Credits',
+    'credits' => 'Perzhidi',
 ];
diff --git a/modules/Admin/Language/br/Platforms.php b/modules/Admin/Language/br/Platforms.php
index ab17d5999b1626535499464902c12f5c3bcb7aa8..71d041685ec995cd49501f5350e794dc2a41f658 100644
--- a/modules/Admin/Language/br/Platforms.php
+++ b/modules/Admin/Language/br/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' => 'Savennoù',
+    'home_url' => 'Mont da lec\'hienn {platformName}',
+    'submit_url' => 'Kasit ho podkast war {platformName}',
+    'visible' => 'Diskouez e pajenn ar podkast?',
+    'on_embed' => 'Diskouez el lenner enkorfet?',
+    'remove' => 'Dilemel {platformName}',
+    'submit' => 'Enrollañ',
     'messages' => [
-        'updateSuccess' => 'Platform links have been successfully updated!',
-        'removeLinkSuccess' => 'The platform link has been removed.',
+        'updateSuccess' => 'Hizivaet eo bet ereoù ar savennoù gant berzh!',
+        'removeLinkSuccess' => 'Dilamet eo bet ere ar savenn.',
         'removeLinkError' =>
-            'The platform link could not be removed. Try again.',
+            'N\'eo ket bet dilamet ere ar savenn. Klaskit en-dro.',
     ],
     'description' => [
-        'podcasting' => 'The podcast ID on this platform',
-        'social' => 'The podcast account ID on this platform',
-        'funding' => 'Call to action message',
+        'podcasting' => 'ID ar podkast war ar savenn-mañ',
+        'social' => 'ID kont ar podkast war ar savenn-mañ',
+        'funding' => 'Kemennadenn evit broudañ',
     ],
 ];
diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php
index 61a53119c0bd847081ef98a9c660785d6d478b39..0de9f71b8442bfc6705831cdc2353490caffe753 100644
--- a/modules/Admin/Language/br/Podcast.php
+++ b/modules/Admin/Language/br/Podcast.php
@@ -14,53 +14,56 @@ return [
     'create' => 'Krouiñ ur podkast',
     'import' => 'Enporzhiañ ur podkast',
     'new_episode' => 'Rann nevez',
-    'view' => 'View podcast',
+    'view' => 'Gwelet ar podkast',
     'edit' => 'Kemmañ ar podkast',
-    'publish' => 'Publish podcast',
-    'publish_edit' => 'Edit publication',
+    'publish' => 'Embann ar podkast',
+    'publish_edit' => 'Kemmañ an embannadur',
     'delete' => 'Dilemel ar podkast',
-    'see_episodes' => 'See episodes',
-    'see_contributors' => 'See contributors',
-    'go_to_page' => 'Gwelout ar bajenn',
+    'see_episodes' => 'Gwelet ar rannoù',
+    'see_contributors' => 'Gwelet ar berzhidi, ar perzhiadezed',
+    'go_to_page' => 'Gwelet ar bajenn',
     'latest_episodes' => 'Rannoù diwezhañ',
-    'see_all_episodes' => 'Gwelout an holl rannoù',
-    'draft' => 'Draft',
+    'see_all_episodes' => 'Gwelet an holl rannoù',
+    'draft' => 'Brouilhed',
     'messages' => [
-        'createSuccess' => 'Podcast successfully created!',
+        'createSuccess' => 'Krouet eo bet ar podkast gant berzh!',
         'editSuccess' => 'Hizivaet eo bet ar podkast gant berzh!',
         'importSuccess' => 'Enporzhet eo bet ar podkast gant berzh!',
         'deleteSuccess' => 'Dilamet eo bet ar podkast @{podcast_handle} gant berzh!',
-        'deletePodcastMediaError' => 'Failed to delete podcast {type, select,
-            cover {cover}
-            banner {banner}
+        'deletePodcastMediaError' => 'C\'hwitadenn war dilemel {type, select,
+            cover {golo}
+            banner {giton}
             other {media}
-        }.',
-        'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select,
-            transcript {transcript}
-            chapters {chapters}
-            image {cover}
-            audio {audio}
+        } ar podkast.',
+        'deleteEpisodeMediaError' => 'C\'hwitadenn war dilemel {type, select,
+            transcript {treuzskrivadur}
+            chapters {chabistroù}
+            image {golo}
+            audio {aodio}
             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!',
+        } ar rann {episode_slug}.',
+        'deletePodcastMediaFolderError' => 'C\'hwitadenn war dilemel teuliad ar mediaioù {folder_path}. Gallout a rit lemel an teuliad-mañ diouzh ar gantenn dre zorn.',
+        'podcastFeedUpdateSuccess' => 'Hizivadenn: {number_of_new_episodes, plural,
+            one {# rann}
+            two {# rann}
+            few {# rann}
+            many {# rann}
+            other {# rann}
+        } a zo bet ouzhpennet d\'ar podkast gant berzh!',
+        'podcastFeedUpToDate' => 'Hizivaet eo bet ar podkast dija.',
+        'podcastNotImported' => 'C\'hwitadenn war hizivadenn ar podkast peogwir n\'eo ket bet enporzhiet.',
+        'publishError' => 'Ar podkast-mañ a zo bet embannet dija pe steuñvet eo e embannadur.',
+        'publishEditError' => 'N\'eo ket steuñvet embannadur ar podkast-mañ.',
+        'publishCancelSuccess' => 'Nullet eo bet embannadur ar podkast gant berzh!',
+        'scheduleDateError' => 'Ret eo lakaat un deiziad evit an embannadur!',
     ],
     'form' => [
         'identity_section_title' => 'Titouroù diwar-benn ar podkast',
         'identity_section_subtitle' => 'Ar maeziennoù a laka ac\'hanoc\'h da vezañ remerket.',
         'cover' => 'Golo ar podkast',
-        'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
+        'cover_size_hint' => 'Ar golo a rankfe bezañ ur c\'harrez ha 1400px e vent da nebeutañ.',
         'banner' => 'Giton ar podkast',
-        'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
+        'banner_size_hint' => 'Ar giton a rankfe bezañ 3:1 e feur led/sav ha bezañ 1500px e led d\'an nebeutañ.',
         'banner_delete' => 'Dilemel giton ar podkast',
         'title' => 'Titl',
         'handle' => 'Anv ar podkast (handle)',
@@ -68,176 +71,176 @@ return [
             'Implijet evit anavezout ar podkast. Lizherennoù bras pe munut, niveroù hag islinenn (_) degemeret.',
         'type' => [
             'label' => 'Doare',
-            '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.',
+            'episodic' => 'Bep ur mare',
+            'episodic_hint' => 'M\'eo ar rannoù da vezañ selaouet hep urzh resis. Ar rannoù nevesoc’h a vo kinniget da gentañ.',
+            'serial' => 'Heuliad',
+            'serial_hint' => 'M\'eo ar rannoù da vezañ selaouet gant un urzh resis. Ar rannoù koshoc\'h a vo kinniget da gentañ.',
         ],
         'description' => 'Deskrivadur',
         'classification_section_title' => 'Rummatadur',
         'classification_section_subtitle' =>
-            'These fields will impact your audience and competition.',
+            'Ar maeziennoù-mañ o do ul levezon war an niver a selaouerien·ezed hag ho kevezerezh.',
         'language' => 'Yezh',
-        'category' => 'Category',
-        'category_placeholder' => 'Select a category…',
-        'other_categories' => 'Other categories',
+        'category' => 'Rummad',
+        'category_placeholder' => 'Dibab ur rummad…',
+        'other_categories' => 'Rummadoù all',
         'parental_advisory' => [
             'label' => 'Kemenn evit ar gerent',
-            'hint' => 'Does it contain explicit content?',
+            'hint' => 'Hag an dra-se a zo danvez ha ne zlefe ket gwelet gant bugale?',
             'undefined' => 'andermenet',
-            'clean' => 'Clean',
-            'explicit' => 'Explicit',
+            'clean' => 'Dereat',
+            'explicit' => 'Danvez evit an oadourien',
         ],
-        'author_section_title' => 'Author',
-        'author_section_subtitle' => 'Who is managing the podcast?',
-        'owner_name' => 'Owner name',
+        'author_section_title' => 'Aozer·ez',
+        'author_section_subtitle' => 'Piv zo o verañ ar podkast?',
+        'owner_name' => 'Anv ar perc\'henn',
         'owner_name_hint' =>
-            'For administrative use only. Visible in the public RSS feed.',
-        'owner_email' => 'Owner email',
+            'Evit a sell ouzh ar mererezh. War al lanv RSS publik e vo.',
+        'owner_email' => 'Chomlec\'h postel ar perc\'henn',
         'owner_email_hint' =>
-            'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.',
-        'publisher' => 'Publisher',
+            'Implijet e vo gant an darn vrasañ eus ar savennoù evit gwiriañ perc\'hentiezh ar podkast. War al lanv RSS publik e vo.',
+        'publisher' => 'Embanner·ez',
         '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',
+            'Ar strollad kiriek eus sevel ar podkast. Alies eo embregerezh pe rouedad ar podkast. A-wechoù e vez anvet ar vaezienn-mañ "Aozer·ez".',
+        'copyright' => 'Gwirioù an aozer·ez',
+        'location_section_title' => 'Lec\'h',
+        'location_section_subtitle' => 'Eus peseurt lec\'h ez eus kaoz er podkast-mañ?',
+        'location_name' => 'Anv pe chomlec\'h al lec\'h',
+        'location_name_hint' => 'Gallout a ra bezañ gwir pe faltaziek',
+        'monetization_section_title' => 'Moneisaat',
         'monetization_section_subtitle' =>
-            'Earn money thanks to your audience.',
-        'payment_pointer' => 'Payment Pointer for Web Monetization',
+            'Dastum arc\'hant a-drugarez d\'ho selaouerien·ezed.',
+        'payment_pointer' => 'Chomlec\'h paeañ (Payment Poienter) evit Web Monetization',
         'payment_pointer_hint' =>
-            'This is your where you will receive money thanks to Web Monetization',
-        'advanced_section_title' => 'Advanced Parameters',
+            'Ar chomlec\'h ma vo dastumet an arc\'hant ganeoc\'h a-drugarez da Web Monetization',
+        'advanced_section_title' => 'Arventennoù kempleshoc\'h',
         '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',
+            'M\'ho peus ezhomm eus balizennoù RSS ha n\'eus ket anezho e Castopod e c\'hellit o lakaat amañ.',
+        'custom_rss' => 'Balizennoù RSS personelaet evit ar podkast',
+        'custom_rss_hint' => 'An dra-se a vo ouzhpennet e-barzh ar valizenn ❬channel❭.',
+        'new_feed_url' => 'URL nevez al lanv',
+        'new_feed_url_hint' => 'Implijit ar vaezienn-mañ pa cheñchit anv domani pe savenn herberc\'hiañ ho podkast. M\'eo enporzhiet ar podkast e vez lakaet enni URL a-vremañ al lanv dre ziouer.',
+        'old_feed_url' => 'URL kozh al lanv',
+        'update_feed' => 'Hizivaat al lanv',
+        'update_feed_tip' => 'Enporzhiañ rannoù diwezhañ ar podkast-mañ',
+        'partnership' => 'Kevelerezh',
         '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',
+        'partner_link_url' => 'Ere URL',
+        'partner_image_url' => 'URL ar skeudenn',
+        'partner_id_hint' => 'Hoc’h ID deoc\'h-c\'hwi e ti ar c\'heveler',
+        'partner_link_url_hint' => 'Chomlec\'h generek an ereoù gant ar c\'heveler',
+        'partner_image_url_hint' => 'Chomlec\'h generek ar skeudennoù gant ar c\'heveler',
+        'status_section_title' => 'Statud',
+        'block' => 'Ar podkast a rankfe bezañ kuzhet diouzh ar rolladoù publik',
         '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',
+            'Diskouez pe kuzhat ar podkast: trec\'haoliñ an afell-mañ a viro ar podkast a-bezh ouzh bezañ diskouezet war Apple Podcasts, Google Podcasts pe savennoù all hag a implij ar renabloù-se. (N\'eus gwarant ebet)',
+        'complete' => 'Ne vo mui rannoù nevez gant ar podkast',
+        'lock' => 'Mirout ar podkast ouzh bezañ eilet',
         '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',
+            'Ar pal eo lavaret d\'ar savennoù all hag aotreet int da enporzhiañ al lanv-mañ pe get. "Ya" a dalv eo nac\'het an holl c\'houlennoù enporzhiañ.',
+        'submit_create' => 'Krouiñ ar podkast',
+        'submit_edit' => 'Enrollañ ar 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' => 'hep rummad',
+        'arts' => 'Arzoù',
+        'business' => 'Embregerezh',
+        'comedy' => 'Fentc\'hoari',
+        'education' => 'Deskadurezh',
+        'fiction' => 'Faltazi',
+        'government' => 'Gouarnamant',
+        'health_and_fitness' => 'Yec\'hed ha fitness',
+        'history' => 'Istor',
+        'kids_and_family' => 'Bugale ha familh',
+        'leisure' => 'Dudi',
+        'music' => 'Sonerezh',
+        'news' => 'Keleier',
+        'religion_and_spirituality' => 'Relijion ha speredelezh',
+        'science' => 'Skiant',
+        'society_and_culture' => 'Kevredigezh ha sevenadur',
+        'sports' => 'Sportoù',
+        'technology' => 'Teknologiezh',
+        'true_crime' => 'Teulioù an torfed',
+        'tv_and_film' => 'Skinwel ha filmoù',
+        'books' => 'Levrioù',
+        'design' => 'Ergrafañ',
+        'fashion_and_beauty' => 'Giz ha kened',
+        'food' => 'Boued',
+        'performing_arts' => 'Arzoù an arvest',
+        'visual_arts' => 'Arzoù ar gweled',
+        'careers' => 'Respetoù',
+        'entrepreneurship' => 'Antreprenerezh',
+        'investing' => 'Postadur',
+        'management' => 'Mererezh',
         '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' => 'Hep pal kenwerzhel',
+        'comedy_interviews' => 'Atersadennoù fentus',
+        'improv' => 'Primaozañ',
+        'stand_up' => 'Stand up',
+        'courses' => 'Kentelioù',
+        'how_to' => 'Tutorial',
+        'language_learning' => 'Deskiñ yezhoù',
+        'self_improvement' => 'Diorren hiniennel',
+        'comedy_fiction' => 'Fentc\'hoari faltaziek',
         'drama' => 'Drama',
-        'science_fiction' => 'Science Fiction',
-        'alternative_health' => 'Alternative Health',
+        'science_fiction' => 'Skiant-faltazi',
+        'alternative_health' => 'Yec\'hed all',
         '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',
+        'medicine' => 'Medisinerezh',
+        'mental_health' => 'Yec\'hed-spered',
+        'nutrition' => 'Magadurezh',
+        'sexuality' => 'Seksualegezh',
+        'education_for_kids' => 'Deskadurezh evit ar vugale',
+        'parenting' => 'Kerentelezh',
+        'pets_and_animals' => 'Loened-ti ha loened',
+        'stories_for_kids' => 'Marvailhoù evit ar vugale',
+        'animation_and_manga' => 'Tresadennoù bev ha Manga',
+        'automotive' => 'Kirri-tan',
+        'aviation' => 'Kirri-nij',
+        'crafts' => 'Artizanerezh',
+        'games' => 'C\'hoarioù',
+        'hobbies' => 'Dudioù',
+        'home_and_garden' => 'Ti ha jardin',
+        'video_games' => 'C\'hoarioù video',
+        'music_commentary' => 'Evezhiadenn sonerezh',
+        'music_history' => 'Istor ar sonerezh',
+        'music_interviews' => 'Atersadennoù sonerezh',
+        'business_news' => 'Keleier ekonomikel',
+        'daily_news' => 'Keleier pemdeziek',
+        'entertainment_news' => 'Keleier an diduamant',
+        'news_commentary' => 'Evezhiadenn ar c\'heleier',
+        'politics' => 'Politikerezh',
+        'sports_news' => 'Keleier sport',
+        'tech_news' => 'Keleier teknologiezh',
+        'buddhism' => 'Boudaegezh',
+        'christianity' => 'Kristeniezh',
+        'hinduism' => 'Hindouegezh',
         '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',
+        'judaism' => 'Yuzevegezh',
+        'religion' => 'Relijion',
+        'spirituality' => 'Speredelezh',
+        'astronomy' => 'Steredoniezh',
+        'chemistry' => 'Kimiezh',
+        'earth_sciences' => 'Skiantoù an douar',
+        'life_sciences' => 'Bevoniezh',
+        'mathematics' => 'Matematikoù',
+        'natural_sciences' => 'Skiantoù an natur',
+        'nature' => 'Natur',
+        'physics' => 'Fizik',
+        'social_sciences' => 'Skiantoù sokial',
+        'documentary' => 'Teulioù',
+        'personal_journals' => 'Deizlevr hiniennel',
+        'philosophy' => 'Prederouriezh',
+        'places_and_travel' => 'Lec\'hioù ha beajoù',
+        'relationships' => 'Darempredoù',
         'baseball' => 'Baseball',
-        'basketball' => 'Basketball',
-        'cricket' => 'Cricket',
-        'fantasy_sports' => 'Fantasy Sports',
-        'football' => 'Football',
+        'basketball' => 'Basket-ball',
+        'cricket' => 'Kriked',
+        'fantasy_sports' => 'Sportoù faltaziek',
+        'football' => 'Mell-droad',
         'golf' => 'Golf',
         'hockey' => 'Hockey',
-        'rugby' => 'Rugby',
+        'rugby' => 'Rugbi',
         'running' => 'Running',
         'soccer' => 'Soccer',
         'swimming' => 'Swimming',
@@ -303,5 +306,5 @@ return [
     'sponsor' => 'Sponsor',
     'funding_links' => 'Funding links for {podcastTitle}',
     'find_on' => 'Find {podcastTitle} on',
-    'listen_on' => 'Listen on',
+    'listen_on' => 'Selaouit war',
 ];
diff --git a/modules/Admin/Language/br/PodcastImport.php b/modules/Admin/Language/br/PodcastImport.php
index 7c3ef67d1f998b7f3d7e5d658d2ae7b99851f4f5..7ba8d90984be90772b9ec65a1389a8b58a58ea45 100644
--- a/modules/Admin/Language/br/PodcastImport.php
+++ b/modules/Admin/Language/br/PodcastImport.php
@@ -14,10 +14,10 @@ return [
     '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' => 'URL al lanv',
     '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',
+    'new_podcast_section_title' => 'Ar podkast nevez',
+    'advanced_params_section_title' => 'Arventennoù kempleshoc\'h',
     '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',
@@ -26,12 +26,12 @@ return [
     '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' => 'Niverenn ar c\'houlzad',
     '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',
+    'submit' => 'Enporzhiañ ar podkast',
 ];
diff --git a/modules/Admin/Language/br/PodcastNavigation.php b/modules/Admin/Language/br/PodcastNavigation.php
index b619573154735a9370f5c222b74bf39acc09c8c8..56c575789d53f079e3b8e3c31a9690611bb38388 100644
--- a/modules/Admin/Language/br/PodcastNavigation.php
+++ b/modules/Admin/Language/br/PodcastNavigation.php
@@ -9,27 +9,27 @@ declare(strict_types=1);
  */
 
 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',
+    'go_to_page' => 'Mont da pajenn ar podkast',
+    'dashboard' => 'Taolenn-stur ar podkast',
+    'podcast-view' => 'Degemer',
+    'podcast-edit' => 'Kemmañ ar podkast',
+    'podcast-persons-manage' => 'Merañ an emellerien·ezed',
+    'episodes' => 'Rannoù',
+    'episode-list' => 'An holl rannoù',
+    'episode-create' => 'Rann nevez',
+    'analytics' => 'Muzulioù heklev',
     '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',
-    'contributors' => 'Contributors',
-    'contributor-list' => 'All contributors',
-    'contributor-add' => 'Add contributor',
-    'platforms' => 'External platforms',
-    'platforms-podcasting' => 'Podcasting',
-    'platforms-social' => 'Social networks',
-    'platforms-funding' => 'Funding',
+    'podcast-analytics-locations' => 'Lec\'hioù',
+    'podcast-analytics-unique-listeners' => 'Selaouerien·ezed unel',
+    'podcast-analytics-players' => 'Lennerioù',
+    'podcast-analytics-listening-time' => 'Padelezh ar selaou',
+    'podcast-analytics-time-periods' => 'Mareoù ar selaou',
+    'contributors' => 'Perzhidi, perzhiadezed',
+    'contributor-list' => 'An holl berzhidi ha perzhiadezed',
+    'contributor-add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez',
+    'platforms' => 'Savennoù diavaez',
+    'platforms-podcasting' => 'Podkast',
+    'platforms-social' => 'Rouedadoù sokial',
+    'platforms-funding' => 'Arc\'hantaouiñ',
 ];
diff --git a/modules/Admin/Language/br/Settings.php b/modules/Admin/Language/br/Settings.php
index 345976be7f307ddd34bb7b3cf1d5a95d62935e6e..10c855bf4846359535cb146b9c78c829e32af763 100644
--- a/modules/Admin/Language/br/Settings.php
+++ b/modules/Admin/Language/br/Settings.php
@@ -9,21 +9,21 @@ declare(strict_types=1);
  */
 
 return [
-    'title' => 'General settings',
+    'title' => 'Arventennoù hollek',
     'instance' => [
-        'title' => 'Instance',
-        'site_icon' => 'Site icon',
-        'site_icon_delete' => 'Delete site icon',
+        'title' => 'Istañs',
+        'site_icon' => 'Arlun al lec\'hienn',
+        'site_icon_delete' => 'Dilemel arlun al lec\'hienn',
         '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',
+        'site_icon_helper' => 'An arlun a rankfe bezañ ur c\'harrez ha 512px e vent da nebeutañ.',
+        'site_name' => 'Titl al lec\'hienn',
+        'site_description' => 'Deskrivadur al lec\'hienn',
+        'submit' => 'Enrollañ',
         'editSuccess' => 'Instance has been updated successfully!',
         'deleteIconSuccess' => 'Site icon has been remove successfully!',
     ],
     'images' => [
-        'title' => 'Images',
+        'title' => 'Skeudennoù',
         '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!',
@@ -41,8 +41,8 @@ return [
         'runSuccess' => 'Housekeeping has been run successfully!',
     ],
     'theme' => [
-        'title' => 'Theme',
-        'accent_section_title' => 'Accent color',
+        'title' => 'Neuz',
+        'accent_section_title' => 'Liv kentañ',
         'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.',
         'pine' => 'Pine',
         'crimson' => 'Crimson',
@@ -50,7 +50,7 @@ return [
         'lake' => 'Lake',
         'jacaranda' => 'Jacaranda',
         'onyx' => 'Onyx',
-        'submit' => 'Save',
-        'setInstanceThemeSuccess' => 'Theme has been updated successfully!',
+        'submit' => 'Enrollañ',
+        'setInstanceThemeSuccess' => 'Cheñchet eo bet an neuz gant berzh!',
     ],
 ];
diff --git a/modules/Admin/Language/br/Soundbite.php b/modules/Admin/Language/br/Soundbite.php
index a3f828fe09fa68f902251e7438bb54a2727ac8cb..85d3ce584aa334d21ca0bd7b689fb0b29b662268 100644
--- a/modules/Admin/Language/br/Soundbite.php
+++ b/modules/Admin/Language/br/Soundbite.php
@@ -10,22 +10,22 @@ declare(strict_types=1);
 
 return [
     'list' => [
-        'title' => 'Soundbites',
-        'soundbite' => 'Soundbite',
+        'title' => 'Tennadoù son',
+        'soundbite' => 'Tennad son',
     ],
     'messages' => [
-        'createSuccess' => 'Soundbite has been successfully created!',
-        'deleteSuccess' => 'Soundbite has been successfully removed!',
+        'createSuccess' => 'Krouet eo bet an tennad son gant berzh!',
+        'deleteSuccess' => 'Dilamet eo bet an tennad son gant berzh!',
     ],
     'form' => [
-        'title' => 'New soundbite',
-        'soundbite_title' => 'Soundbite title',
-        'start_time' => 'Start at',
-        'duration' => 'Duration',
-        'submit' => 'Create soundbite',
+        'title' => 'Tennad son nevez',
+        'soundbite_title' => 'Titl an tennad son',
+        'start_time' => 'Kregiñ da',
+        'duration' => 'Padelezh',
+        'submit' => 'Krouiñ an tennad son',
     ],
-    'play' => 'Play soundbite',
-    'stop' => 'Stop soundbite',
-    'create' => 'New soundbite',
-    'delete' => 'Delete soundbite',
+    'play' => 'Lenn an tennad son',
+    'stop' => 'Paouez an tennad son',
+    'create' => 'Tennad son nevez',
+    'delete' => 'Dilemel an tennad son',
 ];
diff --git a/modules/Admin/Language/br/User.php b/modules/Admin/Language/br/User.php
index 8b2e478bf7b6c5d97364e6888e9724b8fa24188f..2684206f68a0bbb6eccceb575965952042f04440 100644
--- a/modules/Admin/Language/br/User.php
+++ b/modules/Admin/Language/br/User.php
@@ -9,29 +9,29 @@ declare(strict_types=1);
  */
 
 return [
-    'edit_roles' => "Edit {username}'s roles",
+    'edit_roles' => "Kemm rolloù {username}",
     'forcePassReset' => 'Force pass reset',
     'ban' => 'Ban',
     'unban' => 'Unban',
-    'delete' => 'Delete',
-    'create' => 'New user',
-    'view' => "{username}'s info",
-    'all_users' => 'All users',
+    'delete' => 'Dilemel',
+    'create' => 'Krouiñ un implijer·ez',
+    'view' => "Titouroù diwar-benn {username}",
+    'all_users' => 'An holl implijerien·ezed',
     'list' => [
-        'user' => 'User',
-        'roles' => 'Roles',
+        'user' => 'Implijer·ez',
+        'roles' => 'Rolloù',
         'banned' => 'Banned?',
     ],
     'form' => [
-        'email' => 'Email',
-        'username' => 'Username',
-        'password' => 'Password',
-        'new_password' => 'New Password',
-        'roles' => 'Roles',
-        'permissions' => 'Permissions',
-        'submit_create' => 'Create user',
-        'submit_edit' => 'Save',
-        'submit_password_change' => 'Change!',
+        'email' => 'Postel',
+        'username' => 'Anv implijer·ez',
+        'password' => 'Ger-tremen',
+        'new_password' => 'Ger-tremen nevez',
+        'roles' => 'Rolloù',
+        'permissions' => 'Aotreoù',
+        'submit_create' => 'Krouiñ an implijer·ez',
+        'submit_edit' => 'Enrollañ',
+        'submit_password_change' => 'Kemm!',
     ],
     'roles' => [
         'superadmin' => 'Super admin',
@@ -49,6 +49,6 @@ return [
             '{username} is a superadmin, one does not simply ban a superadmin…',
         'deleteSuperAdminError' =>
             '{username} is a superadmin, one does not simply delete a superadmin…',
-        'deleteSuccess' => '{username} has been deleted.',
+        'deleteSuccess' => 'Dilamet eo bet {username}.',
     ],
 ];
diff --git a/modules/Admin/Language/br/VideoClip.php b/modules/Admin/Language/br/VideoClip.php
index 638de697bba7f2c0fbc240dace9dd73bfeb77615..fa2adf21ae7355308ef196c2f4bb7578962dcf2d 100644
--- a/modules/Admin/Language/br/VideoClip.php
+++ b/modules/Admin/Language/br/VideoClip.php
@@ -10,29 +10,29 @@ declare(strict_types=1);
 
 return [
     'list' => [
-        'title' => 'Video clips',
+        'title' => 'Tennadoù video',
         'status' => [
-            'label' => 'Status',
-            'queued' => 'queued',
-            'queued_hint' => 'Clip is waiting to be processed.',
-            'pending' => 'pending',
+            'label' => 'Statud',
+            'queued' => 'el lost',
+            'queued_hint' => 'Emañ an tennad video el lost.',
+            'pending' => 'o c\'hortoz',
             'pending_hint' => 'Clip will be generated shortly.',
             'running' => 'running',
             'running_hint' => 'Clip is being generated.',
-            'failed' => 'failed',
+            'failed' => 'c\'hwitet',
             'failed_hint' => 'Clip could not be generated: script failure.',
             'passed' => 'passed',
             'passed_hint' => 'Clip was generated successfully!',
         ],
-        'clip' => 'Clip',
+        'clip' => 'Tennad',
         'duration' => 'Job duration',
     ],
     'title' => 'Video clip: {videoClipLabel}',
-    'download_clip' => 'Download clip',
-    'create' => 'New video clip',
-    'go_to_page' => 'Go to clip page',
+    'download_clip' => 'Pellgargañ an tennad',
+    'create' => 'Tennad video nevez',
+    'go_to_page' => 'Mont da pajenn an tennad',
     'retry' => 'Retry clip generation',
-    'delete' => 'Delete clip',
+    'delete' => 'Dilemel an tennad',
     'logs' => 'Job logs',
     'messages' => [
         'alreadyExistingError' => 'The video clip you are trying to create already exists!',
@@ -47,14 +47,14 @@ return [
     'form' => [
         'title' => 'New video clip',
         'params_section_title' => 'Video clip parameters',
-        'clip_title' => 'Clip title',
+        'clip_title' => 'Titl an tennad',
         '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',
+        'theme' => 'Dibab un neuz',
         'start_time' => 'Start at',
         'duration' => 'Duration',
         'trim_start' => 'Trim start',
@@ -62,11 +62,11 @@ return [
         'submit' => 'Create video clip',
     ],
     'requirements' => [
-        'title' => 'Missing requirements',
+        'title' => 'Mankout a ra binvioù',
         '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)',
+        'freetype' => 'Levraoueg Freetype evit GD',
+        'transcript' => 'Restr an treuzskrivadur (.srt)',
     ],
 ];
diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php
index 01449c4af3911afa7c1d692e9506fea9ccd3da8c..b54c9c8e390f5bc5ad2f6b72d890b543589ba137 100644
--- a/modules/Admin/Language/de/Breadcrumb.php
+++ b/modules/Admin/Language/de/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'Tonschnipsel',
     'video-clips' => 'Videoclips',
     'embed' => 'einbettbarer Spieler',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/de/Common.php b/modules/Admin/Language/de/Common.php
index a4447027500cc43a9609f78afbc591f451c558a2..f9b6a99cb612fb7ab5dcc240d7054c1c488dad6d 100644
--- a/modules/Admin/Language/de/Common.php
+++ b/modules/Admin/Language/de/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'Spielt',
     ],
     'size_limit' => 'Größenlimit: {0}.',
-    'choose_interact' => 'Mit welchem Podcast-Profil wollen Sie handeln',
+    'choose_interact' => 'Choose how to interact',
     'view' => 'View',
 ];
diff --git a/modules/Admin/Language/de/Dashboard.php b/modules/Admin/Language/de/Dashboard.php
index 7dc34ad8eb12d7e03b3b8532b1da21a3263892c5..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6 100644
--- a/modules/Admin/Language/de/Dashboard.php
+++ b/modules/Admin/Language/de/Dashboard.php
@@ -9,8 +9,8 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Adminübersicht',
-    'welcome_message' => 'Willkommen im Administrationsbereich!',
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
     'podcasts' => [
         'title' => 'Podcasts',
         'not_found' => 'No published podcast',
diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php
index 4ccb1d949e9d7ffcfc65e3d818cdbd8a4b9a5136..eaa881fd3810f0cfcca9ee9288ae253691d7284a 100644
--- a/modules/Admin/Language/de/Episode.php
+++ b/modules/Admin/Language/de/Episode.php
@@ -178,7 +178,7 @@ return [
     ],
     'unpublish_form' => [
         'disclaimer' =>
-            "Das Zurückziehen der Episode löscht alle damit verbundenen Beiträge und entfernt sie aus dem RSS-Feed des Podcasts.",
+            "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
         'understand' => 'Ich verstehe, ich möchte die Episode zurückziehen',
         'submit' => 'Zurückziehen',
     ],
diff --git a/modules/Admin/Language/de/Notifications.php b/modules/Admin/Language/de/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/de/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/el/Breadcrumb.php b/modules/Admin/Language/el/Breadcrumb.php
index c235a34f9742243c23fbce02b6ef588714b54747..cad9d1b4c14c6300621ec65502b9db606dcf13ed 100644
--- a/modules/Admin/Language/el/Breadcrumb.php
+++ b/modules/Admin/Language/el/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'ήχοι',
     'video-clips' => 'βίντεο κλιπς',
     'embed' => 'ενσωματώσιμος αναπαραγωγέας',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/el/Common.php b/modules/Admin/Language/el/Common.php
index 2ec4cac11d20eab20e8bb70fbccf92abb570f75a..13b75af434aa9319c73adba634b7100f45357dc5 100644
--- a/modules/Admin/Language/el/Common.php
+++ b/modules/Admin/Language/el/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'Αναπαράγεται',
     ],
     'size_limit' => 'Όριο μεγέθους: {0}.',
-    'choose_interact' => 'Επιλέξτε τον τρόπο αλληλεπίδρασης',
+    'choose_interact' => 'Choose how to interact',
     'view' => 'View',
 ];
diff --git a/modules/Admin/Language/el/Episode.php b/modules/Admin/Language/el/Episode.php
index 906b255bda49e47f824b43623c397b5371c66ac9..8dee5476aac6fbeae2dfc839e4477bbf34832b4e 100644
--- a/modules/Admin/Language/el/Episode.php
+++ b/modules/Admin/Language/el/Episode.php
@@ -178,7 +178,7 @@ return [
     ],
     'unpublish_form' => [
         'disclaimer' =>
-            "Η κατάργηση της δημοσίευσης του επεισοδίου θα διαγράψει όλες τις δημοσιεύσεις που σχετίζονται με αυτό και θα τις αφαιρέσει από τη ροή RSS του podcast.",
+            "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
         'understand' => 'Καταλαβαίνω, θέλω να αποδημοσιεύσει το επεισόδιο',
         'submit' => 'Αναίρεση δημοσίευσης',
     ],
diff --git a/modules/Admin/Language/el/Notifications.php b/modules/Admin/Language/el/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/el/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/es/Breadcrumb.php b/modules/Admin/Language/es/Breadcrumb.php
index ee7001fce077e1d888635463e824140121c7d70b..e06fe65784b6b18e1eaeba2303b4fb69d7381e61 100644
--- a/modules/Admin/Language/es/Breadcrumb.php
+++ b/modules/Admin/Language/es/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'fragmentos de sonido',
     'video-clips' => 'clips de vídeo',
     'embed' => 'reproductor embebido',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/es/Common.php b/modules/Admin/Language/es/Common.php
index 0502f776cb2cad8edfcd09c8d2c4421e201fe046..91d41dc1ca21bf3feecd137bd279d265bd835782 100644
--- a/modules/Admin/Language/es/Common.php
+++ b/modules/Admin/Language/es/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'Reproduciendo',
     ],
     'size_limit' => 'Límite de tamaño: {0}.',
-    'choose_interact' => 'Elige cómo interactuar',
+    'choose_interact' => 'Choose how to interact',
     'view' => 'View',
 ];
diff --git a/modules/Admin/Language/es/Episode.php b/modules/Admin/Language/es/Episode.php
index 7a15ab347efafedbbd5af3e90337a240453b9782..7c7c7047bdcf98cc608f743360a45b8a7f6d964b 100644
--- a/modules/Admin/Language/es/Episode.php
+++ b/modules/Admin/Language/es/Episode.php
@@ -178,7 +178,7 @@ return [
     ],
     'unpublish_form' => [
         'disclaimer' =>
-            "Al cancelar la publicación del episodio se eliminarán todos los mensajes asociados a él y se eliminarán del feed RSS del podcast.",
+            "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
         'understand' => 'Lo entiendo, quiero anular la publicación del episodio',
         'submit' => 'Anular publicación',
     ],
diff --git a/modules/Admin/Language/es/Notifications.php b/modules/Admin/Language/es/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/es/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/fa/Breadcrumb.php b/modules/Admin/Language/fa/Breadcrumb.php
index d9400ca786ad22820c4bda166f6f11e61a0cb199..24bece0140b8e7cbd6edf835d096f76a43f97e70 100644
--- a/modules/Admin/Language/fa/Breadcrumb.php
+++ b/modules/Admin/Language/fa/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/fa/Notifications.php b/modules/Admin/Language/fa/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/fa/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php
index 814b02c0ede4dffe2a006850de8f5cd7126b14cb..126727275c0b415ef1c02bdb0ad53e30fae0da01 100644
--- a/modules/Admin/Language/fr/Breadcrumb.php
+++ b/modules/Admin/Language/fr/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'extraits sonores',
     'video-clips' => 'extraits vidéo',
     'embed' => 'lecteur intégré',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/fr/Common.php b/modules/Admin/Language/fr/Common.php
index 0a12d861d511d301a1d631259bf2c57addbe786e..f66f2a29530d0a9d82c0c8f1fcf6c0884bcefb03 100644
--- a/modules/Admin/Language/fr/Common.php
+++ b/modules/Admin/Language/fr/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'En cours',
     ],
     'size_limit' => 'Taille maximale : {0}.',
-    'choose_interact' => 'Choisissez comment interagir',
-    'view' => 'Voir',
+    'choose_interact' => 'Choose how to interact',
+    'view' => 'View',
 ];
diff --git a/modules/Admin/Language/fr/Dashboard.php b/modules/Admin/Language/fr/Dashboard.php
index c47c901bbe67a9b745544bfe2865db15f04f0699..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6 100644
--- a/modules/Admin/Language/fr/Dashboard.php
+++ b/modules/Admin/Language/fr/Dashboard.php
@@ -9,8 +9,8 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Tableau de bord',
-    'welcome_message' => 'Bienvenue dans l’administration !',
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
     'podcasts' => [
         'title' => 'Podcasts',
         'not_found' => 'No published podcast',
diff --git a/modules/Admin/Language/fr/Episode.php b/modules/Admin/Language/fr/Episode.php
index d74545a10d45741a8e72e310ebc32083373732a8..a65e0234204b052a94efe608f276bc65617d5a70 100644
--- a/modules/Admin/Language/fr/Episode.php
+++ b/modules/Admin/Language/fr/Episode.php
@@ -178,7 +178,7 @@ return [
     ],
     'unpublish_form' => [
         'disclaimer' =>
-            "Dépublier l’épisode supprimera toutes les publications qui lui sont associées et le retirera du flux RSS du podcast.",
+            "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
         'understand' => 'Je comprends, je veux dépublier l’épisode',
         'submit' => 'Dépublier',
     ],
diff --git a/modules/Admin/Language/fr/Notifications.php b/modules/Admin/Language/fr/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/fr/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/gd/Breadcrumb.php b/modules/Admin/Language/gd/Breadcrumb.php
index d9400ca786ad22820c4bda166f6f11e61a0cb199..24bece0140b8e7cbd6edf835d096f76a43f97e70 100644
--- a/modules/Admin/Language/gd/Breadcrumb.php
+++ b/modules/Admin/Language/gd/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/gd/Notifications.php b/modules/Admin/Language/gd/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/gd/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php
new file mode 100644
index 0000000000000000000000000000000000000000..93ead034bf7f0a5a593c990ce70570df91b9a61b
--- /dev/null
+++ b/modules/Admin/Language/gl/Breadcrumb.php
@@ -0,0 +1,49 @@
+<?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 => 'Inicio',
+    'podcasts' => 'podcasts',
+    'episodes' => 'episodios',
+    'contributors' => 'contribúen',
+    'pages' => 'páxinas',
+    'settings' => 'axustes',
+    'theme' => 'decorado',
+    'add' => 'engadir',
+    'new' => 'novo',
+    'edit' => 'editar',
+    'persons' => 'persoas',
+    'publish' => 'publicar',
+    'publish-edit' => 'editar publicación',
+    'unpublish' => 'retirar publicación',
+    'delete' => 'eliminar',
+    'fediverse' => 'fediverso',
+    'block-lists' => 'listas de bloqueo',
+    'users' => 'usuarias',
+    'my-account' => 'a miña conta',
+    'change-password' => 'cambiar contrasinal',
+    'import' => 'importar fonte',
+    'platforms' => 'plataformas',
+    'social' => 'redes sociais',
+    'funding' => 'financiamento',
+    'analytics' => 'análise',
+    'locations' => 'localizacións',
+    'webpages' => 'páxinas web',
+    'unique-listeners' => 'oíntes únicos',
+    'players' => 'reprodutores',
+    'listening-time' => 'tempo de escoita',
+    'time-periods' => 'período de tempo',
+    'soundbites' => 'soundbites',
+    'video-clips' => 'clips de vídeo',
+    'embed' => 'reprodutor para incluír',
+    'notifications' => 'notifications',
+];
diff --git a/modules/Admin/Language/gl/Charts.php b/modules/Admin/Language/gl/Charts.php
new file mode 100644
index 0000000000000000000000000000000000000000..edd2f8af1fb68333d38f77eb3f821053c9528a2a
--- /dev/null
+++ b/modules/Admin/Language/gl/Charts.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 [
+    'by_service_weekly' => 'Descargas do episodio por servizo (na última semana)',
+    'by_player_weekly' => 'Descargas do episodio por reprodutor (na última semana)',
+    'by_player_yearly' => 'Descargas do episodio por reprodutor (no último ano)',
+    'by_device_weekly' => 'Descargas do episodio por dispositivo (na última semana)',
+    'by_os_weekly' => 'Descargas do episodio por SO (na última semana)',
+    'podcast_by_region' => 'Descargas do episodio por rexión (na última semana)',
+    'unique_daily_listeners' => 'Oíntes únicas diarias',
+    'unique_monthly_listeners' => 'Oíntes únicas mensuais',
+    'by_browser' => 'Uso de páxinas web por navegador (na última semana)',
+    'podcast_by_day' => 'Descargas diarias do episodio',
+    'podcast_by_month' => 'Descargas mensuais do episodio',
+    'episode_by_day' => 'Descargas diarias do episodio (primeiros 60 días)',
+    'episode_by_month' => 'Descargas mensuais do episodio',
+    'episodes_by_day' =>
+        'Descargas dos últimos 5 episodios (durante os primeiros 60 días)',
+    'by_country_weekly' => 'Descargas do episodio por país (na última semana)',
+    'by_country_yearly' => 'Descargas de episodio por país (no último ano)',
+    'by_domain_weekly' => 'Visitas a páxinas web por orixe (na última semana)',
+    'by_domain_yearly' => 'Visitas a páxinas web por orixe (no último ano)',
+    'by_entry_page' => 'Visitas a páxinas we por páxina de entrada (na última semana)',
+    'podcast_bots' => 'Bots (rastrexadores)',
+    'daily_listening_time' => 'Tempo de escoita acumulado diario',
+    'monthly_listening_time' => 'Tempo de escoita acumulado mensual',
+    'by_weekday' => 'Por día da semana (nos últimos 60 días)',
+    'by_hour' => 'Por hora do día (nos últimos 60 días)',
+    '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)',
+];
diff --git a/modules/Admin/Language/gl/Common.php b/modules/Admin/Language/gl/Common.php
new file mode 100644
index 0000000000000000000000000000000000000000..66a6f8d2d762884cc6f10efbfeb615c936f37007
--- /dev/null
+++ b/modules/Admin/Language/gl/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' => 'Si',
+    'no' => 'Non',
+    'cancel' => 'Cancelar',
+    'optional' => 'Optativo',
+    'more' => 'Máis',
+    'no_data' => 'Non se atopan datos!',
+    'close' => 'Pechar',
+    'edit' => 'Editar',
+    'copy' => 'Copiar',
+    'copied' => 'Copiado!',
+    'home' => 'Inicio',
+    'explicit' => 'Explícito',
+    'powered_by' => 'Grazas a {castopod}',
+    'actions' => 'Accións',
+    'pageInfo' => 'Páxina {currentPage} de {pageCount}',
+    'go_back' => 'Volver',
+    'forms' => [
+        'editor' => [
+            'write' => 'Escribir',
+            'preview' => 'Vista previa',
+            'help' => 'Con soporte markdown',
+        ],
+        'multiSelect' => [
+            'selectText' => 'Preme para seleccionar',
+            'loadingText' => 'Cargando…',
+            'noResultsText' => 'Non se atoparon resultados',
+            'noChoicesText' => 'Non hai opcións para elexir',
+            'maxItemText' => 'Non podes engadir máis elementos',
+        ],
+        'upload_file' => 'Subir un ficheiro',
+        'remote_url' => 'URL remoto',
+    ],
+    'play_episode_button' => [
+        'play' => 'Reproducir',
+        'playing' => 'Reproducindo',
+    ],
+    'size_limit' => 'Límite do tamaño: {0}.',
+    'choose_interact' => 'Elixe como interactuar',
+    'view' => 'Ver',
+];
diff --git a/modules/Admin/Language/gl/Contributor.php b/modules/Admin/Language/gl/Contributor.php
new file mode 100644
index 0000000000000000000000000000000000000000..a09021cde7de7273c6b256609e91d4aabc6aea3c
--- /dev/null
+++ b/modules/Admin/Language/gl/Contributor.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 [
+    'podcast_contributors' => 'Contribúen ao podcast',
+    'view' => "Contribución de {username} a {podcastTitle}",
+    'add' => 'Engadir colaboración',
+    'add_contributor' => 'Engadir unha colaboración a {0}',
+    'edit_role' => 'Actualizar rol de {0}',
+    'edit' => 'Editar',
+    'remove' => 'Eliminar',
+    'list' => [
+        'username' => 'Identificador',
+        'role' => 'Rol',
+    ],
+    'form' => [
+        'user' => 'Usuaria',
+        'user_placeholder' => 'Elixe unha usuaria…',
+        'role' => 'Rol',
+        'role_placeholder' => 'Elixe o seu rol…',
+        'submit_add' => 'Engadir colaboración',
+        'submit_edit' => 'Actualizar rol',
+    ],
+    'roles' => [
+        'podcast_admin' => 'Admin podcast',
+    ],
+    'messages' => [
+        'removeOwnerError' => "Non podes eliminar a propietaria do podcast!",
+        'removeSuccess' =>
+            'Quitaches correctamente a {username} de {podcastTitle}',
+        'alreadyAddedError' =>
+            "A colaboradora que intentas engadir xa está engadida!",
+    ],
+];
diff --git a/modules/Admin/Language/gl/Countries.php b/modules/Admin/Language/gl/Countries.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf34b15ff5b2ca190e3997b6dd315f4d572f92f7
--- /dev/null
+++ b/modules/Admin/Language/gl/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' => 'Brasil',
+    'BS' => 'Bahamas',
+    'BT' => 'Bután',
+    'BV' => 'Illa Bouvet',
+    'BW' => 'Botswana',
+    'BY' => 'Bielorrusia',
+    'BZ' => 'Belice',
+    'CA' => 'Canadá',
+    'CC' => 'Illas Cocos (Keeling)',
+    'CD' => 'Congo, República Democrática do',
+    'CF' => 'República Centro Africana',
+    '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' => 'Chipre',
+    'CZ' => 'República Checa',
+    'DE' => 'Alemaña',
+    'DJ' => 'Djibuti',
+    'DK' => 'Dinamarca',
+    'DM' => 'Dominica',
+    'DO' => 'República Dominicana',
+    'DZ' => 'Alxeria',
+    'EC' => 'Ecuador',
+    'EE' => 'Estonia',
+    'EG' => 'Exipto',
+    'EH' => 'O Sáhara Occidental',
+    'ER' => 'Eritrea',
+    'ES' => 'España',
+    'ET' => 'Etiopía',
+    'FI' => 'Finlandia',
+    'FJ' => 'Fidji',
+    'FK' => 'Illas Malvinas',
+    'FM' => 'Estados Federados da Micronesia',
+    'FO' => 'Illas Feroe',
+    'FR' => 'Francia',
+    'GA' => 'Gabón',
+    'GB' => 'Reino Unido',
+    'GD' => 'Granada',
+    'GE' => 'Xeorxia',
+    'GF' => 'Güiana Francesa',
+    'GG' => 'Guernsey',
+    'GH' => 'Ghana',
+    'GI' => 'Xibraltar',
+    'GL' => 'Groenlandia',
+    'GM' => 'Gambia',
+    'GN' => 'Guinea',
+    'GP' => 'Guadalupe',
+    'GQ' => 'Guinea Ecuatorial',
+    'GR' => 'Grecia',
+    'GS' => 'Xeorxia do Sur e Islas Sandwich do Sur',
+    'GT' => 'Guatemala',
+    'GU' => 'Guam',
+    'GW' => 'Guinea-Bisau',
+    'GY' => 'Güiana',
+    'HK' => 'Hong Kong',
+    'HM' => 'Illas Heard e McDonald',
+    'HN' => 'Honduras',
+    'HR' => 'Croacia',
+    'HT' => 'Haití',
+    'HU' => 'Hungría',
+    'ID' => 'Indonesia',
+    'IE' => 'Irlanda',
+    'IL' => 'Israel',
+    'IM' => 'Illa de 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' => 'Maldivas',
+    'MW' => 'Malaui',
+    'MX' => 'México',
+    'MY' => 'Malaisia',
+    'MZ' => 'Mozambique',
+    'N/A' => 'Sen correspondencia (IP local…)',
+    'NA' => 'Namibia',
+    'NC' => 'Nova Caledonia',
+    'NE' => 'Níxer',
+    'NF' => 'Illa Norfolk',
+    'NG' => 'Nixeria',
+    'NI' => 'Nicaragua',
+    'NL' => 'Países Baixos',
+    'NO' => 'Noruega',
+    'NP' => 'Nepal',
+    'NR' => 'Nauru',
+    'NU' => 'Niue',
+    'NZ' => 'Nova Zelandia',
+    'OM' => 'Omán',
+    'PA' => 'Panamá',
+    'PE' => 'Perú',
+    'PF' => 'Polinesia francesa',
+    'PG' => 'Papúa Nova Guinea',
+    'PH' => 'Filipinas',
+    'PK' => 'Paquistán',
+    'PL' => 'Polonia',
+    'PM' => 'San Pedro e Miguelón',
+    'PN' => 'Pitcairn',
+    'PR' => 'Porto Rico',
+    'PS' => 'Estado de Palestina',
+    'PT' => 'Portugal',
+    'PW' => 'Palau',
+    'PY' => 'Paraguai',
+    'QA' => 'Catar',
+    'RE' => 'Reunión',
+    'RO' => 'Romanía',
+    'RS' => 'Serbia',
+    'RU' => 'Federación Rusa',
+    'RW' => 'Ruanda',
+    'SA' => 'Arabia Saudita',
+    'SB' => 'Illas Salomón',
+    'SC' => 'Seixeles',
+    'SD' => 'Sudán',
+    'SE' => 'Suecia',
+    'SG' => 'Singapur',
+    'SH' => 'Santa Helena, Ascensión e Tristán da Cunha',
+    'SI' => 'Eslovenia',
+    'SJ' => 'Svalbard e Jan Mayen',
+    'SK' => 'Eslovaquia',
+    'SL' => 'Serra Leoa',
+    '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/gl/Dashboard.php b/modules/Admin/Language/gl/Dashboard.php
new file mode 100644
index 0000000000000000000000000000000000000000..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6
--- /dev/null
+++ b/modules/Admin/Language/gl/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/gl/Episode.php b/modules/Admin/Language/gl/Episode.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfc6647af5334695874bccb01ae497bc8e72a2ec
--- /dev/null
+++ b/modules/Admin/Language/gl/Episode.php
@@ -0,0 +1,202 @@
+<?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' => 'Tempada {seasonNumber} episodio {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# comentario}
+        other {# comentarios}
+    }',
+    'all_podcast_episodes' => 'Tódolos episodios do podcast',
+    'back_to_podcast' => 'Volver ao podcast',
+    'edit' => 'Editar',
+    'publish' => 'Publicar',
+    'publish_edit' => 'Editar publicación',
+    'unpublish' => 'Retirar publicación',
+    'publish_error' => 'O episodio xa está publicado.',
+    'publish_edit_error' => 'O episodio xa está publicado.',
+    'publish_cancel_error' => 'O episodio xa está publicado.',
+    'unpublish_error' => 'O episodio non foi publicado.',
+    'delete' => 'Eliminar',
+    'go_to_page' => 'Ir á páxina',
+    'create' => 'Engadir un episodio',
+    'publication_status' => [
+        'published' => 'Publicado',
+        'with_podcast' => 'Publicado',
+        'scheduled' => 'Programado',
+        'not_published' => 'Sen publicar',
+    ],
+    'with_podcast_hint' => 'Para ser publicado ao mesmo tempo que o podcast',
+    'list' => [
+        'search' => [
+            'placeholder' => 'Buscar un episodio',
+            'clear' => 'Limpar busca',
+            'submit' => 'Buscar',
+        ],
+        'number_of_episodes' => '{numberOfEpisodes, plural,
+            one {# episodio}
+            other {# episodios}
+        }',
+        'episode' => 'Episodio',
+        'visibility' => 'Visibilidade',
+        'comments' => 'Comentarios',
+        'actions' => 'Accións',
+    ],
+    'messages' => [
+        'createSuccess' => 'Episodio creado correctamente!',
+        'editSuccess' => 'Episodio actualizado correctamente!',
+        'publishSuccess' => '{publication_status, select,
+            published {Episodio publicado correctamente!}
+            scheduled {Programación correcta para o episodio!}
+            with_podcast {Este episodio vaise publicar ao mesmo tempo que o podcast.}
+            other {Este episodio non foi publicado.}
+        }',
+        'publishCancelSuccess' => 'Cancelouse correctamente a publicación do episodio!',
+        'unpublishBeforeDeleteTip' => 'Tes que retirar a publicación do episodio antes de eliminalo.',
+        'scheduleDateError' => 'Debes establecer a data de publicación!',
+        'deletePublishedEpisodeError' => 'Retira a publicación do episodio antes de eliminalo.',
+        'deleteSuccess' => 'Episodio eliminado correctamente!',
+        'deleteError' => 'Fallou a eliminación {type, select,
+            transcript {da transcrición}
+            chapters {dos capítulos}
+            image {da imaxe}
+            audio {do audio}
+            other {do multimedia}
+        } do episodio.',
+        'deleteFileError' => 'Fallou a eliminación do ficheiro {type, select,
+            transcript {da transcrición}
+            chapters {dos capítulos}
+            image {da imaxe}
+            audio {do audio}
+            other {do multimedia}
+        } {file_path}. Deberías eliminala manualmente do disco.',
+        'sameSlugError' => 'Xa existe un episodio co id de url elexido.',
+    ],
+    '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' => 'Ficheiro de son',
+        'audio_file_hint' => 'Elixe un ficheiro .mp3 ou un .m4a de audio.',
+        'info_section_title' => 'Info do episodio',
+        'cover' => 'Portada do episodio',
+        'cover_hint' =>
+            'Se non estableces unha portada usarase a portada do podcast no seu lugar.',
+        'cover_size_hint' => 'A portada ten que ser cadrada e como mínimo de 1400px de alto e ancho.',
+        'title' => 'Título',
+        'title_hint' =>
+            'Debe conter un nome de episodio claro e conciso. Non indiques aquí a tempada ou número de episodio.',
+        'permalink' => 'Ligazón permanente',
+        'season_number' => 'Tempada',
+        'episode_number' => 'Episodio',
+        'type' => [
+            'label' => 'Tipo',
+            'full' => 'Completo',
+            'full_hint' => 'Contido completo (o episodio)',
+            'trailer' => 'Avance',
+            'trailer_hint' => 'Peza curta de carácter promocional que representa unha vista previa do programa actual',
+            'bonus' => 'Extra',
+            'bonus_hint' => 'Contido extra para o programa (por exemplo, info sobre a elaboración ou conversa casual cos participantes) ou contido promocional de outras creadoras',
+        ],
+        'parental_advisory' => [
+            'label' => 'Aviso sobre o contido',
+            'hint' => 'Contén o episodio elementos explícitos?',
+            'undefined' => 'non definido',
+            'clean' => 'Limpo',
+            'explicit' => 'Explícito',
+        ],
+        'show_notes_section_title' => 'Mostrar notas',
+        'show_notes_section_subtitle' =>
+            'Ata 4000 caracteres, mantén a concisión e claridade. As notas do episodio axudan a que pontenciais oíntes atopen o programa.',
+        'description' => 'Descrición',
+        'description_footer' => 'Nota ao pé descritiva',
+        'description_footer_hint' =>
+            'Este texto engádese ao final da descrición de cada episodio, é un bo lugar para engadir por exemplo ligazóns a medios sociais.',
+        'additional_files_section_title' => 'Ficheiros adicionais',
+        'additional_files_section_subtitle' =>
+            'Estos ficheiros poden ser usados por outras plataformas para proporcionar unha mellor experiencia para a túa audiencia. Mira {podcastNamespaceLink} para máis información.',
+        'location_section_title' => 'Localización',
+        'location_section_subtitle' => 'De qué lugar trata o episodio?',
+        'location_name' => 'Nome da localización e enderezo',
+        'location_name_hint' => 'Pode ser unha localización real ou ficticia',
+        'transcript' => 'Transcrición (subtítulos / texto descritivo)',
+        'transcript_hint' => 'Só admite .srt',
+        'transcript_download' => 'Descargar transcrición',
+        'transcript_file' => 'Fichero da transcrición (.srt)',
+        'transcript_remote_url' => 'URL remoto da transcrición',
+        'transcript_file_delete' => 'Eliminar ficheiro coa transcrición',
+        'chapters' => 'Capítulos',
+        'chapters_hint' => 'O ficheiro ten que estar no formato JSON de Capítulos.',
+        'chapters_download' => 'Descargar capítulos',
+        'chapters_file' => 'Ficheiro de capítulos',
+        'chapters_remote_url' => 'URL remoto para ficheiro de capítulos',
+        'chapters_file_delete' => 'Eliminar ficheiro de capítulos',
+        'advanced_section_title' => 'Parámetros Avanzados',
+        'advanced_section_subtitle' =>
+            'Se precisas etiquetas RSS que Castopod non xestiona, establéceas aquí.',
+        'custom_rss' => 'Etiquetas RSS personalizadas para o episodio',
+        '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',
+    ],
+    '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/gl/EpisodeNavigation.php b/modules/Admin/Language/gl/EpisodeNavigation.php
new file mode 100644
index 0000000000000000000000000000000000000000..1406e3010ef4383a6d8ef32ff88497e7bdeb9fa4
--- /dev/null
+++ b/modules/Admin/Language/gl/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/gl/Fediverse.php b/modules/Admin/Language/gl/Fediverse.php
new file mode 100644
index 0000000000000000000000000000000000000000..9eecfa2af34c2c93515deb174e787ab1dc91af17
--- /dev/null
+++ b/modules/Admin/Language/gl/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} foi bloqueado!',
+        'unblockDomainSuccess' => '{domain} foi desbloqueado!',
+    ],
+    'blocked_actors' => 'Contas bloqueadas',
+    'blocked_domains' => 'Dominios bloqueados',
+    'block_lists_form' => [
+        'handle' => 'Alcume da conta',
+        'handle_hint' => 'Escribe a conta @usuaria@dominio.',
+        'domain' => 'Nome de dominio',
+        'submit' => 'Bloqueo!',
+    ],
+    'list' => [
+        'actor' => 'Conta',
+        'domain' => 'Nome de dominio',
+        'unblock' => 'Desbloquear',
+    ],
+];
diff --git a/modules/Admin/Language/gl/Home.php b/modules/Admin/Language/gl/Home.php
new file mode 100644
index 0000000000000000000000000000000000000000..29edd1c7eded604af16b4320d65f16f730fb1466
--- /dev/null
+++ b/modules/Admin/Language/gl/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' => 'Tódolos podcast',
+    'no_podcast' => 'Non se atopan podcast',
+];
diff --git a/modules/Admin/Language/gl/Install.php b/modules/Admin/Language/gl/Install.php
new file mode 100644
index 0000000000000000000000000000000000000000..d96f923028cad43fc9aa7d8d0f3fb27a85f47d3d
--- /dev/null
+++ b/modules/Admin/Language/gl/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' => 'Configuración manual',
+    'manual_config_subtitle' =>
+        'Crear un ficheiro `.env` cos teus axustes e actualizar a páxina para continuar coa instalación.',
+    'form' => [
+        'instance_config' => 'Configuración da instancia',
+        'hostname' => 'Servidor',
+        'media_base_url' => 'URL base do multimedia',
+        'media_base_url_hint' =>
+            'Se usas unha CDN e/ou un servizo externo de análise, debes indicalo aquí.',
+        'admin_gateway' => 'Pasarela de administración',
+        'admin_gateway_hint' =>
+            'A ruta para acceder á área de administración (ex. https://exemplo.com/cp-admin). Por defecto establécese cp-admin, recomendámosche cambialo por razóns de seguridade.',
+        'auth_gateway' => 'Pasarela de autenticación',
+        'auth_gateway_hint' =>
+            'A ruta para acceder á páxina de autenticación (ex. https://exemplo.com/cp-auth). Por defecto establécese como cp-auth, pero recomendámosche cambialo por razóns de seguridade.',
+        'database_config' => 'Configuración da base de datos',
+        '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/gl/MyAccount.php b/modules/Admin/Language/gl/MyAccount.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ebbb30ef70a5e3e86a9bab867f7c732ce79db26
--- /dev/null
+++ b/modules/Admin/Language/gl/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/Admin/Language/gl/Navigation.php b/modules/Admin/Language/gl/Navigation.php
new file mode 100644
index 0000000000000000000000000000000000000000..68d4609d5d94a5770f237ee23207ad47d1262c70
--- /dev/null
+++ b/modules/Admin/Language/gl/Navigation.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 [
+    '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',
+    'account' => [
+        'my-account' => 'My account',
+        'change-password' => 'Change password',
+        'logout' => 'Logout',
+    ],
+];
diff --git a/modules/Admin/Language/gl/Notifications.php b/modules/Admin/Language/gl/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/gl/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/gl/Page.php b/modules/Admin/Language/gl/Page.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6f49de57496ec4830246641f0bf8897e7c9a2f9
--- /dev/null
+++ b/modules/Admin/Language/gl/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/gl/Pager.php b/modules/Admin/Language/gl/Pager.php
new file mode 100644
index 0000000000000000000000000000000000000000..e25ee638108dba1e0bfa602b45969381dd8ebd57
--- /dev/null
+++ b/modules/Admin/Language/gl/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/gl/Person.php b/modules/Admin/Language/gl/Person.php
new file mode 100644
index 0000000000000000000000000000000000000000..a652be9fda1f4aeb73bcb01c35f13a452a6d4741
--- /dev/null
+++ b/modules/Admin/Language/gl/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/gl/Platforms.php b/modules/Admin/Language/gl/Platforms.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab17d5999b1626535499464902c12f5c3bcb7aa8
--- /dev/null
+++ b/modules/Admin/Language/gl/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/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed83f7845d8d376da336df1163737193a154e01d
--- /dev/null
+++ b/modules/Admin/Language/gl/Podcast.php
@@ -0,0 +1,307 @@
+<?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' => 'Fallou a eliminación {type, select,
+            transcript {da transcrición}
+            chapters {dos capítulos}
+            image {da imaxe}
+            audio {do audio}
+            other {do multimedia}
+        } do episodio {episode_slug}.',
+        '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.',
+        '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/gl/PodcastImport.php b/modules/Admin/Language/gl/PodcastImport.php
new file mode 100644
index 0000000000000000000000000000000000000000..a52003344c93e7db67ad2f9ccf64e8aab612441e
--- /dev/null
+++ b/modules/Admin/Language/gl/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' => 'Campo a utilizar para crear o id de url para o episodio',
+    '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/gl/PodcastNavigation.php b/modules/Admin/Language/gl/PodcastNavigation.php
new file mode 100644
index 0000000000000000000000000000000000000000..b619573154735a9370f5c222b74bf39acc09c8c8
--- /dev/null
+++ b/modules/Admin/Language/gl/PodcastNavigation.php
@@ -0,0 +1,35 @@
+<?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',
+    '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/gl/Settings.php b/modules/Admin/Language/gl/Settings.php
new file mode 100644
index 0000000000000000000000000000000000000000..345976be7f307ddd34bb7b3cf1d5a95d62935e6e
--- /dev/null
+++ b/modules/Admin/Language/gl/Settings.php
@@ -0,0 +1,56 @@
+<?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, …)',
+        '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/gl/Soundbite.php b/modules/Admin/Language/gl/Soundbite.php
new file mode 100644
index 0000000000000000000000000000000000000000..a3f828fe09fa68f902251e7438bb54a2727ac8cb
--- /dev/null
+++ b/modules/Admin/Language/gl/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/gl/User.php b/modules/Admin/Language/gl/User.php
new file mode 100644
index 0000000000000000000000000000000000000000..86e03557ba79071a5faa3b6523ef5f4ef92ec860
--- /dev/null
+++ b/modules/Admin/Language/gl/User.php
@@ -0,0 +1,54 @@
+<?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_roles' => "Editar os roles de {username}",
+    'forcePassReset' => 'Forzar restablecemento do contrasinal',
+    'ban' => 'Vetar',
+    'unban' => 'Retirar veto',
+    'delete' => 'Eliminar',
+    'create' => 'Nova usuaria',
+    'view' => "Info de {username}",
+    'all_users' => 'Tódalas usuarias',
+    'list' => [
+        'user' => 'Usuaria',
+        'roles' => 'Roles',
+        'banned' => 'Vetada?',
+    ],
+    'form' => [
+        'email' => 'Email',
+        'username' => 'Identificador',
+        'password' => 'Contrasinal',
+        'new_password' => 'Novo contrasinal',
+        'roles' => 'Roles',
+        'permissions' => 'Permisos',
+        'submit_create' => 'Crear usuaria',
+        'submit_edit' => 'Gardar',
+        'submit_password_change' => 'Cambiar!',
+    ],
+    'roles' => [
+        'superadmin' => 'Super admin',
+    ],
+    'messages' => [
+        'createSuccess' =>
+            'Usuaria creada correctamente! Váiselle pedir a {username} que cambie o seu contrasinal após o primeiro acceso.',
+        'rolesEditSuccess' =>
+            "{username}'s roles have been successfully updated.",
+        'forcePassResetSuccess' =>
+            '{username} will be prompted with a password reset upon next visit.',
+        'banSuccess' => '{username} has been banned.',
+        'unbanSuccess' => '{username} has been unbanned.',
+        'banSuperAdminError' =>
+            '{username} is a superadmin, one does not simply ban a superadmin…',
+        'deleteSuperAdminError' =>
+            '{username} is a superadmin, one does not simply delete a superadmin…',
+        'deleteSuccess' => '{username} has been deleted.',
+    ],
+];
diff --git a/modules/Admin/Language/gl/Validation.php b/modules/Admin/Language/gl/Validation.php
new file mode 100644
index 0000000000000000000000000000000000000000..750b19688f973df85a6ebdc861745225b28d0c54
--- /dev/null
+++ b/modules/Admin/Language/gl/Validation.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 [
+    '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.',
+    'validate_url' =>
+        'The {field} field must be a valid URL (eg. https://example.com/).',
+];
diff --git a/modules/Admin/Language/gl/VideoClip.php b/modules/Admin/Language/gl/VideoClip.php
new file mode 100644
index 0000000000000000000000000000000000000000..638de697bba7f2c0fbc240dace9dd73bfeb77615
--- /dev/null
+++ b/modules/Admin/Language/gl/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/id/Breadcrumb.php b/modules/Admin/Language/id/Breadcrumb.php
index d9400ca786ad22820c4bda166f6f11e61a0cb199..24bece0140b8e7cbd6edf835d096f76a43f97e70 100644
--- a/modules/Admin/Language/id/Breadcrumb.php
+++ b/modules/Admin/Language/id/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/id/Notifications.php b/modules/Admin/Language/id/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/id/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/it/Breadcrumb.php b/modules/Admin/Language/it/Breadcrumb.php
index d9400ca786ad22820c4bda166f6f11e61a0cb199..24bece0140b8e7cbd6edf835d096f76a43f97e70 100644
--- a/modules/Admin/Language/it/Breadcrumb.php
+++ b/modules/Admin/Language/it/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/it/Notifications.php b/modules/Admin/Language/it/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/it/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php
index ecb81fc78fedf7dcdb7b42d652b70e34738a68a9..03d3b0aef1a8fb0693fe2912721014fbc020d58d 100644
--- a/modules/Admin/Language/nl/Breadcrumb.php
+++ b/modules/Admin/Language/nl/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'geluidsbeet',
     'video-clips' => 'video clips',
     'embed' => 'integreerbare speler',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/nl/Common.php b/modules/Admin/Language/nl/Common.php
index 73136f88a8c60868594ef2c9bf029e9b445a4387..96e45a8ae3b905c920f52a08f61316166c13088c 100644
--- a/modules/Admin/Language/nl/Common.php
+++ b/modules/Admin/Language/nl/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'Wordt afgespeeld',
     ],
     'size_limit' => 'Maximale grootte: {0}.',
-    'choose_interact' => 'Kies hoe de interactie moet worden',
+    'choose_interact' => 'Choose how to interact',
     'view' => 'View',
 ];
diff --git a/modules/Admin/Language/nl/Dashboard.php b/modules/Admin/Language/nl/Dashboard.php
index 024e87d9144a02e9153dfe435eb77deccace0f2a..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6 100644
--- a/modules/Admin/Language/nl/Dashboard.php
+++ b/modules/Admin/Language/nl/Dashboard.php
@@ -9,8 +9,8 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Beheerder overzicht',
-    'welcome_message' => 'Welkom bij de beheerder omgeving!',
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
     'podcasts' => [
         'title' => 'Podcasts',
         'not_found' => 'No published podcast',
diff --git a/modules/Admin/Language/nl/Notifications.php b/modules/Admin/Language/nl/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/nl/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php
index c7852453f635f6e6298d8ef6de082c23db0bd719..aed6277aafa6f092eba70c7dadf515459b7c0491 100644
--- a/modules/Admin/Language/nn-NO/Breadcrumb.php
+++ b/modules/Admin/Language/nn-NO/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'lydbetar',
     'video-clips' => 'videoklypp',
     'embed' => 'innbyggbar spelar',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/nn-NO/Common.php b/modules/Admin/Language/nn-NO/Common.php
index b4b301888fa3953b6ae96386f9590e7f0a619bf4..db095fd95f20deb2815147af11647459021c0919 100644
--- a/modules/Admin/Language/nn-NO/Common.php
+++ b/modules/Admin/Language/nn-NO/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'Spelar',
     ],
     'size_limit' => 'Maks storleik: {0}.',
-    'choose_interact' => 'Vel korleis du vil samhandla',
+    'choose_interact' => 'Choose how to interact',
     'view' => 'View',
 ];
diff --git a/modules/Admin/Language/nn-NO/Dashboard.php b/modules/Admin/Language/nn-NO/Dashboard.php
index 9a51d003cb5b60b5c0cda8e95770e3a3cdd807aa..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6 100644
--- a/modules/Admin/Language/nn-NO/Dashboard.php
+++ b/modules/Admin/Language/nn-NO/Dashboard.php
@@ -9,8 +9,8 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Styringspanel',
-    'welcome_message' => 'Velkomen til styrarområdet!',
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
     'podcasts' => [
         'title' => 'Podcasts',
         'not_found' => 'No published podcast',
diff --git a/modules/Admin/Language/nn-NO/Episode.php b/modules/Admin/Language/nn-NO/Episode.php
index 733eda6b6acaa14986b34b3dd824caf29217cfb0..c98495f0f898421751fee711f2e206086b3bd7a6 100644
--- a/modules/Admin/Language/nn-NO/Episode.php
+++ b/modules/Admin/Language/nn-NO/Episode.php
@@ -178,7 +178,7 @@ return [
     ],
     'unpublish_form' => [
         'disclaimer' =>
-            "Viss du avpubliserer episoden, vil alle innlegga som knytte til han bli sletta, og episoden vil bli fjerna frå RSS-straumen til podkasten.",
+            "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
         'understand' => 'Eg forstår, eg vil avpublisera episoden',
         'submit' => 'Avpubliser',
     ],
diff --git a/modules/Admin/Language/nn-NO/Notifications.php b/modules/Admin/Language/nn-NO/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/nn-NO/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/oc/Breadcrumb.php b/modules/Admin/Language/oc/Breadcrumb.php
index d9400ca786ad22820c4bda166f6f11e61a0cb199..24bece0140b8e7cbd6edf835d096f76a43f97e70 100644
--- a/modules/Admin/Language/oc/Breadcrumb.php
+++ b/modules/Admin/Language/oc/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/oc/Notifications.php b/modules/Admin/Language/oc/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/oc/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php
index 6ad15119c92a6210f4f368dded98666a796b11d9..0030fb60583bdbc88322dd5c12a742979b24dbaf 100644
--- a/modules/Admin/Language/pl/Breadcrumb.php
+++ b/modules/Admin/Language/pl/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'zajawki',
     'video-clips' => 'klipy wideo',
     'embed' => 'odtwarzacz do osadzenia',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/pl/Common.php b/modules/Admin/Language/pl/Common.php
index a2566c262a12fea57bb207e362a8b59c6ddd4316..183399eeec0713ba281a9b7bd71189d017b821f6 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' => 'Wybierz sposób interakcji',
+    'choose_interact' => 'Choose how to interact',
     'view' => 'View',
 ];
diff --git a/modules/Admin/Language/pl/Dashboard.php b/modules/Admin/Language/pl/Dashboard.php
index 7e2d2e079ccb45d59003f2f128867b0f2a01a018..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6 100644
--- a/modules/Admin/Language/pl/Dashboard.php
+++ b/modules/Admin/Language/pl/Dashboard.php
@@ -9,8 +9,8 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Pulpit administratora',
-    'welcome_message' => 'Witamy w panelu administracyjnym!',
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
     'podcasts' => [
         'title' => 'Podcasts',
         'not_found' => 'No published podcast',
diff --git a/modules/Admin/Language/pl/Episode.php b/modules/Admin/Language/pl/Episode.php
index f874e9febd143484fdea295a5a581d0488b46a1d..f82ccfdab8bf7844306774a7a79f08dd28a7b04a 100644
--- a/modules/Admin/Language/pl/Episode.php
+++ b/modules/Admin/Language/pl/Episode.php
@@ -179,7 +179,7 @@ return [
     ],
     'unpublish_form' => [
         'disclaimer' =>
-            "Cofnięcie publikacji odcinka spowoduje usunięcie wszystkich powiązanych z nim wpisów i usunięcie go z kanału RSS podcastu.",
+            "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
         'understand' => 'Rozumiem, chcę cofnąć publikację odcinka',
         'submit' => 'Cofnij publikacjÄ™',
     ],
diff --git a/modules/Admin/Language/pl/Notifications.php b/modules/Admin/Language/pl/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/pl/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-BR/Breadcrumb.php
index ea0d019c4056b0cd802313d878099c7a29949794..42c5e23c1cd35dfae65c8d52872f44f9c1b30c16 100644
--- a/modules/Admin/Language/pt-BR/Breadcrumb.php
+++ b/modules/Admin/Language/pt-BR/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'clipes de áudio',
     'video-clips' => 'clipes de vídeo',
     'embed' => 'player incorporável',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-BR/Episode.php
index 78eaa948980b7288c07c1d15664f8de8787f63ce..cd15c64b3db1d7393faaf44d7e088cfbfebd4ab7 100644
--- a/modules/Admin/Language/pt-BR/Episode.php
+++ b/modules/Admin/Language/pt-BR/Episode.php
@@ -178,7 +178,7 @@ return [
     ],
     'unpublish_form' => [
         'disclaimer' =>
-            "Despublicar do episódio irá apagar todas as publicações associadas a ele e removê-lo do feed RSS do podcast.",
+            "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.",
         'understand' => 'Eu entendo, eu quero despublicar o episódio',
         'submit' => 'Despublicar',
     ],
diff --git a/modules/Admin/Language/pt-BR/Notifications.php b/modules/Admin/Language/pt-BR/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/pt-BR/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/pt/Breadcrumb.php b/modules/Admin/Language/pt/Breadcrumb.php
index d9400ca786ad22820c4bda166f6f11e61a0cb199..24bece0140b8e7cbd6edf835d096f76a43f97e70 100644
--- a/modules/Admin/Language/pt/Breadcrumb.php
+++ b/modules/Admin/Language/pt/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/pt/Notifications.php b/modules/Admin/Language/pt/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/pt/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/ru/Breadcrumb.php b/modules/Admin/Language/ru/Breadcrumb.php
index 8f4438fff8ca3cb4299609a485bdf0101c308105..d0ad26ac4d35eae8430f9bb63a7bf140c5059108 100644
--- a/modules/Admin/Language/ru/Breadcrumb.php
+++ b/modules/Admin/Language/ru/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'звуковые фрагменты',
     'video-clips' => 'видео клипы',
     'embed' => 'встроенный плеер',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/ru/Common.php b/modules/Admin/Language/ru/Common.php
index 1805eb8fc06b132411ee496af11c29dc84dcb625..596c8bcdec3b75f5c94c63aa7acc35c36537ec9d 100644
--- a/modules/Admin/Language/ru/Common.php
+++ b/modules/Admin/Language/ru/Common.php
@@ -46,6 +46,6 @@ return [
         'playing' => 'Playing',
     ],
     'size_limit' => 'Size limit: {0}.',
-    'choose_interact' => 'Выберите как взаимодействовать',
+    'choose_interact' => 'Choose how to interact',
     'view' => 'View',
 ];
diff --git a/modules/Admin/Language/ru/Dashboard.php b/modules/Admin/Language/ru/Dashboard.php
index 8542f43e03d7a831aa2de1292e8e24b37bb262fd..881073fd26316b7d2eda7c52b73ccbfc2c4e76e6 100644
--- a/modules/Admin/Language/ru/Dashboard.php
+++ b/modules/Admin/Language/ru/Dashboard.php
@@ -9,8 +9,8 @@ declare(strict_types=1);
  */
 
 return [
-    'home' => 'Панель Администратора',
-    'welcome_message' => 'Добро пожаловать в панель администрирования!',
+    'home' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
     'podcasts' => [
         'title' => 'Podcasts',
         'not_found' => 'No published podcast',
diff --git a/modules/Admin/Language/ru/Notifications.php b/modules/Admin/Language/ru/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/ru/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php
index 03f9f35ec1541e601a3c15744745a2061509f4e0..e9a9b17d8b94aec724a250aa9b522cea41c07175 100644
--- a/modules/Admin/Language/sk/Breadcrumb.php
+++ b/modules/Admin/Language/sk/Breadcrumb.php
@@ -9,40 +9,41 @@ declare(strict_types=1);
  */
 
 return [
-    'label' => 'breadcrumb',
+    'label' => 'omrvinky',
     config('Admin')
-        ->gateway => 'Home',
-    'podcasts' => 'podcasts',
-    'episodes' => 'episodes',
-    'contributors' => 'contributors',
-    'pages' => 'pages',
-    'settings' => 'settings',
-    'theme' => 'theme',
+        ->gateway => 'Úvod',
+    'podcasts' => 'podcasty',
+    'episodes' => 'epizódy',
+    'contributors' => 'prispievatelia',
+    'pages' => 'stránky',
+    'settings' => 'nastavenia',
+    'theme' => 'vzhľad',
     'add' => 'pridať',
-    'new' => 'new',
+    'new' => 'pridať',
     'edit' => 'upraviť',
-    'persons' => 'persons',
+    'persons' => 'osobnosti',
     'publish' => 'zverejniť',
     'publish-edit' => 'upraviť zverejnené',
-    'unpublish' => 'unpublish',
+    'unpublish' => 'zrušiť zverejnenie',
     'delete' => 'vymazať',
     'fediverse' => 'fediverse',
-    'block-lists' => 'block lists',
-    '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',
+    'block-lists' => 'zoznamy blokovaných',
+    'users' => 'používatelia',
+    'my-account' => 'môj účet',
+    'change-password' => 'zmeniť heslo',
+    'import' => 'import kanála',
+    'platforms' => 'platformy',
+    'social' => 'sociálne siete',
+    'funding' => 'financovanie',
+    'analytics' => 'analytika',
+    'locations' => 'miesta',
+    'webpages' => 'web stránky',
+    'unique-listeners' => 'unikátni poslucháči',
+    'players' => 'prehrávače',
+    'listening-time' => 'čas počúvania',
+    'time-periods' => 'časové obdobia',
+    'soundbites' => 'zvukové ukážky',
+    'video-clips' => 'video klipy',
+    'embed' => 'vnorený',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/sk/Charts.php b/modules/Admin/Language/sk/Charts.php
index 4b33530ef007a6795739959c4553718f22f77941..b205c28677a7faecb3a88d11a60621fdf7efb3eb 100644
--- a/modules/Admin/Language/sk/Charts.php
+++ b/modules/Admin/Language/sk/Charts.php
@@ -9,32 +9,32 @@ 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' => 'Prevzatia epizód podľa služby (za uplynulý týždeň)',
+    'by_player_weekly' => 'Prevzatia epizód podľa prehrávača (za uplynulý týždeň)',
+    'by_player_yearly' => 'Prevzatia epizód podľa prehrávača (za uplynulý rok)',
+    'by_device_weekly' => 'Prevzatia epizód podľa zariadenia (za uplynulý týždeň)',
+    'by_os_weekly' => 'Prevzatia epizód podľa operačného systému (za uplynulý týždeň)',
+    'podcast_by_region' => 'Prevzatia epizód podľa regiónu (za uplynulý týždeň)',
+    'unique_daily_listeners' => 'Denný unikátny počet poslucháčov',
+    'unique_monthly_listeners' => 'Mesačný unikátny počet poslucháčov',
+    'by_browser' => 'Používanie web stránok podľa prehliadača (za uplynulý týždeň)',
+    'podcast_by_day' => 'Denné prevzatia epizód',
+    'podcast_by_month' => 'Mesačné prevzatia epizód',
+    'episode_by_day' => 'Denné prevzatia epizód (prvých 60 dní)',
+    'episode_by_month' => 'Mesačné prevzatia epizód',
     '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)',
+        '5 posledných prevzatí epizód (počas ich prvých 60 dní)',
+    'by_country_weekly' => 'Prevzatia epizód podľa krajiny (za uplynulý týždeň)',
+    'by_country_yearly' => 'Prevzatia epizód podľa krajiny (za uplynulý rok)',
+    'by_domain_weekly' => 'Návštevy web stránok podľa zdroja (za uplynulý týždeň)',
+    'by_domain_yearly' => 'Návštevy web stránok podľa zdroja (za uplynulý rok)',
+    'by_entry_page' => 'Návštevy web stránok podľa prichádzajúcej stránky (za uplynulý týždeň)',
+    'podcast_bots' => 'Roboti (crawlers)',
+    'daily_listening_time' => 'Súhrnný denný čas počúvania',
+    'monthly_listening_time' => 'Súhrnný mesačný čas počúvania',
+    'by_weekday' => 'Podľa dní v týždni (za uplynulých 60 dní)',
+    'by_hour' => 'Podľa denného času (Za uplynulých 60 dní)',
+    '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)',
 ];
diff --git a/modules/Admin/Language/sk/Common.php b/modules/Admin/Language/sk/Common.php
index f11a1ad4543148a2e5bd2b2b23bed86ff999f939..9572c953797826b7d29f3178c88c92fd37d4a398 100644
--- a/modules/Admin/Language/sk/Common.php
+++ b/modules/Admin/Language/sk/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!',
+    'yes' => 'Áno',
+    'no' => 'Nie',
+    'cancel' => 'Zrušiť',
+    'optional' => 'Nepovinné',
+    'more' => 'Viac',
+    'no_data' => 'Žiadne údaje!',
     'close' => 'Zavrieť',
     'edit' => 'Upraviť',
-    'copy' => 'Copy',
-    'copied' => 'Copied!',
+    'copy' => 'Kopírovať',
+    'copied' => 'Skopírované!',
     'home' => 'Domov',
     'explicit' => 'Chúlostivé',
     'powered_by' => 'Poháňané cez {castopod}',
-    'actions' => 'Actions',
-    'pageInfo' => 'Page {currentPage} out of {pageCount}',
+    'actions' => 'Akcie',
+    'pageInfo' => 'Stránka {currentPage} z celkového počtu {pageCount}',
     'go_back' => 'Ísť späť',
     'forms' => [
         'editor' => [
             'write' => 'Písať',
-            'preview' => 'Preview',
-            'help' => 'Powered by markdown',
+            'preview' => 'Náhľad',
+            'help' => 'Podporovaný markdown',
         ],
         'multiSelect' => [
-            'selectText' => 'Press to select',
-            'loadingText' => 'Loading…',
-            'noResultsText' => 'No results found',
-            'noChoicesText' => 'No choices to choose from',
-            'maxItemText' => 'Cannot add more items',
+            'selectText' => 'Vyberte stlačením',
+            'loadingText' => 'Načítanie…',
+            'noResultsText' => 'Nenájdené žiadne výsledky',
+            'noChoicesText' => 'Žiadne možnosti na výber',
+            'maxItemText' => 'Nie je možné pridať viac položiek',
         ],
         'upload_file' => 'Nahrať súbor',
-        'remote_url' => 'Remote URL',
+        'remote_url' => 'Vzdialená adresa URL',
     ],
     'play_episode_button' => [
         'play' => 'Prehrať',
         'playing' => 'Prehrávané',
     ],
-    'size_limit' => 'Size limit: {0}.',
-    'choose_interact' => 'Choose how to interact',
-    'view' => 'View',
+    'size_limit' => 'Limit veľkosti: {0}.',
+    'choose_interact' => 'Vyberte spôsob interakcie',
+    'view' => 'Zobraziť',
 ];
diff --git a/modules/Admin/Language/sk/Contributor.php b/modules/Admin/Language/sk/Contributor.php
index 94072a9391a35d09f56dd5bfe9db299a3790038c..3f0991fa53e853891a07b0a30c444b7d04a243a8 100644
--- a/modules/Admin/Language/sk/Contributor.php
+++ b/modules/Admin/Language/sk/Contributor.php
@@ -9,33 +9,33 @@ declare(strict_types=1);
  */
 
 return [
-    'podcast_contributors' => 'Podcast contributors',
-    'view' => "{username}'s contribution to {podcastTitle}",
+    'podcast_contributors' => 'Prispievatelia podcastu',
+    'view' => "Príspevky používateľa {username} do podcastu {podcastTitle}",
     'add' => 'Pridať prispievateľa',
     'add_contributor' => 'Pridať prispievateľa pre {0}',
     'edit_role' => 'Upraviť rolu pre {0}',
     'edit' => 'Upraviť',
     'remove' => 'Odstrániť',
     'list' => [
-        'username' => 'Užívateľské meno',
+        'username' => 'Meno používateľa',
         'role' => 'Rola',
     ],
     'form' => [
-        'user' => 'Užívateľ',
-        'user_placeholder' => 'Vybrať užívateľa…',
+        'user' => 'Používateľ',
+        'user_placeholder' => 'Vybrať používateľa…',
         'role' => 'Rola',
         'role_placeholder' => 'Vybrať jeho úlohu…',
         'submit_add' => 'Pridať prispievateľa',
-        'submit_edit' => 'Update role',
+        'submit_edit' => 'Aktualizovať rolu',
     ],
     'roles' => [
-        'podcast_admin' => 'Podcast admin',
+        'podcast_admin' => 'Správca podcastu',
     ],
     'messages' => [
-        'removeOwnerError' => "You can't remove the podcast owner!",
+        'removeOwnerError' => "Nemôžete odstrániť vlastníka podcastu!",
         'removeSuccess' =>
-            'You have successfully removed {username} from {podcastTitle}',
+            'Úspešne ste odstránili používateľa {username} z podcastu {podcastTitle}',
         'alreadyAddedError' =>
-            "The contributor you're trying to add has already been added!",
+            "Prispievateľa, ktorého sa usiľujete pridať je už pridaný!",
     ],
 ];
diff --git a/modules/Admin/Language/sk/Countries.php b/modules/Admin/Language/sk/Countries.php
index 3febee2613969fa83aca9279d89333271ecb06af..98d7161d264d152436a24f208ef63f60be241310 100644
--- a/modules/Admin/Language/sk/Countries.php
+++ b/modules/Admin/Language/sk/Countries.php
@@ -68,7 +68,7 @@ return [
     'CY' => 'Cyprus',
     'CZ' => 'Česká republika',
     'DE' => 'Nemecko',
-    'DJ' => 'Djibouti',
+    'DJ' => 'Džibutsko',
     'DK' => 'Dánsko',
     'DM' => 'Dominica',
     'DO' => 'Dominikánska republika',
@@ -76,12 +76,12 @@ return [
     'EC' => 'Ekvádor',
     'EE' => 'Estónsko',
     'EG' => 'Egypt',
-    'EH' => 'Western Sahara',
+    'EH' => 'Západná Sahara',
     'ER' => 'Eritrea',
     'ES' => 'Å panielsko',
     'ET' => 'Etiópia',
     'FI' => 'Fínsko',
-    'FJ' => 'Fiji',
+    'FJ' => 'Fidži',
     'FK' => 'Falklandské ostrovy (Malvíny)',
     'FM' => 'Micronesia, Federated States of',
     'FO' => 'Faroe Islands',
@@ -89,7 +89,7 @@ return [
     'GA' => 'Gabon',
     'GB' => 'United Kingdom',
     'GD' => 'Grenada',
-    'GE' => 'Georgia',
+    'GE' => 'Gruzínsko',
     'GF' => 'French Guiana',
     'GG' => 'Guernsey',
     'GH' => 'Ghana',
@@ -236,7 +236,7 @@ return [
     'TM' => 'Turkménsko',
     'TN' => 'Tunisko',
     'TO' => 'Tonga',
-    'TR' => 'Turkey',
+    'TR' => 'Turecko',
     'TT' => 'Trinidad and Tobago',
     'TV' => 'Tuvalu',
     'TW' => 'Taiwan, provincia Číny',
diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php
index f174fc0cb72c064b445ba144a01d9738a024e675..1675c6edf2c358a4715a220f228f42fc934091b2 100644
--- a/modules/Admin/Language/sk/Episode.php
+++ b/modules/Admin/Language/sk/Episode.php
@@ -9,80 +9,84 @@ declare(strict_types=1);
  */
 
 return [
-    'season' => 'Season {seasonNumber}',
+    'season' => 'Séria {seasonNumber}',
     'season_abbr' => 'S{seasonNumber}',
-    'number' => 'Episode {episodeNumber}',
+    'number' => 'Epizóda {episodeNumber}',
     'number_abbr' => 'Ep. {episodeNumber}',
-    'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
+    'season_episode' => 'Séria {seasonNumber} epizóda {episodeNumber}',
     'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
     'number_of_comments' => '{numberOfComments, plural,
-        one {# comment}
-        other {# comments}
+        one {# komentár}
+        few {# komentáre}
+        many {# komentárov}
+        other {# komentárov}
     }',
-    'all_podcast_episodes' => 'All podcast episodes',
-    'back_to_podcast' => 'Go back to podcast',
-    'edit' => 'Edit',
-    'publish' => 'Publish',
-    'publish_edit' => 'Edit publication',
-    'unpublish' => 'Unpublish',
-    'publish_error' => 'Episode is already published.',
-    'publish_edit_error' => 'Episode is already published.',
-    'publish_cancel_error' => 'Episode is already published.',
-    'unpublish_error' => 'Episode is not published.',
-    'delete' => 'Delete',
-    'go_to_page' => 'Go to page',
-    'create' => 'Add an episode',
+    'all_podcast_episodes' => 'Všetky epizódy podcastu',
+    'back_to_podcast' => 'Späť na podcast',
+    'edit' => 'Upraviť',
+    'publish' => 'Zverejniť',
+    'publish_edit' => 'Upraviť zverejnenie',
+    'unpublish' => 'Zrušiť zverejnenie',
+    'publish_error' => 'Epizóda je už zverejnená.',
+    'publish_edit_error' => 'Epizóda je už zverejnená.',
+    'publish_cancel_error' => 'Epizóda je už zverejnená.',
+    'unpublish_error' => 'Epizóda nie je zverejnená.',
+    'delete' => 'Vymazať',
+    'go_to_page' => 'Prejsť na stránku',
+    'create' => 'Pridať epizódu',
     'publication_status' => [
-        'published' => 'Published',
-        'with_podcast' => 'Published',
-        'scheduled' => 'Scheduled',
-        'not_published' => 'Not published',
+        'published' => 'Zverejnená',
+        'with_podcast' => 'Zverejnený',
+        'scheduled' => 'Naplánovaná',
+        'not_published' => 'Nezverejnená',
     ],
-    'with_podcast_hint' => 'To be published at the same time as the podcast',
+    'with_podcast_hint' => 'Bude publikovaná v rovnakom čase ako podcast',
     'list' => [
         'search' => [
-            'placeholder' => 'Search for an episode',
-            'clear' => 'Clear search',
-            'submit' => 'Search',
+            'placeholder' => 'Vyhľadať epizódu',
+            'clear' => 'Vyčistiť hľadanie',
+            'submit' => 'Hľadať',
         ],
         'number_of_episodes' => '{numberOfEpisodes, plural,
-            one {# episode}
-            other {# episodes}
+            one {# epizóda}
+            few {# epizódy}
+            many {# epizód}
+            other {# epizód}
         }',
-        'episode' => 'Episode',
+        'episode' => 'Epizóda',
         'visibility' => 'Viditeľnosť',
         'comments' => 'Komentáre',
         'actions' => 'Úkony',
     ],
     'messages' => [
-        'createSuccess' => 'Episode has been successfully created!',
-        'editSuccess' => 'Episode has been successfully updated!',
+        'createSuccess' => 'Epizóda je úspešne vytvorená!',
+        'editSuccess' => 'Epizóda je úspešne aktualizovaná!',
         '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 {Epizóda je úspešne zverejnená!}
+            scheduled {Zverejnenie epizódy je úspešne načasované!}
+            with_podcast {Táto epizóda bude zverejnená v rovnakom čase ako podcast.}
+            other {Táto epizóda nie je zverejnená.}
         }',
-        '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' => 'Zverejnenie epizódy úspešne zrušené!',
+        'unpublishBeforeDeleteTip' => 'Pred vymazaním musíte zrušiť zverejnenie epizódy.',
+        'scheduleDateError' => 'Musí byť nastavený plánovaný dátum zverejnenia!',
+        'deletePublishedEpisodeError' => 'Prosím zrušte zverejnenie epizódy pred jej vymazaním.',
+        'deleteSuccess' => 'Epizóda úspešne vymazaná!',
+        'deleteError' => 'Nepodarilo sa vymazať epizódu: {type, select,
+            transcript {prepis}
+            chapters {kapitoly}
+            image {obrázok}
+            audio {zvuk}
+            other {médiá}
         }.',
-        '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.',
+        'deleteFileError' => 'Nepodarilo sa vymazať {type, select,
+            transcript {prepis}
+            chapters {kapitoly}
+            image {obrázok}
+            audio {zvuk}
+            other {médiá}
+        } súbor {file_path}. Môžete ho z disku odstrániť ručne.',
+        'sameSlugError' => 'Epizóda s takýmto trvalým odkazom už existuje.',
     ],
     'form' => [
         'file_size_error' =>
@@ -123,78 +127,78 @@ return [
         '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_title' => 'Dodatočné súbory',
         '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.',
+            'Tieto súbory sú určené na použitie s inými platformami s cieľom poslucháčom poskytovať bohačšiu skúsenosť. Pre viac informácií si pozrite {podcastNamespaceLink}.',
         'location_section_title' => 'Lokácia',
-        '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.',
+        'location_section_subtitle' => 'O akom mieste / oblasti pojednáva táto epizóda?',
+        'location_name' => 'Názov oblasti alebo adresa',
+        'location_name_hint' => 'Môže to byť skutočné alebo vymyslené miesto',
+        'transcript' => 'Prepis (titulky / skryté titulky)',
+        'transcript_hint' => 'Povolené sú len súbory .srt.',
         'transcript_download' => 'Stiahnuť prepis',
-        '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',
+        'transcript_file' => 'Súbor s prepisom (.srt)',
+        'transcript_remote_url' => 'Vzdialená adresa Url s prepisom',
+        'transcript_file_delete' => 'Vymazať súbor s prepisom',
+        'chapters' => 'Kapitoly',
+        'chapters_hint' => 'Súbor musí byť vo formáte JSON Chapters.',
+        'chapters_download' => 'Prevziať kapitoly',
+        'chapters_file' => 'Súbor s kapitolami',
+        'chapters_remote_url' => 'Vzdialená adresa url súboru s kapitolami',
+        'chapters_file_delete' => 'Vymazať súbor s kapitolami',
+        'advanced_section_title' => 'Pokročilé vlastnosti',
         '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',
+            'Ak potrebujete pokročilé tagy RSS, ktoré castopod nepodporuje, nastavte ich tu.',
+        'custom_rss' => 'Vlastné tagy RSS pre túto epizódu',
+        'custom_rss_hint' => 'Toto bude vložené vo vnútri tagu ❬item❭.',
+        'block' => 'Epizóda má byť skrytá z verejných katalógov',
         '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)',
+            'Stav skryť / zobraziť pre túto epizódu: zapnutím zabránite, aby sa epizóda zobrazila v katalógoch Apple Podcasts, Google Podcasts a v ďalších aplikáciách tretích strán ktoré získavajú podcasty z týchto služieb. (Negarantované)',
         'submit_create' => 'Vytvoriť epizódu',
         'submit_edit' => 'Uložiť epizódu',
     ],
     'publish_form' => [
-        'back_to_episode_dashboard' => 'Back to episode dashboard',
-        'post' => 'Your announcement post',
+        'back_to_episode_dashboard' => 'Späť na nástenku epizódy',
+        'post' => 'Príspevok, ktorým oznamujete zverejnenie',
         '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',
+            "Napíšte správu, v ktorej oznámite zverejnenie tejto epizódy. Správu uvidia všetci sledujúci vo fediverse a správa bude zobrazená na úvodnej stránke podcastu.",
+        'message_placeholder' => 'Napíšte správu…',
+        'publication_date' => 'Dátum zverejnenia',
         'publication_method' => [
-            'now' => 'Now',
-            'schedule' => 'Schedule',
-            'with_podcast' => 'Publish alongside podcast',
+            'now' => 'Hneď teraz',
+            'schedule' => 'Naplánovať',
+            'with_podcast' => 'Publikovať spolu s podcastom',
         ],
-        'scheduled_publication_date' => 'Scheduled publication date',
-        'scheduled_publication_date_clear' => 'Clear publication date',
+        'scheduled_publication_date' => 'Dátum plánovaného zverejnenia',
+        'scheduled_publication_date_clear' => 'Vyčistiť dátum zverejnenia',
         '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',
+            'Uvedenie epizódy môžete naplánovať nastavením dátumu zverejnenia v budúcnosti. Formát tohoto vstupného poľa je YYYY-MM-DD HH:mm',
+        'submit' => 'Zverejniť',
+        'submit_edit' => 'Upraviť zverejnenie',
+        'cancel_publication' => 'Zrušiť zverejnenie',
+        'message_warning' => 'Nenapísali ste text oznamujúceho príspevku!',
+        'message_warning_hint' => 'Odoslaním uvádzacieho príspevku zlepšujete sociálnu účasť, čím môžete ešte viac zviditeľniť váš podcast.',
+        'message_warning_submit' => 'Napriek tomu zverejniť',
     ],
     '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',
+        'understand' => 'Rozumiem, chcem zrušiť zverejnenie epizódy',
+        'submit' => 'Zrušiť zverejnenie',
     ],
     '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',
+            "Vymazaním epizódy odstránite všetky prepojené mediálne súbory, komentáre, video klipy a zvukové ukážky.",
+        'understand' => 'Rozumiem, chcem vymazať epizódu',
+        'submit' => 'Vymazať',
     ],
     'embed' => [
-        'title' => 'Embeddable player',
+        'title' => 'Vnorený prehrávač',
         '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',
+            'Vyberte farbu vzhľadu, skopírujte kód prehrávača do schránky a prilepte ho na vašej stránke.',
+        'clipboard_iframe' => 'Skopírovať kód prehrávača do schránky',
+        'clipboard_url' => 'Skopírovať adresu do schránky',
+        'dark' => 'Tmavý',
         'dark-transparent' => 'Dark transparent',
         'light' => 'Light',
         'light-transparent' => 'Light transparent',
diff --git a/modules/Admin/Language/sk/EpisodeNavigation.php b/modules/Admin/Language/sk/EpisodeNavigation.php
index 1406e3010ef4383a6d8ef32ff88497e7bdeb9fa4..be3a1e256008131f51190cdcaa3494c27ae5e801 100644
--- a/modules/Admin/Language/sk/EpisodeNavigation.php
+++ b/modules/Admin/Language/sk/EpisodeNavigation.php
@@ -14,7 +14,7 @@ return [
     'episode-view' => 'Home',
     'episode-edit' => 'Edit episode',
     'episode-persons-manage' => 'Manage persons',
-    'embed-add' => 'Embeddable player',
+    'embed-add' => 'Vnorený prehrávač',
     'clips' => 'Clips',
     'video-clips-list' => 'Video clips',
     'video-clips-create' => 'New video clip',
diff --git a/modules/Admin/Language/sk/Fediverse.php b/modules/Admin/Language/sk/Fediverse.php
index 0e4ca66d89cd7d6191d36c0325647b0b3932ac6e..1a5e0a27e647a817b4cdc7c2fbea2d1ae59239f0 100644
--- a/modules/Admin/Language/sk/Fediverse.php
+++ b/modules/Admin/Language/sk/Fediverse.php
@@ -10,14 +10,14 @@ declare(strict_types=1);
 
 return [
     'messages' => [
-        'actorNotFound' => 'The account could not be found!',
+        'actorNotFound' => 'Účet nieje možné nájsť!',
         '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',
+    'blocked_actors' => 'Zablokované účty',
+    'blocked_domains' => 'Zablokované domény',
     'block_lists_form' => [
         'handle' => 'Account handle',
         'handle_hint' => 'Input @username@domain account.',
@@ -25,7 +25,7 @@ return [
         'submit' => 'Block!',
     ],
     'list' => [
-        'actor' => 'Account',
+        'actor' => 'Účet',
         'domain' => 'Domain name',
         'unblock' => 'Unblock',
     ],
diff --git a/modules/Admin/Language/sk/Home.php b/modules/Admin/Language/sk/Home.php
index 3ff4c04dc8a8f2576b3e04638184ae375f488a54..942992fd42d94fa9c244648103b28970b83184ee 100644
--- a/modules/Admin/Language/sk/Home.php
+++ b/modules/Admin/Language/sk/Home.php
@@ -9,6 +9,6 @@ declare(strict_types=1);
  */
 
 return [
-    'all_podcasts' => 'All podcasts',
-    'no_podcast' => 'No podcast found',
+    'all_podcasts' => 'VÅ¡etky podcasty',
+    'no_podcast' => 'Žiadne podcasty nenájdené',
 ];
diff --git a/modules/Admin/Language/sk/Install.php b/modules/Admin/Language/sk/Install.php
index 36e373a2858779a2deb77f1cbc6f629dda223f19..6282e10b9551e4325933634d1c49f0fb0f239834 100644
--- a/modules/Admin/Language/sk/Install.php
+++ b/modules/Admin/Language/sk/Install.php
@@ -9,7 +9,7 @@ declare(strict_types=1);
  */
 
 return [
-    'manual_config' => 'Manual configuration',
+    'manual_config' => 'Vlastnoručné nastavenie',
     'manual_config_subtitle' =>
         'Create a `.env` file with your settings and refresh the page to continue installation.',
     'form' => [
@@ -37,25 +37,25 @@ return [
         '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',
+        'cache_handler' => 'Obslužný mechanizmus vyrovnávacej pamäte',
         'cacheHandlerOptions' => [
-            'file' => 'File',
+            'file' => 'Súbor',
             'redis' => 'Redis',
             'predis' => 'Predis',
         ],
-        'next' => 'Next',
-        'submit' => 'Finish install',
-        'create_superadmin' => 'Create your superadmin account',
+        'next' => 'ÄŽalej',
+        'submit' => 'Dokončiť inštaláciu',
+        'create_superadmin' => 'Vytvoriť účet hlavného správcu',
         'email' => 'Email',
-        'username' => 'Username',
-        'password' => 'Password',
+        'username' => 'Meno používateľa',
+        'password' => 'Heslo',
     ],
     'messages' => [
         'createSuperAdminSuccess' =>
-            'Your superadmin account has been created successfully. Login to start podcasting!',
+            'Účet hlavného správcu je úspešne vytvorený. Prihláste sa a začnite podcastovať!',
         'databaseConnectError' =>
-            'Castopod could not connect to your database. Edit your database configuration and try again.',
+            'Castopod sa nedokáže pripojiť k databáze. Upravte konfiguráciu a skúste znovu.',
         'writeError' =>
-            "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.",
+            "Nie je možné vytvoriť/zapísať súbor `.env`. Mali by ste ho vytvoriť ručne podľa vzoru v súbore `.env.example` v balíku castopod.",
     ],
 ];
diff --git a/modules/Admin/Language/sk/MyAccount.php b/modules/Admin/Language/sk/MyAccount.php
index 6ebbb30ef70a5e3e86a9bab867f7c732ce79db26..1e54721eabc7b44d3c4af4c652fb96136be80643 100644
--- a/modules/Admin/Language/sk/MyAccount.php
+++ b/modules/Admin/Language/sk/MyAccount.php
@@ -9,10 +9,10 @@ declare(strict_types=1);
  */
 
 return [
-    'info' => 'My account info',
-    'changePassword' => 'Change my password',
+    'info' => 'Informácie o mojom účte',
+    'changePassword' => 'Zmeniť heslo',
     'messages' => [
-        'wrongPasswordError' => "You've entered the wrong password, try again.",
-        'passwordChangeSuccess' => 'Password has been successfully changed!',
+        'wrongPasswordError' => "Zadali ste nesprávne heslo, skúste znovu.",
+        'passwordChangeSuccess' => 'Heslo je úspešne zmenené!',
     ],
 ];
diff --git a/modules/Admin/Language/sk/Navigation.php b/modules/Admin/Language/sk/Navigation.php
index 68d4609d5d94a5770f237ee23207ad47d1262c70..f2c9e53abf7ed1397ec5354e1576826cd1fad7a5 100644
--- a/modules/Admin/Language/sk/Navigation.php
+++ b/modules/Admin/Language/sk/Navigation.php
@@ -9,33 +9,33 @@ 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',
+    'toggle_sidebar' => 'Prepnúť postranný panel',
+    'go_to_website' => 'Prejsť na webstránku',
+    'go_to_admin' => 'Spravovať',
+    'dashboard' => 'Nástenka',
+    'admin' => 'Úvod',
+    'podcasts' => 'Podcasty',
+    'podcast-list' => 'VÅ¡etky podcasty',
+    'podcast-create' => 'Nový podcast',
+    'podcast-import' => 'Importovať podcast',
+    'persons' => 'Osobnosti',
+    'person-list' => 'VÅ¡etky osobnosti',
+    'person-create' => 'Nová osobnosť',
     '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',
+    'fediverse-blocked-actors' => 'Blokované účty',
+    'fediverse-blocked-domains' => 'Blokované domény',
+    'users' => 'Používatelia',
+    'user-list' => 'Všetci používatelia',
+    'user-create' => 'Nový používateľ',
+    'pages' => 'Stránky',
+    'page-list' => 'Všetky stránky',
+    'page-create' => 'Nová stránka',
+    'settings' => 'Nastavenia',
+    'settings-general' => 'Všeobecné',
+    'settings-theme' => 'Vzhľad',
     'account' => [
-        'my-account' => 'My account',
-        'change-password' => 'Change password',
-        'logout' => 'Logout',
+        'my-account' => 'Môj účet',
+        'change-password' => 'Zmeniť heslo',
+        'logout' => 'Odhlásiť sa',
     ],
 ];
diff --git a/modules/Admin/Language/sk/Notifications.php b/modules/Admin/Language/sk/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/sk/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Admin/Language/sk/Page.php b/modules/Admin/Language/sk/Page.php
index b6f49de57496ec4830246641f0bf8897e7c9a2f9..72892ebf99949646de68e0e98b2fc722c0b7e4cd 100644
--- a/modules/Admin/Language/sk/Page.php
+++ b/modules/Admin/Language/sk/Page.php
@@ -9,12 +9,12 @@ 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',
+    'back_to_home' => 'Späť na úvod',
+    'page' => 'Stránka',
+    'all_pages' => 'Všetky stránky',
+    'create' => 'Nová stránka',
+    'go_to_page' => 'Prejsť na stránku',
+    'edit' => 'Upraviť stránku',
     'delete' => 'Delete page',
     'form' => [
         'title' => 'Title',
diff --git a/modules/Admin/Language/sk/Person.php b/modules/Admin/Language/sk/Person.php
index a652be9fda1f4aeb73bcb01c35f13a452a6d4741..b6bf1dc7ed3595b5fcf3efec7e3afd9f509eb96a 100644
--- a/modules/Admin/Language/sk/Person.php
+++ b/modules/Admin/Language/sk/Person.php
@@ -54,12 +54,12 @@ return [
         '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',
+            'Môžete vybrať jednu alebo viac osôb s tou istou rolou. Najprv by ste mali osobnosti vytvoriť.',
+        'roles' => 'Roly',
         'roles_hint' =>
-            'You may select none, one or several roles for a person.',
-        'submit_add' => 'Add person(s)',
-        'remove' => 'Remove',
+            'Pre jednu osobu môžete vybrať žiadnu, jednu alebo viac rolí.',
+        'submit_add' => 'Pridať osob(y)',
+        'remove' => 'Odstrániť',
     ],
-    'credits' => 'Credits',
+    'credits' => 'Zásluhy',
 ];
diff --git a/modules/Admin/Language/sk/Platforms.php b/modules/Admin/Language/sk/Platforms.php
index ab17d5999b1626535499464902c12f5c3bcb7aa8..678bdcbf8c55c75de25441b1f5859ae9bf3bca6e 100644
--- a/modules/Admin/Language/sk/Platforms.php
+++ b/modules/Admin/Language/sk/Platforms.php
@@ -9,11 +9,11 @@ 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?',
+    'title' => 'Platformy',
+    'home_url' => 'Prejsť na stránku {platformName}',
+    'submit_url' => 'Uverejniť podcast na platforme {platformName}',
+    'visible' => 'Zobraziť na úvodnej stránke podcastu?',
+    'on_embed' => 'Zobraziť na vnorenom prehrávači?',
     'remove' => 'Remove {platformName}',
     'submit' => 'Save',
     'messages' => [
diff --git a/modules/Admin/Language/sv/Breadcrumb.php b/modules/Admin/Language/sv/Breadcrumb.php
index d9400ca786ad22820c4bda166f6f11e61a0cb199..24bece0140b8e7cbd6edf835d096f76a43f97e70 100644
--- a/modules/Admin/Language/sv/Breadcrumb.php
+++ b/modules/Admin/Language/sv/Breadcrumb.php
@@ -45,4 +45,5 @@ return [
     'soundbites' => 'soundbites',
     'video-clips' => 'video clips',
     'embed' => 'embeddable player',
+    'notifications' => 'notifications',
 ];
diff --git a/modules/Admin/Language/sv/Notifications.php b/modules/Admin/Language/sv/Notifications.php
new file mode 100644
index 0000000000000000000000000000000000000000..1772ba76b290dc6ec713315c062d70e95dcde28a
--- /dev/null
+++ b/modules/Admin/Language/sv/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 {target_actor_username}',
+    'no_notifications' => 'No notifications',
+    'mark_all_as_read' => 'Mark all as read',
+];
diff --git a/modules/Install/Language/br/Install.php b/modules/Install/Language/br/Install.php
index 1f66ef118fd188c73e37e5009c5cdd22c7fdd3f2..926c45f98ec6197fa080dbcf3c0f61110f7d3c43 100644
--- a/modules/Install/Language/br/Install.php
+++ b/modules/Install/Language/br/Install.php
@@ -10,53 +10,53 @@ declare(strict_types=1);
 
 return [
     'title' => 'Castopod installer',
-    'manual_config' => 'Manual configuration',
+    'manual_config' => 'Kefluniañ dre zorn',
     'manual_config_subtitle' =>
-        'Create a `.env` file with your settings and refresh the page to continue installation.',
+        'Krouit ur restr `.env` gant hoc’h arventennoù ha hizivait ar bajenn evit kenderc\'hel gant ar staliañ.',
     'form' => [
-        'instance_config' => 'Instance configuration',
-        'hostname' => 'Hostname',
-        'media_base_url' => 'Media base URL',
+        'instance_config' => 'Arventennoù an istañs',
+        'hostname' => 'Anv an ostiz',
+        'media_base_url' => 'Chomlec\'h diazez ar mediaoù',
         'media_base_url_hint' =>
-            'If you use a CDN and/or an external analytics service, you may set them here.',
-        'admin_gateway' => 'Admin gateway',
+            'Ma \'z implijit ur CDN pe ur servij diavaez evit muzuliañ heklev, e c\'hellit lakaat anezho amañ.',
+        'admin_gateway' => 'Chomlec\'h an daolenn-stur',
         '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',
+            'An hent evit mont d\'an daolenn-stur (da sk. https://skouer.bzh/cp-admin). Dre ziouer eo cp-admin, met erbedet oc\'h kemmañ anezhañ evit abegoù a denn d\'an diogelroez.',
+        'auth_gateway' => 'Chomlec\'h ar c\'hennaskañ',
         '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',
+            'An hent evit mont d\'ar bajenn gennaskañ (da sk. https://skouer.bzh/cp-auth). Dre ziouer eo cp-auth, met erbedet oc\'h kemmañ anezhañ evit abegoù a denn d\'an diogelroez.',
+        'database_config' => 'Arventennoù ar stlennvon',
         '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',
+            'Castopod a rank bezañ kennesket ouzh ho stlennvon MySQL (pe MariaDB). Mont e darempred gant merour ho tafariad ma n\'emañ ket ganeoc\'h an titouroù-se.',
+        'db_hostname' => 'Anv ostiz ar stlennvon',
+        'db_name' => 'Anv ar stlennvon (an diaz)',
+        'db_username' => 'Anv implijer ar stlennvon',
+        'db_password' => 'Ger-tremen ar stlennvon',
+        'db_prefix' => 'Rakger an taolennoù',
         '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',
+            "Rakger taolennoù Castopod. Laoskit evel m'emañ ma ne ouzoc'h ket petra a dalv.",
+        'cache_config' => 'Arventennoù ar grubuilh (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' => 'Cache handler',
+            'Dibabit hoc’h ardoer krubuilh muiañ plijet. Laoskit evel m\'emañ ma ne ouzoc\'h ket petra a dalv.',
+        'cache_handler' => 'Aorder krubuilh',
         'cacheHandlerOptions' => [
-            'file' => 'File',
+            'file' => 'Restroù',
             'redis' => 'Redis',
             'predis' => 'Predis',
         ],
-        'next' => 'Next',
-        'submit' => 'Finish install',
-        'create_superadmin' => 'Create your superadmin account',
-        'email' => 'Email',
-        'username' => 'Username',
-        'password' => 'Password',
+        'next' => 'War-lerc\'h',
+        'submit' => 'Echuiñ ar staliañ',
+        'create_superadmin' => 'Krouit ho kont gourverour·ez (superadmin)',
+        'email' => 'Postel',
+        'username' => 'Anv implijer·ez',
+        'password' => 'Ger-tremen',
     ],
     'messages' => [
         'createSuperAdminSuccess' =>
-            'Your superadmin account has been created successfully. Login to start podcasting!',
+            'Ho kont gourverour·ez a zo bet krouet gant berzh. Kevreit ha krogit da bodkastiñ!',
         'databaseConnectError' =>
-            'Castopod could not connect to your database. Edit your database configuration and try again.',
+            'N\'en deus ket gellet Castopod kevreañ ouzh ho stlennvon. Kemmit arventennoù ar stlennvon ha klaskit en-dro.',
         'writeError' =>
-            "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.",
+            "N'haller ket krouiñ/skrivañ ar restr `.env`. Deoc'h-c'hwi da grouiñ anezhi dre zorn diwar ar patrom `.env.example` az o e pakad Castopod.",
     ],
 ];
diff --git a/modules/Install/Language/gl/Install.php b/modules/Install/Language/gl/Install.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f66ef118fd188c73e37e5009c5cdd22c7fdd3f2
--- /dev/null
+++ b/modules/Install/Language/gl/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 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.",
+    ],
+];