From c220b310ed59cad188af044b1fed0c39efc7da5b Mon Sep 17 00:00:00 2001
From: Yassine Doghri <yassine@doghri.fr>
Date: Tue, 29 Mar 2022 15:33:32 +0000
Subject: [PATCH] feat(i18n): add german language as supported locale + create
 Language files from english source

---
 app/Config/App.php                            |   2 +-
 app/Language/de/Comment.php                   |  34 +++
 app/Language/de/Common.php                    |  29 ++
 app/Language/de/Episode.php                   |  33 +++
 app/Language/de/Fediverse.php                 |  37 +++
 app/Language/de/Home.php                      |  20 ++
 app/Language/de/Page.php                      |  17 ++
 app/Language/de/Podcast.php                   |  53 ++++
 app/Language/de/Post.php                      |  40 +++
 modules/Admin/Language/de/Admin.php           |  15 +
 modules/Admin/Language/de/Breadcrumb.php      |  48 ++++
 modules/Admin/Language/de/Charts.php          |  38 +++
 modules/Admin/Language/de/Common.php          |  49 ++++
 modules/Admin/Language/de/Contributor.php     |  41 +++
 modules/Admin/Language/de/Countries.php       | 264 ++++++++++++++++++
 modules/Admin/Language/de/Episode.php         | 165 +++++++++++
 .../Admin/Language/de/EpisodeNavigation.php   |  23 ++
 modules/Admin/Language/de/Fediverse.php       |  32 +++
 modules/Admin/Language/de/Home.php            |  14 +
 modules/Admin/Language/de/Install.php         |  61 ++++
 modules/Admin/Language/de/MyAccount.php       |  18 ++
 modules/Admin/Language/de/Navigation.php      |  41 +++
 modules/Admin/Language/de/Page.php            |  30 ++
 modules/Admin/Language/de/Pager.php           |  21 ++
 modules/Admin/Language/de/Person.php          |  65 +++++
 modules/Admin/Language/de/Platforms.php       |  30 ++
 modules/Admin/Language/de/Podcast.php         | 243 ++++++++++++++++
 modules/Admin/Language/de/PodcastImport.php   |  37 +++
 .../Admin/Language/de/PodcastNavigation.php   |  35 +++
 modules/Admin/Language/de/Settings.php        |  56 ++++
 modules/Admin/Language/de/Soundbite.php       |  31 ++
 modules/Admin/Language/de/User.php            |  54 ++++
 modules/Admin/Language/de/Validation.php      |  18 ++
 modules/Admin/Language/de/VideoClip.php       |  72 +++++
 modules/Install/Language/de/Install.php       |  62 ++++
 35 files changed, 1827 insertions(+), 1 deletion(-)
 create mode 100644 app/Language/de/Comment.php
 create mode 100644 app/Language/de/Common.php
 create mode 100644 app/Language/de/Episode.php
 create mode 100644 app/Language/de/Fediverse.php
 create mode 100644 app/Language/de/Home.php
 create mode 100644 app/Language/de/Page.php
 create mode 100644 app/Language/de/Podcast.php
 create mode 100644 app/Language/de/Post.php
 create mode 100644 modules/Admin/Language/de/Admin.php
 create mode 100644 modules/Admin/Language/de/Breadcrumb.php
 create mode 100644 modules/Admin/Language/de/Charts.php
 create mode 100644 modules/Admin/Language/de/Common.php
 create mode 100644 modules/Admin/Language/de/Contributor.php
 create mode 100644 modules/Admin/Language/de/Countries.php
 create mode 100644 modules/Admin/Language/de/Episode.php
 create mode 100644 modules/Admin/Language/de/EpisodeNavigation.php
 create mode 100644 modules/Admin/Language/de/Fediverse.php
 create mode 100644 modules/Admin/Language/de/Home.php
 create mode 100644 modules/Admin/Language/de/Install.php
 create mode 100644 modules/Admin/Language/de/MyAccount.php
 create mode 100644 modules/Admin/Language/de/Navigation.php
 create mode 100644 modules/Admin/Language/de/Page.php
 create mode 100644 modules/Admin/Language/de/Pager.php
 create mode 100644 modules/Admin/Language/de/Person.php
 create mode 100644 modules/Admin/Language/de/Platforms.php
 create mode 100644 modules/Admin/Language/de/Podcast.php
 create mode 100644 modules/Admin/Language/de/PodcastImport.php
 create mode 100644 modules/Admin/Language/de/PodcastNavigation.php
 create mode 100644 modules/Admin/Language/de/Settings.php
 create mode 100644 modules/Admin/Language/de/Soundbite.php
 create mode 100644 modules/Admin/Language/de/User.php
 create mode 100644 modules/Admin/Language/de/Validation.php
 create mode 100644 modules/Admin/Language/de/VideoClip.php
 create mode 100644 modules/Install/Language/de/Install.php

diff --git a/app/Config/App.php b/app/Config/App.php
index c52f4d3e2b..2a676da7d2 100644
--- a/app/Config/App.php
+++ b/app/Config/App.php
@@ -101,7 +101,7 @@ class App extends BaseConfig
      *
      * @var string[]
      */
-    public array $supportedLocales = ['en', 'fr', 'pl'];
+    public array $supportedLocales = ['en', 'fr', 'pl', 'de'];
 
     /**
      * --------------------------------------------------------------------------
diff --git a/app/Language/de/Comment.php b/app/Language/de/Comment.php
new file mode 100644
index 0000000000..1dd8f5eadc
--- /dev/null
+++ b/app/Language/de/Comment.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "{actorDisplayName}'s comment for {episodeTitle}",
+    'back_to_comments' => 'Back to comments',
+    'form' => [
+        'episode_message_placeholder' => 'Write a comment…',
+        'reply_to_placeholder' => 'Reply to @{actorUsername}',
+        'submit' => 'Send',
+        'submit_reply' => 'Reply',
+    ],
+    'likes' => '{numberOfLikes, plural,
+        one {# like}
+        other {# likes}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'like' => 'Like',
+    'reply' => 'Reply',
+    'view_replies' => 'View replies ({numberOfReplies})',
+    'block_actor' => 'Block user @{actorUsername}',
+    'block_domain' => 'Block domain @{actorDomain}',
+    'delete' => 'Delete comment',
+];
diff --git a/app/Language/de/Common.php b/app/Language/de/Common.php
new file mode 100644
index 0000000000..aff8136b83
--- /dev/null
+++ b/app/Language/de/Common.php
@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'yes' => 'Yes',
+    'no' => 'No',
+    'cancel' => 'Cancel',
+    'optional' => 'Optional',
+    'close' => 'Close',
+    'home' => 'Home',
+    'explicit' => 'Explicit',
+    'powered_by' => 'Powered by {castopod}',
+    'go_back' => 'Go back',
+    'play_episode_button' => [
+        'play' => 'Play',
+        'playing' => 'Playing',
+    ],
+    'read_more' => 'Read more',
+    'read_less' => 'Read less',
+    'see_more' => 'See more',
+    'see_less' => 'See less',
+];
diff --git a/app/Language/de/Episode.php b/app/Language/de/Episode.php
new file mode 100644
index 0000000000..ebe39336fc
--- /dev/null
+++ b/app/Language/de/Episode.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Season {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Episode {episodeNumber}',
+    'number_abbr' => 'Ep. {episodeNumber}',
+    'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
+    'persons' => '{personsCount, plural,
+        one {# person}
+        other {# persons}
+    }',
+    'persons_list' => 'Persons',
+    'back_to_episodes' => 'Back to episodes of {podcast}',
+    'comments' => 'Comments',
+    'activity' => 'Activity',
+    'description' => 'Episode description',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# comment}
+        other {# comments}
+    }',
+    'all_podcast_episodes' => 'All podcast episodes',
+    'back_to_podcast' => 'Go back to podcast',
+];
diff --git a/app/Language/de/Fediverse.php b/app/Language/de/Fediverse.php
new file mode 100644
index 0000000000..32f54c074f
--- /dev/null
+++ b/app/Language/de/Fediverse.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2021 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'your_handle' => 'Your handle',
+    'your_handle_hint' => 'Enter the @username@domain you want to act from.',
+    'follow' => [
+        'label' => 'Follow',
+        'title' => 'Follow {actorDisplayName}',
+        'subtitle' => 'You are going to follow:',
+        'accountNotFound' => 'The account could not be found.',
+        'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
+        'submit' => 'Proceed to follow',
+    ],
+    'favourite' => [
+        'title' => "Favourite {actorDisplayName}'s post",
+        'subtitle' => 'You are going to favourite:',
+        'submit' => 'Proceed to favourite',
+    ],
+    'reblog' => [
+        'title' => "Share {actorDisplayName}'s post",
+        'subtitle' => 'You are going to share:',
+        'submit' => 'Proceed to share',
+    ],
+    'reply' => [
+        'title' => "Reply to {actorDisplayName}'s post",
+        'subtitle' => 'You are going to reply to:',
+        'submit' => 'Proceed to reply',
+    ],
+];
diff --git a/app/Language/de/Home.php b/app/Language/de/Home.php
new file mode 100644
index 0000000000..1518239bd9
--- /dev/null
+++ b/app/Language/de/Home.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'sort_by' => 'Sort by',
+    'sort_options' => [
+        'activity' => 'Recent activity',
+        'created_desc' => 'Newest first',
+        'created_asc' => 'Oldest first',
+    ],
+    'no_podcast' => 'No podcast found',
+];
diff --git a/app/Language/de/Page.php b/app/Language/de/Page.php
new file mode 100644
index 0000000000..7cd606694e
--- /dev/null
+++ b/app/Language/de/Page.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'back_to_home' => 'Back to home',
+    'map' => [
+        'title' => 'Map',
+        'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.',
+    ],
+];
diff --git a/app/Language/de/Podcast.php b/app/Language/de/Podcast.php
new file mode 100644
index 0000000000..d69cd86daf
--- /dev/null
+++ b/app/Language/de/Podcast.php
@@ -0,0 +1,53 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'feed' => 'RSS Podcast feed',
+    'season' => 'Season {seasonNumber}',
+    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Season {seasonNumber} episodes ({episodeCount})',
+    'no_episode' => 'No episode found!',
+    'follow' => 'Follow',
+    'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
+    'followers' => '{numberOfFollowers, plural,
+        one {<span class="font-semibold">#</span> follower}
+        other {<span class="font-semibold">#</span> followers}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {<span class="font-semibold">#</span> post}
+        other {<span class="font-semibold">#</span> posts}
+    }',
+    'activity' => 'Activity',
+    'episodes' => 'Episodes',
+    'episodes_title' => 'Episodes of {podcastTitle}',
+    'about' => 'About',
+    'stats' => [
+        'title' => 'Stats',
+        'number_of_seasons' => '{0, plural,
+            one {<span class="font-semibold">#</span> season}
+            other {<span class="font-semibold">#</span> seasons}
+        }',
+        'number_of_episodes' => '{0, plural,
+            one {<span class="font-semibold">#</span> episode}
+            other {<span class="font-semibold">#</span> episodes}
+        }',
+        'first_published_at' => 'First episode published on <span class="font-semibold">{0, date, medium}</span>',
+    ],
+    'sponsor' => 'Sponsor',
+    'funding_links' => 'Funding links for {podcastTitle}',
+    'find_on' => 'Find {podcastTitle} on',
+    'listen_on' => 'Listen on',
+    'persons' => '{personsCount, plural,
+        one {# person}
+        other {# persons}
+    }',
+    'persons_list' => 'Persons',
+];
diff --git a/app/Language/de/Post.php b/app/Language/de/Post.php
new file mode 100644
index 0000000000..58d1cf8002
--- /dev/null
+++ b/app/Language/de/Post.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => "{actorDisplayName}'s post",
+    'back_to_actor_posts' => 'Back to {actor} posts',
+    'actor_shared' => '{actor} shared',
+    'reply_to' => 'Reply to @{actorUsername}',
+    'form' => [
+        'message_placeholder' => 'Write a message…',
+        'episode_message_placeholder' => 'Write a message for the episode…',
+        'episode_url_placeholder' => 'Episode URL',
+        'reply_to_placeholder' => 'Reply to @{actorUsername}',
+        'submit' => 'Send',
+        'submit_reply' => 'Reply',
+    ],
+    'favourites' => '{numberOfFavourites, plural,
+        one {# favourite}
+        other {# favourites}
+    }',
+    'reblogs' => '{numberOfReblogs, plural,
+        one {# share}
+        other {# shares}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'expand' => 'Expand post',
+    'block_actor' => 'Block user @{actorUsername}',
+    'block_domain' => 'Block domain @{actorDomain}',
+    'delete' => 'Delete post',
+];
diff --git a/modules/Admin/Language/de/Admin.php b/modules/Admin/Language/de/Admin.php
new file mode 100644
index 0000000000..5e3942371f
--- /dev/null
+++ b/modules/Admin/Language/de/Admin.php
@@ -0,0 +1,15 @@
+<?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 [
+    'dashboard' => 'Admin dashboard',
+    'welcome_message' => 'Welcome to the admin area!',
+    'choose_interact' => 'Choose how to interact',
+];
diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php
new file mode 100644
index 0000000000..d9400ca786
--- /dev/null
+++ b/modules/Admin/Language/de/Breadcrumb.php
@@ -0,0 +1,48 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'label' => 'breadcrumb',
+    config('Admin')
+        ->gateway => 'Home',
+    'podcasts' => 'podcasts',
+    'episodes' => 'episodes',
+    'contributors' => 'contributors',
+    'pages' => 'pages',
+    'settings' => 'settings',
+    'theme' => 'theme',
+    'add' => 'add',
+    'new' => 'new',
+    'edit' => 'edit',
+    'persons' => 'persons',
+    'publish' => 'publish',
+    'publish-edit' => 'edit publication',
+    'unpublish' => 'unpublish',
+    'delete' => 'delete',
+    'fediverse' => 'fediverse',
+    'block-lists' => 'block lists',
+    'users' => 'users',
+    'my-account' => 'my account',
+    'change-password' => 'change password',
+    'import' => 'feed import',
+    'platforms' => 'platforms',
+    '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',
+];
diff --git a/modules/Admin/Language/de/Charts.php b/modules/Admin/Language/de/Charts.php
new file mode 100644
index 0000000000..d9a75a1d84
--- /dev/null
+++ b/modules/Admin/Language/de/Charts.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'by_service_weekly' => 'Episode downloads by service (for the past week)',
+    'by_player_weekly' => 'Episode downloads by player (for the past week)',
+    'by_player_yearly' => 'Episode downloads by player (for the past year)',
+    'by_device_weekly' => 'Episode downloads by device (for the past week)',
+    'by_os_weekly' => 'Episode downloads by O.S. (for the past week)',
+    'podcast_by_region' => 'Episode downloads by region (for the past week)',
+    'unique_daily_listeners' => 'Daily unique listeners',
+    'unique_monthly_listeners' => 'Monthly unique listeners',
+    'by_browser' => 'Web pages usage by browser (for the past week)',
+    'podcast_by_day' => 'Episode daily downloads',
+    'podcast_by_month' => 'Episode monthly downloads',
+    'episode_by_day' => 'Episode daily downloads (first 60 days)',
+    'episode_by_month' => 'Episode monthly downloads',
+    'episodes_by_day' =>
+        '5 latest episodes downloads (during their first 60 days)',
+    'by_country_weekly' => 'Episode downloads by country (for the past week)',
+    'by_country_yearly' => 'Episode downloads by country (for the past year)',
+    'by_domain_weekly' => 'Web pages visits by source (for the past week)',
+    'by_domain_yearly' => 'Web pages visits by source (for the past year)',
+    'by_entry_page' => 'Web pages visits by landing page (for the past week)',
+    'podcast_bots' => 'Bots (crawlers)',
+    'daily_listening_time' => 'Daily cumulative listening time',
+    'monthly_listening_time' => 'Monthly cumulative listening time',
+    'by_weekday' => 'By week day (for the past 60 days)',
+    'by_hour' => 'By time of day (for the past 60 days)',
+    'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)',
+];
diff --git a/modules/Admin/Language/de/Common.php b/modules/Admin/Language/de/Common.php
new file mode 100644
index 0000000000..d97bcf991f
--- /dev/null
+++ b/modules/Admin/Language/de/Common.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 [
+    'yes' => 'Yes',
+    'no' => 'No',
+    'cancel' => 'Cancel',
+    'optional' => 'Optional',
+    'more' => 'More',
+    'no_data' => 'No data found!',
+    'close' => 'Close',
+    'edit' => 'Edit',
+    'copy' => 'Copy',
+    'copied' => 'Copied!',
+    'home' => 'Home',
+    'explicit' => 'Explicit',
+    'powered_by' => 'Powered by {castopod}',
+    'actions' => 'Actions',
+    'pageInfo' => 'Page {currentPage} out of {pageCount}',
+    'go_back' => 'Go back',
+    'forms' => [
+        'editor' => [
+            'write' => 'Write',
+            'preview' => 'Preview',
+            'help' => 'Powered by markdown',
+        ],
+        'multiSelect' => [
+            'selectText' => 'Press to select',
+            'loadingText' => 'Loading…',
+            'noResultsText' => 'No results found',
+            'noChoicesText' => 'No choices to choose from',
+            'maxItemText' => 'Cannot add more items',
+        ],
+        'upload_file' => 'Upload a file',
+        'remote_url' => 'Remote URL',
+    ],
+    'play_episode_button' => [
+        'play' => 'Play',
+        'playing' => 'Playing',
+    ],
+    'size_limit' => 'Size limit: {0}.',
+];
diff --git a/modules/Admin/Language/de/Contributor.php b/modules/Admin/Language/de/Contributor.php
new file mode 100644
index 0000000000..d0f3b93d9f
--- /dev/null
+++ b/modules/Admin/Language/de/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' => 'Podcast contributors',
+    'view' => "{username}'s contribution to {podcastTitle}",
+    'add' => 'Add contributor',
+    'add_contributor' => 'Add a contributor for {0}',
+    'edit_role' => 'Update role for {0}',
+    'edit' => 'Edit',
+    'remove' => 'Remove',
+    'list' => [
+        'username' => 'Username',
+        'role' => 'Role',
+    ],
+    'form' => [
+        'user' => 'User',
+        'user_placeholder' => 'Select a user…',
+        'role' => 'Role',
+        'role_placeholder' => 'Select its role…',
+        'submit_add' => 'Add contributor',
+        'submit_edit' => 'Update role',
+    ],
+    'roles' => [
+        'podcast_admin' => 'Podcast admin',
+    ],
+    'messages' => [
+        'removeOwnerError' => "You can't remove the podcast owner!",
+        'removeSuccess' =>
+            'You have successfully removed {username} from {podcastTitle}',
+        'alreadyAddedError' =>
+            "The contributor you're trying to add has already been added!",
+    ],
+];
diff --git a/modules/Admin/Language/de/Countries.php b/modules/Admin/Language/de/Countries.php
new file mode 100644
index 0000000000..4cd5d9c857
--- /dev/null
+++ b/modules/Admin/Language/de/Countries.php
@@ -0,0 +1,264 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * ISO 3166 country codes
+ *
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'AD' => 'Andorra',
+    'AE' => 'United Arab Emirates',
+    'AF' => 'Afghanistan',
+    'AG' => 'Antigua and Barbuda',
+    'AI' => 'Anguilla',
+    'AL' => 'Albania',
+    'AM' => 'Armenia',
+    'AO' => 'Angola',
+    'AQ' => 'Antarctica',
+    'AR' => 'Argentina',
+    'AS' => 'American Samoa',
+    'AT' => 'Austria',
+    'AU' => 'Australia',
+    'AW' => 'Aruba',
+    'AX' => 'Ã…land Islands',
+    'AZ' => 'Azerbaijan',
+    'BA' => 'Bosnia and Herzegovina',
+    'BB' => 'Barbados',
+    'BD' => 'Bangladesh',
+    'BE' => 'Belgium',
+    'BF' => 'Burkina Faso',
+    'BG' => 'Bulgaria',
+    'BH' => 'Bahrain',
+    'BI' => 'Burundi',
+    'BJ' => 'Benin',
+    'BL' => 'Saint Barthélemy',
+    'BM' => 'Bermuda',
+    'BN' => 'Brunei Darussalam',
+    'BO' => 'Bolivia, Plurinational State of',
+    'BQ' => 'Bonaire, Sint Eustatius and Saba',
+    'BR' => 'Brazil',
+    'BS' => 'Bahamas',
+    'BT' => 'Bhutan',
+    'BV' => 'Bouvet Island',
+    'BW' => 'Botswana',
+    'BY' => 'Belarus',
+    'BZ' => 'Belize',
+    'CA' => 'Canada',
+    'CC' => 'Cocos (Keeling) Islands',
+    'CD' => 'Congo, the Democratic Republic of the',
+    'CF' => 'Central African Republic',
+    'CG' => 'Congo',
+    'CH' => 'Switzerland',
+    'CI' => "Côte d'Ivoire",
+    'CK' => 'Cook Islands',
+    'CL' => 'Chile',
+    'CM' => 'Cameroon',
+    'CN' => 'China',
+    'CO' => 'Colombia',
+    'CR' => 'Costa Rica',
+    'CU' => 'Cuba',
+    'CV' => 'Cape Verde',
+    'CW' => 'Curaçao',
+    'CX' => 'Christmas Island',
+    'CY' => 'Cyprus',
+    'CZ' => 'Czech Republic',
+    'DE' => 'Germany',
+    'DJ' => 'Djibouti',
+    'DK' => 'Denmark',
+    'DM' => 'Dominica',
+    'DO' => 'Dominican Republic',
+    'DZ' => 'Algeria',
+    'EC' => 'Ecuador',
+    'EE' => 'Estonia',
+    'EG' => 'Egypt',
+    'EH' => 'Western Sahara',
+    'ER' => 'Eritrea',
+    'ES' => 'Spain',
+    'ET' => 'Ethiopia',
+    'FI' => 'Finland',
+    'FJ' => 'Fiji',
+    'FK' => 'Falkland Islands (Malvinas)',
+    'FM' => 'Micronesia, Federated States of',
+    'FO' => 'Faroe Islands',
+    'FR' => 'France',
+    'GA' => 'Gabon',
+    'GB' => 'United Kingdom',
+    'GD' => 'Grenada',
+    'GE' => 'Georgia',
+    'GF' => 'French Guiana',
+    'GG' => 'Guernsey',
+    'GH' => 'Ghana',
+    'GI' => 'Gibraltar',
+    'GL' => 'Greenland',
+    'GM' => 'Gambia',
+    'GN' => 'Guinea',
+    'GP' => 'Guadeloupe',
+    'GQ' => 'Equatorial Guinea',
+    'GR' => 'Greece',
+    'GS' => 'South Georgia and the South Sandwich Islands',
+    'GT' => 'Guatemala',
+    'GU' => 'Guam',
+    'GW' => 'Guinea-Bissau',
+    'GY' => 'Guyana',
+    'HK' => 'Hong Kong',
+    'HM' => 'Heard Island and McDonald Islands',
+    'HN' => 'Honduras',
+    'HR' => 'Croatia',
+    'HT' => 'Haiti',
+    'HU' => 'Hungary',
+    'ID' => 'Indonesia',
+    'IE' => 'Ireland',
+    'IL' => 'Israel',
+    'IM' => 'Isle of Man',
+    'IN' => 'India',
+    'IO' => 'British Indian Ocean Territory',
+    'IQ' => 'Iraq',
+    'IR' => 'Iran, Islamic Republic of',
+    'IS' => 'Iceland',
+    'IT' => 'Italy',
+    'JE' => 'Jersey',
+    'JM' => 'Jamaica',
+    'JO' => 'Jordan',
+    'JP' => 'Japan',
+    'KE' => 'Kenya',
+    'KG' => 'Kyrgyzstan',
+    'KH' => 'Cambodia',
+    'KI' => 'Kiribati',
+    'KM' => 'Comoros',
+    'KN' => 'Saint Kitts and Nevis',
+    'KP' => "Korea, Democratic People's Republic of",
+    'KR' => 'Korea, Republic of',
+    'KW' => 'Kuwait',
+    'KY' => 'Cayman Islands',
+    'KZ' => 'Kazakhstan',
+    'LA' => "Lao People's Democratic Republic",
+    'LB' => 'Lebanon',
+    'LC' => 'Saint Lucia',
+    'LI' => 'Liechtenstein',
+    'LK' => 'Sri Lanka',
+    'LR' => 'Liberia',
+    'LS' => 'Lesotho',
+    'LT' => 'Lithuania',
+    'LU' => 'Luxembourg',
+    'LV' => 'Latvia',
+    'LY' => 'Libya',
+    'MA' => 'Morocco',
+    'MC' => 'Monaco',
+    'MD' => 'Moldova, Republic of',
+    'ME' => 'Montenegro',
+    'MF' => 'Saint Martin (French part)',
+    'MG' => 'Madagascar',
+    'MH' => 'Marshall Islands',
+    'MK' => 'Macedonia, the Former Yugoslav Republic of',
+    'ML' => 'Mali',
+    'MM' => 'Myanmar',
+    'MN' => 'Mongolia',
+    'MO' => 'Macao',
+    'MP' => 'Northern Mariana Islands',
+    'MQ' => 'Martinique',
+    'MR' => 'Mauritania',
+    'MS' => 'Montserrat',
+    'MT' => 'Malta',
+    'MU' => 'Mauritius',
+    'MV' => 'Maldives',
+    'MW' => 'Malawi',
+    'MX' => 'Mexico',
+    'MY' => 'Malaysia',
+    'MZ' => 'Mozambique',
+    'N/A' => 'Not Applicable (local IP…)',
+    'NA' => 'Namibia',
+    'NC' => 'New Caledonia',
+    'NE' => 'Niger',
+    'NF' => 'Norfolk Island',
+    'NG' => 'Nigeria',
+    'NI' => 'Nicaragua',
+    'NL' => 'Netherlands',
+    'NO' => 'Norway',
+    'NP' => 'Nepal',
+    'NR' => 'Nauru',
+    'NU' => 'Niue',
+    'NZ' => 'New Zealand',
+    'OM' => 'Oman',
+    'PA' => 'Panama',
+    'PE' => 'Peru',
+    'PF' => 'French Polynesia',
+    'PG' => 'Papua New Guinea',
+    'PH' => 'Philippines',
+    'PK' => 'Pakistan',
+    'PL' => 'Poland',
+    'PM' => 'Saint Pierre and Miquelon',
+    'PN' => 'Pitcairn',
+    'PR' => 'Puerto Rico',
+    'PS' => 'Palestine, State of',
+    'PT' => 'Portugal',
+    'PW' => 'Palau',
+    'PY' => 'Paraguay',
+    'QA' => 'Qatar',
+    'RE' => 'Réunion',
+    'RO' => 'Romania',
+    'RS' => 'Serbia',
+    'RU' => 'Russian Federation',
+    'RW' => 'Rwanda',
+    'SA' => 'Saudi Arabia',
+    'SB' => 'Solomon Islands',
+    'SC' => 'Seychelles',
+    'SD' => 'Sudan',
+    'SE' => 'Sweden',
+    'SG' => 'Singapore',
+    'SH' => 'Saint Helena, Ascension and Tristan da Cunha',
+    'SI' => 'Slovenia',
+    'SJ' => 'Svalbard and Jan Mayen',
+    'SK' => 'Slovakia',
+    'SL' => 'Sierra Leone',
+    'SM' => 'San Marino',
+    'SN' => 'Senegal',
+    'SO' => 'Somalia',
+    'SR' => 'Suriname',
+    'SS' => 'South Sudan',
+    'ST' => 'Sao Tome and Principe',
+    'SV' => 'El Salvador',
+    'SX' => 'Sint Maarten (Dutch part)',
+    'SY' => 'Syrian Arab Republic',
+    'SZ' => 'Swaziland',
+    'TC' => 'Turks and Caicos Islands',
+    'TD' => 'Chad',
+    'TF' => 'French Southern Territories',
+    'TG' => 'Togo',
+    'TH' => 'Thailand',
+    'TJ' => 'Tajikistan',
+    'TK' => 'Tokelau',
+    'TL' => 'Timor-Leste',
+    'TM' => 'Turkmenistan',
+    'TN' => 'Tunisia',
+    'TO' => 'Tonga',
+    'TR' => 'Turkey',
+    'TT' => 'Trinidad and Tobago',
+    'TV' => 'Tuvalu',
+    'TW' => 'Taiwan, Province of China',
+    'TZ' => 'Tanzania, United Republic of',
+    'UA' => 'Ukraine',
+    'UG' => 'Uganda',
+    'UM' => 'United States Minor Outlying Islands',
+    'US' => 'United States',
+    'UY' => 'Uruguay',
+    'UZ' => 'Uzbekistan',
+    'VA' => 'Holy See (Vatican City State)',
+    'VC' => 'Saint Vincent and the Grenadines',
+    'VE' => 'Venezuela, Bolivarian Republic of',
+    'VG' => 'Virgin Islands, British',
+    'VI' => 'Virgin Islands, U.S.',
+    'VN' => 'Viet Nam',
+    'VU' => 'Vanuatu',
+    'WF' => 'Wallis and Futuna',
+    'WS' => 'Samoa',
+    'YE' => 'Yemen',
+    'YT' => 'Mayotte',
+    'ZA' => 'South Africa',
+    'ZM' => 'Zambia',
+    'ZW' => 'Zimbabwe',
+];
diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php
new file mode 100644
index 0000000000..054a23c3b0
--- /dev/null
+++ b/modules/Admin/Language/de/Episode.php
@@ -0,0 +1,165 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'season' => 'Season {seasonNumber}',
+    'season_abbr' => 'S{seasonNumber}',
+    'number' => 'Episode {episodeNumber}',
+    'number_abbr' => 'Ep. {episodeNumber}',
+    'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
+    'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
+    'number_of_comments' => '{numberOfComments, plural,
+        one {# comment}
+        other {# comments}
+    }',
+    'all_podcast_episodes' => 'All podcast episodes',
+    'back_to_podcast' => 'Go back to podcast',
+    'edit' => 'Edit',
+    'publish' => 'Publish',
+    'publish_edit' => 'Edit publication',
+    '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',
+    'publication_status' => [
+        'published' => 'Published',
+        'scheduled' => 'Scheduled',
+        'not_published' => 'Not published',
+    ],
+    'list' => [
+        'episode' => 'Episode',
+        'visibility' => 'Visibility',
+        'comments' => 'Comments',
+        'actions' => 'Actions',
+    ],
+    'messages' => [
+        'createSuccess' => 'Episode has been successfully created!',
+        'editSuccess' => 'Episode has been successfully updated!',
+        'publishCancelSuccess' => 'Episode publication successfully cancelled!',
+    ],
+    'form' => [
+        'file_size_error' =>
+            'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.',
+        'audio_file' => 'Audio file',
+        'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.',
+        'info_section_title' => 'Episode info',
+        'cover' => 'Episode cover',
+        'cover_hint' =>
+            'If you do not set a cover, the podcast cover will be used instead.',
+        'cover_size_hint' => 'Cover must be squared with at least 1400px wide and tall.',
+        'title' => 'Title',
+        'title_hint' =>
+            'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.',
+        'permalink' => 'Permalink',
+        'season_number' => 'Season',
+        'episode_number' => 'Episode',
+        'type' => [
+            'label' => 'Type',
+            'full' => 'Full',
+            'full_hint' => 'Complete content (the episode)',
+            'trailer' => 'Trailer',
+            'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show',
+            'bonus' => 'Bonus',
+            'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show',
+        ],
+        'parental_advisory' => [
+            'label' => 'Parental advisory',
+            'hint' => 'Does the episode contain explicit content?',
+            'undefined' => 'undefined',
+            'clean' => 'Clean',
+            'explicit' => 'Explicit',
+        ],
+        'show_notes_section_title' => 'Show notes',
+        'show_notes_section_subtitle' =>
+            'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
+        'description' => 'Description',
+        'description_footer' => 'Description footer',
+        'description_footer_hint' =>
+            'This text is added at the end of each episode description, it is a good place to input your social links for example.',
+        'additional_files_section_title' => 'Additional files',
+        'additional_files_section_subtitle' =>
+            'These files may be used by other platforms to provide better experience to your audience.<br />See the {podcastNamespaceLink} for more information.',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this episode about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real or fictional location',
+        'transcript' => 'Transcript (subtitles / closed captions)',
+        'transcript_hint' => 'Only .srt are allowed.',
+        'transcript_download' => 'Download transcript',
+        'transcript_file' => 'Transcript file (.srt)',
+        'transcript_remote_url' => 'Remote url for transcript',
+        'transcript_file_delete' => 'Delete transcript file',
+        'chapters' => 'Chapters',
+        'chapters_hint' => 'File must be in JSON Chapters format.',
+        'chapters_download' => 'Download chapters',
+        'chapters_file' => 'Chapters file',
+        'chapters_remote_url' => 'Remote url for chapters file',
+        'chapters_file_delete' => 'Delete chapters file',
+        'advanced_section_title' => 'Advanced Parameters',
+        'advanced_section_subtitle' =>
+            'If you need RSS tags that Castopod does not handle, set them here.',
+        'custom_rss' => 'Custom RSS tags for the episode',
+        'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.',
+        'block' => 'Episode should be hidden from all platforms',
+        'block_hint' =>
+            'The episode show or hide post. If you want this episode removed from the Apple directory, toggle this on.',
+        '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',
+        ],
+        '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 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 the posts associated with it and remove it from the podcast's RSS feed.",
+        '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/de/EpisodeNavigation.php b/modules/Admin/Language/de/EpisodeNavigation.php
new file mode 100644
index 0000000000..1406e3010e
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/Fediverse.php b/modules/Admin/Language/de/Fediverse.php
new file mode 100644
index 0000000000..0e4ca66d89
--- /dev/null
+++ b/modules/Admin/Language/de/Fediverse.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'messages' => [
+        'actorNotFound' => 'The account could not be found!',
+        'blockActorSuccess' => '{actor} has been blocked!',
+        'unblockActorSuccess' => 'Actor has been unblocked!',
+        'blockDomainSuccess' => '{domain} has been blocked!',
+        'unblockDomainSuccess' => '{domain} has been unblocked!',
+    ],
+    'blocked_actors' => 'Blocked accounts',
+    'blocked_domains' => 'Blocked domains',
+    'block_lists_form' => [
+        'handle' => 'Account handle',
+        'handle_hint' => 'Input @username@domain account.',
+        'domain' => 'Domain name',
+        'submit' => 'Block!',
+    ],
+    'list' => [
+        'actor' => 'Account',
+        'domain' => 'Domain name',
+        'unblock' => 'Unblock',
+    ],
+];
diff --git a/modules/Admin/Language/de/Home.php b/modules/Admin/Language/de/Home.php
new file mode 100644
index 0000000000..3ff4c04dc8
--- /dev/null
+++ b/modules/Admin/Language/de/Home.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'all_podcasts' => 'All podcasts',
+    'no_podcast' => 'No podcast found',
+];
diff --git a/modules/Admin/Language/de/Install.php b/modules/Admin/Language/de/Install.php
new file mode 100644
index 0000000000..36e373a285
--- /dev/null
+++ b/modules/Admin/Language/de/Install.php
@@ -0,0 +1,61 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright  2020 Ad Aures
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'manual_config' => 'Manual configuration',
+    'manual_config_subtitle' =>
+        'Create a `.env` file with your settings and refresh the page to continue installation.',
+    'form' => [
+        'instance_config' => 'Instance configuration',
+        'hostname' => 'Hostname',
+        'media_base_url' => 'Media base URL',
+        'media_base_url_hint' =>
+            'If you use a CDN and/or an external analytics service, you may set them here.',
+        'admin_gateway' => 'Admin gateway',
+        'admin_gateway_hint' =>
+            'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.',
+        'auth_gateway' => 'Auth gateway',
+        'auth_gateway_hint' =>
+            'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.',
+        'database_config' => 'Database configuration',
+        'database_config_hint' =>
+            'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.',
+        'db_hostname' => 'Database hostname',
+        'db_name' => 'Database name',
+        'db_username' => 'Database username',
+        'db_password' => 'Database password',
+        'db_prefix' => 'Database prefix',
+        'db_prefix_hint' =>
+            "The prefix of the Castopod table names, leave as is if you don't know what it means.",
+        'cache_config' => 'Cache configuration',
+        'cache_config_hint' =>
+            'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.',
+        'cache_handler' => 'Cache handler',
+        'cacheHandlerOptions' => [
+            'file' => 'File',
+            'redis' => 'Redis',
+            'predis' => 'Predis',
+        ],
+        'next' => 'Next',
+        'submit' => 'Finish install',
+        'create_superadmin' => 'Create your superadmin account',
+        'email' => 'Email',
+        'username' => 'Username',
+        'password' => 'Password',
+    ],
+    'messages' => [
+        'createSuperAdminSuccess' =>
+            'Your superadmin account has been created successfully. Login to start podcasting!',
+        'databaseConnectError' =>
+            'Castopod could not connect to your database. Edit your database configuration and try again.',
+        'writeError' =>
+            "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.",
+    ],
+];
diff --git a/modules/Admin/Language/de/MyAccount.php b/modules/Admin/Language/de/MyAccount.php
new file mode 100644
index 0000000000..6ebbb30ef7
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/Navigation.php b/modules/Admin/Language/de/Navigation.php
new file mode 100644
index 0000000000..68d4609d5d
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/Page.php b/modules/Admin/Language/de/Page.php
new file mode 100644
index 0000000000..b6f49de574
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/Pager.php b/modules/Admin/Language/de/Pager.php
new file mode 100644
index 0000000000..e25ee63810
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/Person.php b/modules/Admin/Language/de/Person.php
new file mode 100644
index 0000000000..fa9bba2118
--- /dev/null
+++ b/modules/Admin/Language/de/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 with 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/de/Platforms.php b/modules/Admin/Language/de/Platforms.php
new file mode 100644
index 0000000000..ab17d5999b
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/Podcast.php b/modules/Admin/Language/de/Podcast.php
new file mode 100644
index 0000000000..d9d0d11b03
--- /dev/null
+++ b/modules/Admin/Language/de/Podcast.php
@@ -0,0 +1,243 @@
+<?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',
+    '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',
+    'messages' => [
+        'createSuccess' => 'Podcast has been successfully created!',
+        'editSuccess' => 'Podcast has been successfully updated!',
+        'importSuccess' => 'Podcast has been successfully imported!',
+    ],
+    '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 with at least 1400px wide and tall.',
+        'banner' => 'Podcast banner',
+        'banner_size_hint' => 'Banner must have a 3:1 ratio with 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.',
+        '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 all platforms',
+        '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',
+    ],
+    '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 {<span class="font-semibold">#</span> follower}
+        other {<span class="font-semibold">#</span> followers}
+    }',
+    'posts' => '{numberOfPosts, plural,
+        one {<span class="font-semibold">#</span> post}
+        other {<span class="font-semibold">#</span> 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/de/PodcastImport.php b/modules/Admin/Language/de/PodcastImport.php
new file mode 100644
index 0000000000..e9cfc1c4ce
--- /dev/null
+++ b/modules/Admin/Language/de/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.<br/>As the current version does not show any progress while it runs, you will not see anything updated until it is done.<br/>In case of timeout error, increase `max_execution_time` value.',
+    'old_podcast_section_title' => 'The podcast to import',
+    'old_podcast_section_subtitle' =>
+        'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.',
+    'imported_feed_url' => 'Feed URL',
+    'imported_feed_url_hint' => 'The feed must be in xml or rss format.',
+    'new_podcast_section_title' => 'The new podcast',
+    'advanced_params_section_title' => 'Advanced parameters',
+    'advanced_params_section_subtitle' =>
+        'Keep the default values if you have no idea of what the fields are for.',
+    'slug_field' => 'Field to be used to calculate episode slug',
+    'description_field' =>
+        'Source field used for episode description / show notes',
+    'force_renumber' => 'Force episodes renumbering',
+    'force_renumber_hint' =>
+        'Use this if your podcast does not have episode numbers but wish to set them during import.',
+    'season_number' => 'Season number',
+    'season_number_hint' =>
+        'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.',
+    'max_episodes' => 'Maximum number of episodes to import',
+    'max_episodes_hint' => 'Leave blank to import all episodes',
+    'lock_import' =>
+        'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.',
+    'submit' => 'Import podcast',
+];
diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php
new file mode 100644
index 0000000000..b619573154
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/Settings.php b/modules/Admin/Language/de/Settings.php
new file mode 100644
index 0000000000..0d6368ccd2
--- /dev/null
+++ b/modules/Admin/Language/de/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 with 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/de/Soundbite.php b/modules/Admin/Language/de/Soundbite.php
new file mode 100644
index 0000000000..a3f828fe09
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/User.php b/modules/Admin/Language/de/User.php
new file mode 100644
index 0000000000..8b2e478bf7
--- /dev/null
+++ b/modules/Admin/Language/de/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' => "Edit {username}'s roles",
+    'forcePassReset' => 'Force pass reset',
+    'ban' => 'Ban',
+    'unban' => 'Unban',
+    'delete' => 'Delete',
+    'create' => 'New user',
+    'view' => "{username}'s info",
+    'all_users' => 'All users',
+    'list' => [
+        'user' => 'User',
+        'roles' => 'Roles',
+        '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!',
+    ],
+    'roles' => [
+        'superadmin' => 'Super admin',
+    ],
+    'messages' => [
+        'createSuccess' =>
+            'User created successfully! {username} will be prompted with a password reset upon first authentication.',
+        '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/de/Validation.php b/modules/Admin/Language/de/Validation.php
new file mode 100644
index 0000000000..750b19688f
--- /dev/null
+++ b/modules/Admin/Language/de/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/de/VideoClip.php b/modules/Admin/Language/de/VideoClip.php
new file mode 100644
index 0000000000..638de697bb
--- /dev/null
+++ b/modules/Admin/Language/de/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/Install/Language/de/Install.php b/modules/Install/Language/de/Install.php
new file mode 100644
index 0000000000..1f66ef118f
--- /dev/null
+++ b/modules/Install/Language/de/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.",
+    ],
+];
-- 
GitLab