diff --git a/app/Language/br/Comment.php b/app/Language/br/Comment.php
index 65d9b9b18d6466f0eef7a85842168a383153d212..e46befd1e8e7f1058d81ceed0b4113daf5f9a9ec 100644
--- a/app/Language/br/Comment.php
+++ b/app/Language/br/Comment.php
@@ -10,7 +10,7 @@ declare(strict_types=1);
 
 return [
     'title' => "Evezhiadenn {actorDisplayName} evit {episodeTitle}",
-    'back_to_comments' => "Distreiñ d'an evezhiadennoù",
+    'back_to_comments' => 'Distreiñ d\'an evezhiadennoù',
     'form' => [
         'episode_message_placeholder' => 'Skrivañ un evezhiadenn…',
         'reply_to_placeholder' => 'Respont da @{actorUsername}',
diff --git a/app/Language/br/Common.php b/app/Language/br/Common.php
index d50e0372cba08ea9e9370b67f6a5cb899a9ef298..7c51dad6a708b6947886edd0bc38a3be99f053c6 100644
--- a/app/Language/br/Common.php
+++ b/app/Language/br/Common.php
@@ -15,15 +15,15 @@ return [
     'optional' => 'Diret',
     'close' => 'Serriñ',
     'home' => 'Degemer',
-    'explicit' => "Endalc'had evit an oadourien",
+    'explicit' => 'Endalc\'had evit an oadourien',
     'powered_by' => 'Lusket gant {castopod}',
     'go_back' => 'Mont war-gil',
     'play_episode_button' => [
         'play' => 'Lenn',
         'playing' => 'O lenn',
     ],
-    'read_more' => "Lenn muioc'h",
-    'read_less' => "Lenn nebeutoc'h",
-    'see_more' => "Gwelout muioc'h",
-    'see_less' => "Gwelout nebeutoc'h",
+    'read_more' => 'Lenn muioc\'h',
+    'read_less' => 'Lenn nebeutoc\'h',
+    'see_more' => 'Gwelout muioc\'h',
+    'see_less' => 'Gwelout nebeutoc\'h',
 ];
diff --git a/app/Language/br/Episode.php b/app/Language/br/Episode.php
index b470439c50ff3ccf04cad741699a7763d64db312..a8ff6012da148b5fbaadb29fa00c8cefc54cc339 100644
--- a/app/Language/br/Episode.php
+++ b/app/Language/br/Episode.php
@@ -38,5 +38,5 @@ return [
         other {# evezhiadenn}
     }',
     'all_podcast_episodes' => 'Holl rannoù ar podkast',
-    'back_to_podcast' => "Mont d'ar podkast en-dro",
+    'back_to_podcast' => 'Mont d\'ar podkast en-dro',
 ];
diff --git a/app/Language/br/Fediverse.php b/app/Language/br/Fediverse.php
index 38496f79b6be1b7a7a8e3f106b2354da191f7b1b..1ea402988e80226ceaf14274f6eaa229331c3784 100644
--- a/app/Language/br/Fediverse.php
+++ b/app/Language/br/Fediverse.php
@@ -10,28 +10,28 @@ declare(strict_types=1);
 
 return [
     'your_handle' => 'Ho tornell (ho lesanv)',
-    'your_handle_hint' => "Skrivit an @anv@domani a fell deoc'h ober gantañ.",
+    'your_handle_hint' => 'Skrivit an @anv@domani a fell deoc\'h ober gantañ.',
     'follow' => [
         'label' => 'Heuliañ',
         'title' => 'Heuliañ {actorDisplayName}',
-        'subtitle' => "Emaoc'h o vont da heuliañ:",
-        'accountNotFound' => "N'eo ket bet kavet ar gont-se.",
-        'remoteFollowNotAllowed' => "N'eo ket aotreet heuliañ a-bell gant servijer ar gont-se war a seblant…",
-        'submit' => "Kenderc'hel gant an heuliañ",
+        'subtitle' => 'Emaoc\'h o vont da heuliañ:',
+        'accountNotFound' => 'N\'eo ket bet kavet ar gont-se.',
+        'remoteFollowNotAllowed' => 'N\'eo ket aotreet heuliañ a-bell gant servijer ar gont-se war a seblant…',
+        'submit' => 'Kenderc\'hel gant an heuliañ',
     ],
     'favourite' => [
         'title' => "Ouzhpennañ kemennadenn {actorDisplayName} d'ho re garetañ",
-        'subtitle' => "Emaoc'h o vont da ouzhpennañ d'ho re garetañ:",
-        'submit' => "Kenderc'hel gant an ouzhpennañ d'ho re garetañ",
+        'subtitle' => 'Emaoc\'h o vont da ouzhpennañ d\'ho re garetañ:',
+        'submit' => 'Kenderc\'hel gant an ouzhpennañ d\'ho re garetañ',
     ],
     'reblog' => [
         'title' => "Rannañ kemennadenn {actorDisplayName}",
-        'subtitle' => "Emaoc'h o vont da rannañ:",
-        'submit' => "Kenderc'hel gant ar rannañ",
+        'subtitle' => 'Emaoc\'h o vont da rannañ:',
+        'submit' => 'Kenderc\'hel gant ar rannañ',
     ],
     'reply' => [
         'title' => "Respont da gemennadenn {actorDisplayName}",
-        'subtitle' => "Emaoc'h o vont da respont da:",
-        'submit' => "Kenderc'hel gant ar respont",
+        'subtitle' => 'Emaoc\'h o vont da respont da:',
+        'submit' => 'Kenderc\'hel gant ar respont',
     ],
 ];
diff --git a/app/Language/br/Home.php b/app/Language/br/Home.php
index c00fef8a7cf9ac94221a629e528d898f210585cb..f2d6fcf576a0da8e2e1cf7875e8e632a7f4b973e 100644
--- a/app/Language/br/Home.php
+++ b/app/Language/br/Home.php
@@ -16,5 +16,5 @@ return [
         'created_desc' => 'Ar re nevez da gentañ',
         'created_asc' => 'A re goshañ da gentañ',
     ],
-    'no_podcast' => "N'eo bet kavet podkast ebet",
+    'no_podcast' => 'N\'eo bet kavet podkast ebet',
 ];
diff --git a/app/Language/br/Page.php b/app/Language/br/Page.php
index aca92916efa728b0899d3ea58990b5b4281b67ce..8399ec58fb6a979ab68afb71e6aaadcf97f1057c 100644
--- a/app/Language/br/Page.php
+++ b/app/Language/br/Page.php
@@ -9,9 +9,9 @@ declare(strict_types=1);
  */
 
 return [
-    'back_to_home' => "Distreiñ d'ar bennbajennad",
+    'back_to_home' => 'Distreiñ d\'ar bennbajennad',
     'map' => [
         'title' => 'Kartenn',
-        'description' => "Dizoloit rannoù eus podkastoù war {siteName} lakaet war ur gartenn! Beajit warni ha selaouit ar rannoù a zo diwar-benn al lec'hioù-se.",
+        'description' => 'Dizoloit rannoù eus podkastoù war {siteName} lakaet war ur gartenn! Beajit warni ha selaouit ar rannoù a zo diwar-benn al lec\'hioù-se.',
     ],
 ];
diff --git a/app/Language/br/Podcast.php b/app/Language/br/Podcast.php
index 083a246d1026f1d06f8bb17e80e60355fdbfb239..f6b5f5307cdf77f66c44b7d57f5c35c21a1032de 100644
--- a/app/Language/br/Podcast.php
+++ b/app/Language/br/Podcast.php
@@ -14,9 +14,9 @@ return [
     'list_of_episodes_year' => 'Rannoù {year} ({episodeCount})',
     'list_of_episodes_season' =>
         'Rannoù koulzad {seasonNumber} ({episodeCount})',
-    'no_episode' => "N'eo bet kavet rann ebet!",
+    'no_episode' => 'N\'eo bet kavet rann ebet!',
     'follow' => 'Heuliañ',
-    'followTitle' => "Heuliañ {actorDisplayName} war ar c'hevrebed!",
+    'followTitle' => 'Heuliañ {actorDisplayName} war ar c\'hevrebed!',
     'followers' => '{numberOfFollowers, plural,
         0 {heulier·ez ebet}
         one {<span class="font-semibold">#</span> heulier·ez}
@@ -114,7 +114,7 @@ return [
         'first_published_at' => 'Embannet eo bet ar rann gentañ d\'an/d\'ar<span class="font-semibold">{0, date, medium}</span>',
     ],
     'sponsor' => 'Harpit',
-    'funding_links' => "Liammoù evit arc'hantaouiñ {podcastTitle}",
+    'funding_links' => 'Liammoù evit arc\'hantaouiñ {podcastTitle}',
     'find_on' => 'Kavit {podcastTitle} war',
     'listen_on' => 'Selaouit war',
     'persons' => '{personsCount, plural,
diff --git a/app/Language/de/Post.php b/app/Language/de/Post.php
index e964a263ef452858134ad2810ea1062f5556630c..cb84da880462b25e3682457ba35264b3131e7dbf 100644
--- a/app/Language/de/Post.php
+++ b/app/Language/de/Post.php
@@ -10,7 +10,7 @@ declare(strict_types=1);
 
 return [
     'title' => "{actorDisplayName}'s Beitrag",
-    'back_to_actor_posts' => "Zurück zu {actor}'s Beiträge",
+    'back_to_actor_posts' => 'Zurück zu {actor}\'s Beiträge',
     'actor_shared' => '{actor} teilte',
     'reply_to' => 'Antorten auf @{actorUsername}',
     'form' => [
diff --git a/app/Language/fr/Comment.php b/app/Language/fr/Comment.php
index 2208aa78cb18c6eb59afa0339353a830c782b02d..a36105f593554c83c44d7a8643e47fa22c10c1f3 100644
--- a/app/Language/fr/Comment.php
+++ b/app/Language/fr/Comment.php
@@ -17,7 +17,7 @@ return [
         'submit' => 'Envoyer !',
         'submit_reply' => 'Répondre',
     ],
-    'likes' => "{numberOfLikes} j'aime",
+    'likes' => '{numberOfLikes} j\'aime',
     'replies' => '{numberOfReplies, plural,
         one {# réponse}
         other {# réponses}
diff --git a/docs/src/ar/getting-started/update.md b/docs/src/ar/getting-started/update.md
index 1f48e274922fd3affdc428ffd59a8d79909dcab7..51e372ee8d9fc129118ee3c05c3d61dbd97a5005 100644
--- a/docs/src/ar/getting-started/update.md
+++ b/docs/src/ar/getting-started/update.md
@@ -46,8 +46,7 @@ improvements âš¡.
 
    - 👉 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)
+   - I haven't 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!
@@ -62,7 +61,7 @@ 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?
+### [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)
 
 No problem! Just get the latest release as described above. Only, when going
 through the release instructions (4), perform them sequentially, from the oldest
diff --git a/docs/src/br/getting-started/update.md b/docs/src/br/getting-started/update.md
index 1f48e274922fd3affdc428ffd59a8d79909dcab7..51e372ee8d9fc129118ee3c05c3d61dbd97a5005 100644
--- a/docs/src/br/getting-started/update.md
+++ b/docs/src/br/getting-started/update.md
@@ -46,8 +46,7 @@ improvements âš¡.
 
    - 👉 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)
+   - I haven't 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!
@@ -62,7 +61,7 @@ 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?
+### [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)
 
 No problem! Just get the latest release as described above. Only, when going
 through the release instructions (4), perform them sequentially, from the oldest
diff --git a/docs/src/es/getting-started/update.md b/docs/src/es/getting-started/update.md
index 1f48e274922fd3affdc428ffd59a8d79909dcab7..46e5c0bf388934a89335238cd915353242dc7490 100644
--- a/docs/src/es/getting-started/update.md
+++ b/docs/src/es/getting-started/update.md
@@ -46,8 +46,7 @@ improvements âš¡.
 
    - 👉 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)
+   - I haven't 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!
@@ -62,11 +61,11 @@ 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?
+### [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)
 
-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.
+No problem! 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.
diff --git a/docs/src/fr/getting-started/install.md b/docs/src/fr/getting-started/install.md
index 708808bade2ad3ecf310e42af5e1624077114d1f..fbdf5a5ddd3a6021c45c16455ceffb04444846bf 100644
--- a/docs/src/fr/getting-started/install.md
+++ b/docs/src/fr/getting-started/install.md
@@ -20,19 +20,19 @@ serveurs web compatibles avec PHP-MySQL.
 La version 8.0 ou supérieure de PHP est requise, avec les extensions suivantes
 installées :
 
-- [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)
+- [intl](https://www.php.net/manual/fr/intl.requirements.php)
+- [libcurl](https://www.php.net/manual/fr/curl.requirements.php)
+- [mbstring](https://www.php.net/manual/fr/mbstring.installation.php)
 - [gd](https://www.php.net/manual/en/image.installation.php) avec **JPEG**,
   **PNG** et bibliothèques **WEBP**.
-- [exif](https://www.php.net/manual/en/exif.installation.php)
+- [exif](https://www.php.net/manual/fr/exif.installation.php)
 
 De plus, assurez-vous que les extensions suivantes sont activées dans votre PHP
 :
 
 - json (activé par défaut - ne le désactivez pas)
 - xml (activé par défaut - ne pas le désactiver)
-- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
+- [mysqlnd](https://www.php.net/manual/fr/mysqlnd.install.php)
 
 ### Base de données compatible MySQL
 
@@ -110,60 +110,61 @@ installées :
       * * * * * /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.
+   > Ces tâches s'exécutent **toutes les minutes**. Vous pouvez régler la
+   > fréquence en fonction de vos besoins : toutes les 5, 10 minutes ou plus.
 
-### (recommended) Install Wizard
+### (Méthode recommandée) Assistant d'installation
 
-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!
+1. Exécutez le script d'installation de Castopod en vous rendant sur la page
+   d'assistant d'installation (`https://votre_domain_name.com/cp-install`) dans
+   votre navigateur Web favori.
+2. Suivez les instructions affichée.
+3. Commencer à baladodiffuser !
 
-::: info Note
+::: info Nota Bene
 
-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).
+Le script install crée un fichier `.env` à la racine du paquet. Si vous ne
+pouvez pas passer par l'assistant d'installation, vous pouvez
+[créer et mettre à jour le fichier `.env` manuellement](#alternative-manual-configuration).
 
 :::
 
-## Community packages
+## Paquets fournis par la communauté
 
-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.
+Si vous ne voulez pas vous soucier d'installer Castopod manuellement, vous
+pouvez utiliser un des paquets créés et maintenus par la communauté open-source.
 
-### Install with YunoHost
+### Installer avec 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.
+[YunoHost](https://yunohost.org/) est une distribution basée sur Debian
+GNU/Linux composée de paquets logiciels libres et open-source. Il simplifie
+l'auto-hébergement pour vous.
 
 <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" />
+   <img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Installer avec 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>
+   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>Dépôt
+Github</a>
 
 </div>
 
-### Install with Docker
+### Installer avec Docker
 
-If you wish to use Docker to install Castopod, it is possible thanks to
-[Romain de Laage](https://mamot.fr/@rdelaage)!
+Si vous souhaitez utiliser Docker pour installer Castopod, c'est possible grâce
+à [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
+<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
+::: info Nota Bene
 
-Given high demand for docker, we plan on maintaining an official Castopod Docker
-image directly into the Castopod repository.
+Étant donné la forte demande de Docker, nous prévoyons de maintenir une image
+officielle de Castopod Docker directement dans le dépôt Castopod.
 
 :::
diff --git a/docs/src/fr/getting-started/security.md b/docs/src/fr/getting-started/security.md
index e205698df8a8029f080840922a212f01da1baa7e..868fa0659ae698a5cf04a5a2ac4729b1091d6ade 100644
--- a/docs/src/fr/getting-started/security.md
+++ b/docs/src/fr/getting-started/security.md
@@ -1,23 +1,25 @@
 ---
-title: Security
+title: Sécurité
 ---
 
-# Security concerns
+# Questions de sécurité
 
-Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
-framework that encourages
-[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
+Castopod est développé sur [CodeIgniter4](https://codeigniter.com/), un
+framework PHP qui encourage
+[de bonnes pratiques de sécurité](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):
+Pour garantir au mieux la sécurité de votre instance et éviter les attaques
+malveillantes, nous vous recommandons de mettre à jour les permissions des
+fichiers de Castopod après l'installation et chaque mise à jour (et éviter toute
+erreur de droit d'accès aux fichiers) :
 
-- `writable/` folder must be **readable** and **writable**.
-- `public/media/` folder must be **readable** and **writable**.
-- any other file must be set to **readonly**.
+- Le dossier `writable/` doit être accessible en **lecture** et en **écriture**.
+- Le dossier `public/media/` doit être accessible en **lecture** et en
+  **écriture**.
+- tout autre fichier doit être accessible en **lecture seule**.
 
-For instance, if you are using Apache or NGINX with Ubuntu you may do the
-following:
+Par exemple, si vous utilisez Apache ou NGINX avec Ubuntu, vous pouvez exécuter
+les commandes suivantes :
 
 ```bash
 sudo chown -R root:root /path/to/castopod
diff --git a/docs/src/fr/getting-started/update.md b/docs/src/fr/getting-started/update.md
index 6632c5f770a276759f91d6a51478c7789f819c75..de303a2b8462703ebd614f007ceda2c466178d0d 100644
--- a/docs/src/fr/getting-started/update.md
+++ b/docs/src/fr/getting-started/update.md
@@ -1,54 +1,58 @@
 ---
-title: Update
+title: Mise à jour
 sidebarDepth: 3
 ---
 
-# How to update Castopod?
+# Comment installer 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 âš¡.
+Après avoir installé Castopod, vous pouvez mettre à jour votre instance vers la
+dernière version afin de profiter des dernières fonctionnalités ✨, des
+corrections de bugs 🐛 et des améliorations de performance ⚡.
 
-## Automatic update instructions
+## Instructions de mise à jour automatique
 
-> Coming soon... 👀
+> Prochainement... 👀
 
-## Manual update instructions
+## Instructions de mise à jour manuelle
 
-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
+1. Allez sur la
+   [page de notes de versions](https://code.castopod.org/adaures/castopod/-/releases)
+   et vérifiez si votre instance est à jour avec la dernière version de
+   Castopod.
 
    - 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
+2. Téléchargez la dernière version du paquet nommé `Castopod Package`. Vous
+   pouvez choisir entre les archives au format `zip` ou `tar.gz`.
 
-   - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
+   - ⚠️ Assurez-vous de bien télécharger le paquet Castopod `Castopod Package`
+     et **PAS** le code source.
 
-3. On your server:
+3. Sur votre serveur :
 
-   - Remove all files except `.env` and `public/media`
-   - Copy the new files from the downloaded package into your server
+   - Supprimer tous les fichiers sauf `.env` et `public/media`
+   - Copiez les nouveaux fichiers du package téléchargé sur votre serveur.
 
-     ::: info Note
+     ::: info Nota Bene
 
-     You may need to reset files permissions as during the install process.
-     Check [Security Concerns](./security.md).
+     Vous devrez peut-être re-définir les autorisations de fichiers comme
+     effectué durant le processus d'installation. Vérifiez les
+     [questions de sécurité](./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.
+4. Les versions peuvent être accompagnées d'instructions de mise à jour
+   supplémentaires (cf. la
+   [page des notes de versions](https://code.castopod.org/adaures/castopod/-/releases)).
+   Il s'agit généralement de scripts de migration de base de données au format
+   `.sql` qui mettent à jour le schéma de votre base de données.
 
    - 👉 Assurez-vous d'exécuter les scripts sur votre interface phpmyadmin ou
      utilisez la ligne de commande pour mettre à jour la base de données avec
      les fichiers du paquet !
-   - cf.
-     [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
+   - Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire
+     ?
 
 5. Si vous utilisez redis, effacez votre cache.
 6. ✨ Votre nouvelle instance est prête !
@@ -63,7 +67,7 @@ bas à gauche.
 Vous pouvez également trouver la version dans le fichier
 `app > Config > Constants.php`.
 
-### Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?
+### [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
 
 Aucun souci ! Il suffit d'obtenir la dernière version comme décrit ci-dessus.
 Lorsque vous exécutez les instructions de mise à jour (4), lancez-les
@@ -81,9 +85,8 @@ la `v1.0.0-beta.1` :
 1. Téléchargez la dernière version, écrasez vos fichiers tout en conservant
    `.env` et `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`.
+2. Effectuez les instructions de mise à jour l'une après l'autre (de la plus
+   ancienne à la plus récente).
 
 3. ✨ Votre nouvelle instance est prête !
 
diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md
index 430867b2b936d6bc3dd2f5701c1a8724cdcf3883..e9b9c15edfd2d97e47b035af7d248b726ec6a6b4 100644
--- a/docs/src/fr/index.md
+++ b/docs/src/fr/index.md
@@ -13,15 +13,15 @@ Castopod est facile à installer et a été conçu avec
 [CodeIgniter4](https://codeigniter.com/), un framework PHP puissant de très
 petite taille.
 
-::: info Status
+::: info Statut
 
-Castopod is currently in **beta** but already quite stable and used by
-podcasters around&nbsp;the&nbsp;world!
+Castopod est actuellement en **version beta** mais est déjà suffisamment stable
+et est utilisé par des podcasters autour partout dans le monde&nbsp;!
 
 :::
 
 <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">Installation<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>
+  <a href="/fr/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">Installer<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>
 
 ## Fonctionnalités
@@ -63,157 +63,169 @@ podcasters around&nbsp;the&nbsp;world!
 - 🌎 &nbsp;support i18n: traduit en Anglais, Français, Polonais, Allemand &
   Brésilien… et bientôt d'autres à venir !
 
-## Motivation
+## Pourquoi Castopod ?
 
-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.
+L'écosystème du podcast est décentralisé par nature : vous pouvez créer votre
+podcast grâce au fichier RSS, le publier sur Internet et le rendre disponible
+partout dans le monde.
 
-It is in fact one of the only media to have stayed this way for a long time.
+C'est en fait l'un des seuls médias à être encore décentralisé aujourd'hui.
 
-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.
+À mesure que les usages évoluent, de plus en plus de gens se retrouvent autour
+du podcast : qu'il s'agisse de créateurs qui y trouvent de nouvelles façons de
+partager leurs idées ou d'auditeurs à la recherche de contenus de qualité.
 
-With podcasting becoming more widely used, some companies are trying to shift it
-towards a more controlled and centralized medium.
+Avec l'avènement du podcast, certaines entreprises se dirigent vers un medium
+plus centralisé et plus contrôlé.
 
-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.
+Castopod a été créé dans le but de fournir une alternative ouverte et durable
+pour l'hébergement de vos podcasts, de promouvoir la décentralisation et ainsi
+de s'assurer que la créativité des podcasteurs puisse rester libre.
 
-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.
+Ce projet s'appuie sur la communauté open-source, plus spécifiquement sur le
+[Fédiverse](https://fediverse.party/en/fediverse/) et sur
+[Podcasting 2.0](https://podcastindex.org/).
 
-## Comparison with other solutions
+## Comparaison avec d'autres 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.
+Nous pensons qu'une solution n'est pas adaptée à tous, tout dépend vos besoins.
+Voici donc un comparatif avec d'autres outils qui vous aidera à juger si
+Castopod est fait pour vous.
 
 ### 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.
+Castopod est souvent appelé "Wordpress pour les podcasts" en raison des points
+communs entre les deux. D'une certaine manière, c'est vrai. Castopod a
+d'ailleurs été inspiré par l'écosystème de Wordpress, en raison de la facilité
+grâce à laquelle sa communauté l'a adopté et du nombre de sites Web qui
+l'utilisent.
 
-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.
+Tout comme Wordpress, Castopod est gratuit & open source, utilise PHP et une
+base de données MySQL et est fourni en paquet facilement installable sur la
+plupart des serveurs web.
 
-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.
+Wordpress est un excellent outil pour créer votre site web et de l'étendre avec
+des plugins pour faire ce que vous souhaitez. C'est un CMS à part entière qui
+vous permet de mettre en line tout type de site web.
 
-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.
+Castopod quant à lui est destiné à répondre aux besoins spécifiques des
+podcasteurs, en se concentrant sur les podcasts et rien d'autre. Vous n'avez
+besoin d'installer aucun plugin pour démarrer votre aventure baladodiffusée.
 
-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.
+Cela permet d'optimiser tout ce qui est spécifique aux podcasts : de la création
+de vos podcasts et la publication de nouveaux épisodes jusqu'à la diffusion, le
+marketing et la mesure d'audience.
 
-Finally, depending on your needs, Wordpress and Castopod can even live side by
-side as they share the same requirements!
+Enfin, en fonction de vos besoins, Wordpress et Castopod peuvent même cohabiter
+car ils partagent les mêmes pré-requis techniques !
 
 ### 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 est un serveur autohébergé, moderne, libre et open-source, dédié à la
+musique. Tout comme Castopod, Funkwhale est sur le Fédivers, un réseau social
+décentralisé, ce qui offre une interopérabilité entre eux.
 
-Funkwhale was initially built around music. And later on, as the project
-evolved, the ability to host podcasts was introduced.
+Funkwhale a été initialement conçu pour la musique. Et plus tard, à mesure que
+le projet a évolué, la capacité d'héberger des podcasts a été introduite.
 
-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, …).
+Contrairement à Funkwhale, Castopod a été pensé et conçu exclusivement pour les
+podcasts. Cela permet une implémentation plus naturelle des fonctionnalités
+propres à l'écosystème du podcast, comme celles de Podcasting 2.0
+(transcriptions, chapitres, géo-localisation, intervenants …).
 
-So, you should probably use Funkwhale if you want to host your music, and use
-Castopod if you want to host your podcasts.
+Vous devriez ainsi probablement utiliser Funkwhale si vous souhaitez héberger
+votre musique et vous tourner vers Castopod si vous souhaitez héberger des
+podcasts.
 
-### Castopod vs other podcast hosts
+### Castopod vs Autres hébergeurs de podcasts
 
-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!
+Il existe de nombreuses solutions pour héberger vos podcasts, dont certaines
+excellentes et [de nombreuses](https://podcastindex.org/apps) ont rejoint
+Castopod dans le train « Podcasting 2.0 » !
 
-Each of these solutions differ from one another, you may compare with the
-[list of features](#features).
+Chacune de ces solutions a ses particularités, vous pouvez comparer grâce à la
+[liste des fonctionnalités](#features).
 
-That being said, there are two main differences with other podcasting solutions:
+Cela étant, on notera deux différences principales avec les autres 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 peut être auto-hébergé et est la seule solution qui vous permet de
+  garder le contrôle total sur ce que vous produisez. D'autre part, comme il est
+  open-source, vous avez le pouvoir de le modifier comme vous le souhaitez.
 
-- 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.
+- Castopod est la seule solution qui intègre aujourd'hui à la fois un réseau
+  social décentralisé avec ActivityPub et des fonctionnalités de « Podcasting
+  2.0 », réduisant ainsi l'écart entre les deux.
 
 ## Contribuer
 
 Vous appréciez Castopod et aimeriez donner un coup de main ? Jetez un œil à la
 documentation suivante pour démarrer.
 
-### Code of conduct
+### Code de conduite
 
-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.
+Castopod a mis en place un Code de Conduite destiné aux personnes souhaitant
+participer au projet. Veuillez lire le manuel
+[CODE_OF_CONDUCT](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
+afin de connaitre quelles actions seront et ne seront pas tolérées.
 
-### Contributing guide
+### Guide de contribution
 
-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.
+Lisez notre [guide de contribution](./contributing/guidelines.md) pour en savoir
+plus sur notre processus de développement et comprendre comment proposer des
+corrections de bogues et des améliorations, et comment compiler et tester vos
+modifications sur Castopod.
 
 ## Contact
 
-You may reach us for help or ask any question you have on:
+Vous pouvez nous joindre pour obtenir de l'aide ou poser toute question que vous
+avez sur :
 
-- [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)
+- [Discord](https://castopod.org/discord) (pour dialoguer en temps réel avec les
+  développeurs et la communauté)
+- [Suivi de problèmes](https://code.castopod.org/adaures/castopod/-/issues)
+  (pour toute demande de nouvelle fonctionnalité ou rapport de bug)
 
-Alternatively, you can follow us on social media platforms to get news about
-Castopod:
+En outre, vous pouvez nous suivre sur les plateformes de réseaux sociaux pour
+obtenir des informations sur Castopod :
 
-- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
+- [podlibre.social](https://podlibre.social/@Castopod) (Instance Mastodon)
 - [Twitter](https://twitter.com/castopod)
 - [LinkedIn](https://linkedin.com/company/castopod)
 - [Facebook](https://www.facebook.com/castopod)
 
-## Sponsors
+## Soutenez-nous
 
-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).
+Le développement de Castopod est rendu possible grâce au soutien de ses
+parrains. Si vous souhaitez aider, n'hésitez pas à
+[parrainer le développement de Castopod](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>
+  <a href="https://adaures.com/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/adaures.svg" alt="Logo d'Ad Aures" class="h-16" /></a>
+  <a href="https://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="Logo de NLnet" class="h-16" /></a>
 </div>
 
-## License
+## Licence
 
-[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
+[Licence publique générale GNU Affero v3](https://choosealicense.com/licenses/agpl-3.0/)
 
 Copyright © 2020-present, [Ad Aures](https://adaures.com/).
-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
+[release-badge]:
+  https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
 [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md
+[license-badge]:
+  https://img.shields.io/github/license/ad-aures/castopod?color=blue
 [contributions]: https://code.castopod.org/adaures/castopod/-/issues
+[contributions-badge]:
+  https://img.shields.io/badge/contributions-welcome-brightgreen.svg
 [semantic-release]: https://github.com/semantic-release/semantic-release
+[semantic-release-badge]:
+  https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
 [discord]: https://castopod.org/discord
+[discord-badge]: https://img.shields.io/badge/chat-on%20discord-7389D8
 [stars]: https://github.com/ad-aures/castopod/stargazers
+[stars-badge]:
+  https://img.shields.io/github/stars/ad-aures/castopod?style=social
 [crowdin]: https://translate.castopod.org/project/castopod
+[crowdin-badge]: https://badges.crowdin.net/castopod/localized.svg
diff --git a/docs/src/it/getting-started/update.md b/docs/src/it/getting-started/update.md
index 1f48e274922fd3affdc428ffd59a8d79909dcab7..51e372ee8d9fc129118ee3c05c3d61dbd97a5005 100644
--- a/docs/src/it/getting-started/update.md
+++ b/docs/src/it/getting-started/update.md
@@ -46,8 +46,7 @@ improvements âš¡.
 
    - 👉 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)
+   - I haven't 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!
@@ -62,7 +61,7 @@ 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?
+### [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)
 
 No problem! Just get the latest release as described above. Only, when going
 through the release instructions (4), perform them sequentially, from the oldest
diff --git a/docs/src/pl/getting-started/update.md b/docs/src/pl/getting-started/update.md
index 1f48e274922fd3affdc428ffd59a8d79909dcab7..51e372ee8d9fc129118ee3c05c3d61dbd97a5005 100644
--- a/docs/src/pl/getting-started/update.md
+++ b/docs/src/pl/getting-started/update.md
@@ -46,8 +46,7 @@ improvements âš¡.
 
    - 👉 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)
+   - I haven't 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!
@@ -62,7 +61,7 @@ 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?
+### [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)
 
 No problem! Just get the latest release as described above. Only, when going
 through the release instructions (4), perform them sequentially, from the oldest
diff --git a/docs/src/ru/getting-started/update.md b/docs/src/ru/getting-started/update.md
index 1f48e274922fd3affdc428ffd59a8d79909dcab7..51e372ee8d9fc129118ee3c05c3d61dbd97a5005 100644
--- a/docs/src/ru/getting-started/update.md
+++ b/docs/src/ru/getting-started/update.md
@@ -46,8 +46,7 @@ improvements âš¡.
 
    - 👉 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)
+   - I haven't 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!
@@ -62,7 +61,7 @@ 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?
+### [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)
 
 No problem! Just get the latest release as described above. Only, when going
 through the release instructions (4), perform them sequentially, from the oldest
diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php
index 9259d07094f061b73a98d1ef7a75543f9366117a..c3ea93ff27cb65a8eaf9fae284c3dca901db48a6 100644
--- a/modules/Admin/Language/br/Breadcrumb.php
+++ b/modules/Admin/Language/br/Breadcrumb.php
@@ -29,14 +29,14 @@ return [
     'fediverse' => 'kevrebed',
     'block-lists' => 'roll ar re stanket',
     'users' => 'implijerien·ezed',
-    'my-account' => "ma c'hont",
+    'my-account' => 'ma c\'hont',
     'change-password' => 'kemmañ ar ger-tremen',
     'import' => 'enporzhiañ ul lanv',
     'platforms' => 'savennoù',
     'social' => 'rouedadoù sokial',
-    'funding' => "arc'hantaouiñ",
+    'funding' => 'arc\'hantaouiñ',
     'analytics' => 'muzulioù heklev',
-    'locations' => "lec'hioù",
+    'locations' => 'lec\'hioù',
     'webpages' => 'pajennoù web',
     'unique-listeners' => 'selaouerien·ezed unel',
     'players' => 'lennerioù',
diff --git a/modules/Admin/Language/br/Charts.php b/modules/Admin/Language/br/Charts.php
index f737d0c006252faaca4788d069a35534c92a16d1..62853c97f25a54d71be7b32ee86ec98ceb472495 100644
--- a/modules/Admin/Language/br/Charts.php
+++ b/modules/Admin/Language/br/Charts.php
@@ -34,5 +34,5 @@ return [
     'monthly_listening_time' => 'Sammad miziek ar badelezh selaou',
     '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)",
+    'podcast_by_bandwidth' => 'Lec\'hed bann implijet bemdez (e MB)',
 ];
diff --git a/modules/Admin/Language/br/Common.php b/modules/Admin/Language/br/Common.php
index cbcb76c9aee3c8fd4db619e148cf4e928c293252..7a0ca7e0e1ca2019db24bcb97a4432439e4c3bfe 100644
--- a/modules/Admin/Language/br/Common.php
+++ b/modules/Admin/Language/br/Common.php
@@ -13,14 +13,14 @@ return [
     'no' => 'Ket',
     'cancel' => 'Nullañ',
     'optional' => 'Diret',
-    'more' => "Muioc'h",
+    'more' => 'Muioc\'h',
     'no_data' => 'Roadenn ebet kavet!',
     'close' => 'Serriñ',
     'edit' => 'Kemmañ',
     'copy' => 'Eilañ',
     'copied' => 'Eilet!',
     'home' => 'Degemer',
-    'explicit' => "Endalc'had evit an oadourien",
+    'explicit' => 'Endalc\'had evit an oadourien',
     'powered_by' => 'Lusket gant {castopod}',
     'actions' => 'Obererezhioù',
     'pageInfo' => 'Pajenn {currentPage} diwar {pageCount}',
@@ -34,9 +34,9 @@ return [
         'multiSelect' => [
             'selectText' => 'Pouezañ da ziuzañ',
             'loadingText' => 'O kargañ…',
-            'noResultsText' => "Disoc'h ebet kavet",
-            'noChoicesText' => "N'eus dibab ebet da ziuzañ",
-            'maxItemText' => "N'haller ket ouzhpennañ elfennoù all",
+            'noResultsText' => 'Disoc\'h ebet kavet',
+            'noChoicesText' => 'N\'eus dibab ebet da ziuzañ',
+            'maxItemText' => 'N\'haller ket ouzhpennañ elfennoù all',
         ],
         'upload_file' => 'Uskargit ur restr',
         'remote_url' => 'URL a-bell',
diff --git a/modules/Admin/Language/br/Countries.php b/modules/Admin/Language/br/Countries.php
index c7c3bbcabc044e79719ddf4bbf5349779bc91e86..2187df8972a7c240470c617e15571c1a0a2fa224 100644
--- a/modules/Admin/Language/br/Countries.php
+++ b/modules/Admin/Language/br/Countries.php
@@ -20,7 +20,7 @@ return [
     'AM' => 'Armenia',
     'AO' => 'Angola',
     'AQ' => 'Antarktik',
-    'AR' => "Arc'hantin",
+    'AR' => 'Arc\'hantin',
     'AS' => 'Samoa Amerikan',
     'AT' => 'Aostria',
     'AU' => 'Aostralia',
@@ -76,7 +76,7 @@ return [
     'EC' => 'Ecuador',
     'EE' => 'Estonia',
     'EG' => 'Egipt',
-    'EH' => "Sahara ar C'hornôg",
+    'EH' => 'Sahara ar C\'hornôg',
     'ER' => 'Eritrea',
     'ES' => 'Spagn',
     'ET' => 'Etiopia',
@@ -85,7 +85,7 @@ return [
     'FK' => 'Maloù, Inizi (Malvinas)',
     'FM' => 'Mikronezia, Stadoù Kevreet',
     'FO' => 'Faroe, Inizi',
-    'FR' => "Bro-C'hall",
+    'FR' => 'Bro-C\'hall',
     'GA' => 'Gabon',
     'GB' => 'Rouantelezh Unanet',
     'GD' => 'Grenada',
@@ -167,10 +167,10 @@ return [
     'MU' => 'Moris',
     'MV' => 'Maldivez',
     'MW' => 'Malawi',
-    'MX' => "Mec'hiko",
+    'MX' => 'Mec\'hiko',
     'MY' => 'Malaysia',
     'MZ' => 'Mozambik',
-    'N/A' => "E-maez danvez (IP lec'hel…)",
+    'N/A' => 'E-maez danvez (IP lec\'hel…)',
     'NA' => 'Namibia',
     'NC' => 'Kaledonia-Nevez',
     'NE' => 'Niger',
@@ -186,7 +186,7 @@ return [
     'OM' => 'Oman',
     'PA' => 'Panama',
     'PE' => 'Perou',
-    'PF' => "Polinezia C'hall",
+    'PF' => 'Polinezia C\'hall',
     'PG' => 'Papoua Ginea-Nevez',
     'PH' => 'Filipinez',
     'PK' => 'Pakistan',
@@ -250,8 +250,8 @@ return [
     'VA' => 'Vatikan',
     'VC' => 'Sant Visant hag an Inizi Granadinas',
     'VE' => 'Venezuela, Republik Volivarian',
-    'VG' => "Inizi Gwerc'h Breizhveurat",
-    'VI' => "Inizi Gwerc'h, S.U.",
+    'VG' => 'Inizi Gwerc\'h Breizhveurat',
+    'VI' => 'Inizi Gwerc\'h, S.U.',
     'VN' => 'Vietnam',
     'VU' => 'Vanuatu',
     'WF' => 'Wallis ha Futuna',
diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php
index e6b8bf403fd72824707f44cc1617ccbb39a4edee..bb303cf5e3cda77118455b93f9a77576c3f7b0fd 100644
--- a/modules/Admin/Language/br/Episode.php
+++ b/modules/Admin/Language/br/Episode.php
@@ -21,7 +21,7 @@ return [
         other {# evezhiadenn}
     }',
     'all_podcast_episodes' => 'Holl rannoù ar podkast',
-    'back_to_podcast' => "Mont d'ar podkast en-dro",
+    'back_to_podcast' => 'Mont d\'ar podkast en-dro',
     'edit' => 'Kemmañ',
     'publish' => 'Embann',
     'publish_edit' => 'Kemmañ an embannadur',
@@ -29,7 +29,7 @@ return [
     'publish_error' => 'Embannet eo bet ar rann dija.',
     'publish_edit_error' => 'Embannet eo bet ar rann dija.',
     'publish_cancel_error' => 'Embannet eo bet ar rann dija.',
-    'unpublish_error' => "N'eo ket bet embannet ar rann.",
+    'unpublish_error' => 'N\'eo ket bet embannet ar rann.',
     'delete' => 'Dilemel',
     'go_to_page' => 'Gwelout ar bajenn',
     'create' => 'Ouzhpennañ ur rann',
@@ -51,17 +51,17 @@ return [
     ],
     'form' => [
         'file_size_error' =>
-            "Re vras eo ho restr! {0} eo ar brasder uhelañ. Dav eo deoc'h kreskaat an talvoudoù `memory_limit`, `upload_max_filesize` ha `post_max_size` en ho restr kefluniañ, a-raok adloc'hañ ho servijer web hag uskargañ ho restr.",
+            'Re vras eo ho restr! {0} eo ar brasder uhelañ. Dav eo deoc\'h kreskaat an talvoudoù `memory_limit`, `upload_max_filesize` ha `post_max_size` en ho restr kefluniañ, a-raok adloc\'hañ ho servijer web hag uskargañ ho restr.',
         'audio_file' => 'Restr aodio',
         'audio_file_hint' => 'Dibabit ur restr .mp3 pe .m4a.',
         'info_section_title' => 'Titouroù ar rann',
         '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' => "Ar golo a rankfe bezañ ur c'harrez 1400px e vent da nebeutañ.",
+            'Ma n\'ho peus ket kaset ur golo e vo implijet hini ar podkast en e blas.',
+        'cover_size_hint' => 'Ar golo a rankfe bezañ ur c\'harrez 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ñ.",
+            'Dleout a rafe anv ar rann, sklaer ha berr. Arabat lakaat niverenn ar rann pe ar c\'houlzad amañ.',
         'permalink' => 'Peurliamm',
         'season_number' => 'Koulzad',
         'episode_number' => 'Rann',
@@ -76,25 +76,25 @@ 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 endalc\'had ha ne zlefe ket gwelet gant bugale?',
             'undefined' => 'andermenet',
             'clean' => 'Dereat',
-            'explicit' => "Endalc'had evit an oadourien",
+            'explicit' => 'Endalc\'had evit an oadourien',
         ],
         'show_notes_section_title' => 'Notennoù ar rann',
         'show_notes_section_subtitle' =>
-            "Betek 4000 arouez, sklaer ha berr. Notennoù a rann a c'hell sikour selaouerien·ezed zo kavout anezhi.",
+            'Betek 4000 arouez, sklaer ha berr. Notennoù a rann a c\'hell sikour selaouerien·ezed zo kavout anezhi.',
         '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 liammoù 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.<br />Sellit ouzh {podcastNamespaceLink} evit muioc'h a ditouroù.",
-        'location_section_title' => "Lec'h",
-        'location_section_subtitle' => "Eus peseurt lec'h ez eus kaoz er rann-mañ?",
-        'location_name' => "Anv pe chomlec'h al lec'h",
-        'location_name_hint' => "Al lec'h-mañ a c'hell bezañ unan gwir pe unan faltaziet",
+            'Ar restroù-mañ a c\'hell bezañ implijet gant savennoù all evit aesaat an traoù d\'ho selaouerien·ezed.<br />Sellit ouzh {podcastNamespaceLink} evit muioc\'h a ditouroù.',
+        'location_section_title' => 'Lec\'h',
+        'location_section_subtitle' => 'Eus peseurt lec\'h ez eus kaoz er rann-mañ?',
+        'location_name' => 'Anv pe chomlec\'h al lec\'h',
+        'location_name_hint' => 'Al lec\'h-mañ a c\'hell bezañ unan gwir pe unan faltaziet',
         'transcript' => 'Treuzskrivadur (istitloù)',
         'transcript_hint' => 'Aotreet e vez nemet .srt.',
         'transcript_download' => 'Pellgargañ an treuzskrivadur',
@@ -107,14 +107,14 @@ return [
         'chapters_file' => 'Restr ar chabistroù',
         'chapters_remote_url' => 'URL a-bell evit restr ar chabistroù',
         'chapters_file_delete' => 'Dilemel restr ar chabistroù',
-        'advanced_section_title' => "Arventennoù kempleshoc'h",
+        'advanced_section_title' => 'Arventennoù kempleshoc\'h',
         'advanced_section_subtitle' =>
-            "M'ho peus ezhomm eus balizennoù RSS ha n'eus ket anezho e Castopod e c'hellit o lakaat amañ.",
+            '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' => 'Ar rann-se a rankfe bezañ kuzhet diouzh an holl savennoù',
         'block_hint' =>
-            "Gwelusted ar rann. Ma fell deoc'h e vefe skarzhet ar rann eus roll Apple, gweredekait ar vaezienn-mañ.",
+            'Gwelusted ar rann. Ma fell deoc\'h e vefe skarzhet ar rann eus roll Apple, gweredekait ar vaezienn-mañ.',
         'submit_create' => 'Krouiñ ar rann',
         'submit_edit' => 'Enrollañ ar rann',
     ],
@@ -136,8 +136,8 @@ return [
         'submit' => 'Embann',
         'submit_edit' => 'Kemmañ an embannadur',
         'cancel_publication' => 'Nullañ an embannadur',
-        'message_warning' => "N'ho peus ket skrivet ur gemennadenn evit brudañ ho rann!",
-        'message_warning_hint' => "Ouzhpennañ ur gemennadenn a lakay muioc'h a dud er jeu, ha diwar se e vo gwelet muioc'h ho rann.",
+        'message_warning' => 'N\'ho peus ket skrivet ur gemennadenn evit brudañ ho rann!',
+        'message_warning_hint' => 'Ouzhpennañ ur gemennadenn a lakay muioc\'h a dud er jeu, ha diwar se e vo gwelet muioc\'h ho rann.',
         'message_warning_submit' => 'Embann memestra',
     ],
     'unpublish_form' => [
@@ -155,9 +155,9 @@ return [
     'embed' => [
         'title' => 'Lenner enkorfet',
         'label' =>
-            "Dibabit ul liv evit an tem, eilit ar c'hod er golver ha pegit anezhañ war ho lec'hienn.",
+            'Dibabit ul liv evit an tem, eilit ar c\'hod er golver ha pegit anezhañ war ho lec\'hienn.',
         'clipboard_iframe' => 'Eilañ al lenner enkorfet er golver',
-        'clipboard_url' => "Eilañ ar chomlec'h er golver",
+        'clipboard_url' => 'Eilañ ar chomlec\'h er golver',
         'dark' => 'Teñval',
         'dark-transparent' => 'Teñval treuzwelus',
         'light' => 'Sklaer',
diff --git a/modules/Admin/Language/br/Fediverse.php b/modules/Admin/Language/br/Fediverse.php
index f93aef578ef5713c36650448ee20883a67239225..9dd1559a6a4e1bb35701f0ab0dbb601fc649ab05 100644
--- a/modules/Admin/Language/br/Fediverse.php
+++ b/modules/Admin/Language/br/Fediverse.php
@@ -10,7 +10,7 @@ declare(strict_types=1);
 
 return [
     'messages' => [
-        'actorNotFound' => "N'eo ket bet kavet ar gont-se!",
+        'actorNotFound' => 'N\'eo ket bet kavet ar gont-se!',
         'blockActorSuccess' => 'Stanket eo bet {actor}!',
         'unblockActorSuccess' => 'Distanket eo bet an implijer·ez!',
         'blockDomainSuccess' => 'Stanket eo bet {domain}!',
diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php
index efccc7d73613bada8381b83ed38ead83f4545a6d..89caae854152a82fcd8d318501cfcff45f2e0b42 100644
--- a/modules/Admin/Language/br/Podcast.php
+++ b/modules/Admin/Language/br/Podcast.php
@@ -10,7 +10,7 @@ declare(strict_types=1);
 
 return [
     'all_podcasts' => 'An holl bodkastoù',
-    'no_podcast' => "N'eo bet kavet podkast ebet!",
+    'no_podcast' => 'N\'eo bet kavet podkast ebet!',
     'create' => 'Krouiñ ur podkast',
     'import' => 'Enporzhiañ ur podkast',
     'new_episode' => 'Rann nevez',
diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php
index 85007ed48b0388197e475501b0ef295e6ae0c8ca..8601bbd7319ea96eb9176cdc70063132721a3c9d 100644
--- a/modules/Admin/Language/de/Podcast.php
+++ b/modules/Admin/Language/de/Podcast.php
@@ -71,7 +71,7 @@ return [
             'Wird von den meisten Plattformen verwendet werden, um den Podcast-Besitz zu überprüfen. Sichtbar im öffentlichen RSS-Feed.',
         'publisher' => 'Herausgeber',
         'publisher_hint' =>
-            "Die Gruppe, die für die Erstellung des Podcasts verantwortlich ist. Oft bezogen auf die Muttergesellschaft oder das Netzwerk eines Podcasts. Dieses Feld wird manchmal als 'Autor' bezeichnet.",
+            'Die Gruppe, die für die Erstellung des Podcasts verantwortlich ist. Oft bezogen auf die Muttergesellschaft oder das Netzwerk eines Podcasts. Dieses Feld wird manchmal als \'Autor\' bezeichnet.',
         'copyright' => 'Urheberrecht',
         'location_section_title' => 'Standort',
         'location_section_subtitle' => 'Ãœber welchen Ort handelt dieser Podcast?',
@@ -143,7 +143,7 @@ return [
         'improv' => 'Improvisation',
         'stand_up' => 'Stand-Up',
         'courses' => 'Kurse',
-        'how_to' => "So geht's",
+        'how_to' => 'So geht\'s',
         'language_learning' => 'Sprachenlernen',
         'self_improvement' => 'Weiterbildung',
         'comedy_fiction' => 'Komödie Fiktion',
diff --git a/modules/Admin/Language/el/Episode.php b/modules/Admin/Language/el/Episode.php
index e90d5bb03262f55997b91b12ca7c172086bcb2bc..a675fcf70fabc182c93417f4329dbafdb8f8975a 100644
--- a/modules/Admin/Language/el/Episode.php
+++ b/modules/Admin/Language/el/Episode.php
@@ -56,7 +56,7 @@ return [
         'info_section_title' => 'Πληροφορίες επεισοδίου',
         'cover' => 'Εξώφυλλο επισοδίου',
         'cover_hint' =>
-            "Εάν δεν ορίσετε ένα εξώφυλλο, το εξώφυλλο του podcast θα χρησιμοποιηθεί αντ 'αυτού.",
+            'Εάν δεν ορίσετε ένα εξώφυλλο, το εξώφυλλο του podcast θα χρησιμοποιηθεί αντ \'αυτού.',
         'cover_size_hint' => 'Το εξώφυλλο πρέπει να είναι τουλάχιστον 1400px πλάτος και ύψος.',
         'title' => 'Τίτλος',
         'title_hint' =>
diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php
index 65241e064ca5b6cde9ffbd539a66e3dc53721666..ecb81fc78fedf7dcdb7b42d652b70e34738a68a9 100644
--- a/modules/Admin/Language/nl/Breadcrumb.php
+++ b/modules/Admin/Language/nl/Breadcrumb.php
@@ -37,7 +37,7 @@ return [
     'funding' => 'financiering',
     'analytics' => 'statistieken',
     'locations' => 'locaties',
-    'webpages' => "web pagina's",
+    'webpages' => 'web pagina\'s',
     'unique-listeners' => 'unieke luisteraars',
     'players' => 'spelers',
     'listening-time' => 'afspeeltijd',
diff --git a/modules/Admin/Language/nl/Charts.php b/modules/Admin/Language/nl/Charts.php
index 87667607257014b650c9f3fba131d5997d1db3c4..eca1ba2a00eae0db352a16362fb2e5affd13789f 100644
--- a/modules/Admin/Language/nl/Charts.php
+++ b/modules/Admin/Language/nl/Charts.php
@@ -28,7 +28,7 @@ return [
     'by_country_yearly' => 'Afleveringen gedownload per land (van de afgelopen jaar)',
     'by_domain_weekly' => 'Directe webpagina verzoeken (van de afgelopen week)',
     'by_domain_yearly' => 'Directe webpagina verzoeken (van de afgelopen jaar)',
-    'by_entry_page' => "Webpagina's bezoeken via landingspagina (van de afgelopen week)",
+    'by_entry_page' => 'Webpagina\'s bezoeken via landingspagina (van de afgelopen week)',
     'podcast_bots' => 'Bots (crawlers)',
     'daily_listening_time' => 'Dagelijkse cumulatieve afspeeltijd',
     'monthly_listening_time' => 'Maandelijkse cumulatieve afspeeltijd',
diff --git a/rector.php b/rector.php
index 6221649fa4f6d461d4ca884c3ad3b48b6eb4beef..6a8943a6e4aaffdbaec602a4dbbf433ee9a050e2 100644
--- a/rector.php
+++ b/rector.php
@@ -7,6 +7,7 @@ use Rector\CodingStyle\Rector\ClassMethod\UnSpreadOperatorRector;
 use Rector\CodingStyle\Rector\Encapsed\EncapsedStringsToSprintfRector;
 use Rector\CodingStyle\Rector\FuncCall\ConsistentPregDelimiterRector;
 use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector;
+use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector;
 use Rector\Core\Configuration\Option;
 use Rector\Core\ValueObject\PhpVersion;
 use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector;
@@ -66,6 +67,10 @@ return static function (ContainerConfigurator $containerConfigurator): void {
             __DIR__ . '/app/Language/*',
             __DIR__ . '/modules/*/Language/*',
         ],
+        SymplifyQuoteEscapeRector::class => [
+            __DIR__ . '/app/Language/*',
+            __DIR__ . '/modules/*/Language/*',
+        ],
         OptionalParametersAfterRequiredRector::class => [
             __DIR__ . '/app/Validation',
         ],