<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://cecil.app/fr/xsl/atom.xsl" media="all"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
  <id>https://cecil.app/fr/documentation/contenu/</id>
  <title>Cecil - Contenu</title>
  <subtitle><![CDATA[Cecil est une application PHP en ligne de commande qui fusionne des pages Markdown, des médias et des templates Twig afin de générer un site Web statique.]]></subtitle>
  <link href="https://cecil.app/fr/documentation/contenu/atom.xml" rel="self" type="application/atom+xml" />
  <link href="https://cecil.app/fr/documentation/contenu/" rel="alternate" type="text/html" />
  <updated>2026-10-07T22:51:31+00:00</updated>
  <author>
    <name>Cecil</name>
    <uri>https://cecil.app</uri>
  </author>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/pages/</id>
    <title>Pages et sections</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-06T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/pages/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Pages et sections</h1>
<p>Une page est un fichier composé d’un <a href="#front-matter"><strong>front matter</strong></a> et d’un <a href="#corps-body"><strong>body</strong></a>.</p>
<h2 id="front-matter">Front matter</h2>
<p>Le <em>front matter</em> est une collection de <a href="/fr/documentation/contenu/front-matter/">variables</a> (au format <em>clé/valeur</em>) entourée par <code translate="no">---</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">title:</span> <span class="hljs-string">"The title"</span>
<span class="hljs-attr">date:</span> <span class="hljs-number">2019</span><span class="hljs-number">-02</span><span class="hljs-number">-21</span>
<span class="hljs-attr">tags:</span> <span class="hljs-string">[tag</span> <span class="hljs-number">1</span><span class="hljs-string">,</span> <span class="hljs-string">tag</span> <span class="hljs-number">2</span><span class="hljs-string">]</span>
<span class="hljs-attr">customvar:</span> <span class="hljs-string">"Value of customvar"</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-info"><p>Vous pouvez aussi utiliser <code translate="no">&lt;!-- --&gt;</code> ou <code translate="no">+++</code> comme séparateur.</p></aside>
<h2 id="corps-body">Corps (body)</h2>
<p>Le <em>body</em> est le contenu principal d’une page ; il peut être écrit en <a href="/fr/documentation/contenu/markdown/">Markdown</a> ou en texte brut.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no"><span class="hljs-section"># Header</span>

[toc]

<span class="hljs-section">## Sub-Header 1</span>

Lorem ipsum dolor [<span class="hljs-string">sit amet</span>](<span class="hljs-link">https://example.com</span>), consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
<span class="xml"><span class="hljs-comment">&lt;!-- excerpt --&gt;</span></span>
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

<span class="hljs-section">## Sub-Header 2</span>

![<span class="hljs-string">Description</span>](<span class="hljs-link">/image.jpg "Title"</span>)

<span class="hljs-section">## Sub-Header 3</span>

:::tip
This is advice.
:::</code></pre>
<h2 id="prefixe-de-fichier">Préfixe de fichier</h2>
<p>Le nom de fichier peut contenir un préfixe pour définir les variables <code translate="no">date</code> ou <code translate="no">weight</code> de la page (utilisé par <a href="/fr/documentation/templates/reference/tris/#sort-by-date"><code translate="no">sortby</code></a>).</p>
<aside class="note note-info"><p>Séparateurs de préfixe par défaut : <code translate="no">_</code> et <code translate="no">-</code>.</p>
<p>Vous pouvez les personnaliser avec l’option <a href="/fr/documentation/configuration/pages/#pages-prefix-separator"><code translate="no">pages.prefix.separator</code></a>.</p></aside>
<h3 id="date">date</h3>
<p>Le <em>date prefix</em> est utilisé pour définir la <code translate="no">date</code> de la page et doit être un format de date valide (c.-à-d. : « YYYY-MM-DD »).</p>
<p><em>Exemple :</em></p>
<p>Dans « 2019-04-23_My blog post.md » :</p>
<ul>
<li>le préfixe est « 2019-04-23 »</li>
<li>la <code translate="no">date</code> de la page est « 2019-04-23 »</li>
<li>le <code translate="no">title</code> de la page est « My blog post »</li>
</ul>
<h3 id="weight">weight</h3>
<p>Le <em>weight prefix</em> est utilisé pour définir l’ordre de tri de la page et doit être une valeur entière valide.</p>
<p><em>Exemple :</em></p>
<p>Dans « 1_The first project.md » :</p>
<ul>
<li>le préfixe est « 1 »</li>
<li>le <code translate="no">weight</code> de la page est « 1 »</li>
<li>le <code translate="no">title</code> de la page est « The first project »</li>
</ul>
<h2 id="section">Section</h2>
<p>Certaines variables dédiées peuvent être utilisées dans une <em>Section</em> personnalisée (c.-à-d. : <code translate="no">&lt;section&gt;/index.md</code>).</p>
<h3 id="sortby">sortby</h3>
<p>L’ordre des pages dans une <em>Section</em> peut être modifié.</p>
<p>Valeurs disponibles :</p>
<ul>
<li><code translate="no">date</code>: plus récentes en premier</li>
<li><code translate="no">title</code>: ordre alphabétique</li>
<li><code translate="no">weight</code>: plus léger en premier</li>
</ul>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">sortby:</span> <span class="hljs-string">title</span>
<span class="hljs-meta">---</span></code></pre>
<p><strong>More options:</strong></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">sortby:</span>
  <span class="hljs-attr">variable:</span> <span class="hljs-string">date</span>    <span class="hljs-comment"># "date", "updated", "title" or "weight"</span>
  <span class="hljs-attr">desc_title:</span> <span class="hljs-literal">false</span> <span class="hljs-comment"># used with "date" or "updated" variable value to sort by desc title order if items have the same date</span>
  <span class="hljs-attr">reverse:</span> <span class="hljs-literal">false</span>    <span class="hljs-comment"># reversed if true</span>
<span class="hljs-meta">---</span></code></pre>
<h3 id="pagination">pagination</h3>
<p>La <a href="/fr/documentation/configuration/pages/#pages-pagination">configuration globale de pagination</a> est utilisée par défaut, mais vous pouvez la modifier pour une <em>Section</em> donnée.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">pagination:</span>
  <span class="hljs-attr">max:</span> <span class="hljs-number">5</span>
  <span class="hljs-attr">path:</span> <span class="hljs-string">"page"</span>
<span class="hljs-meta">---</span></code></pre>
<p>La pagination peut être désactivée pour une <em>Section</em> :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">pagination:</span> <span class="hljs-literal">false</span>
<span class="hljs-meta">---</span></code></pre>
<h3 id="cascade">cascade</h3>
<p>Toutes les variables de <code translate="no">cascade</code> sont ajoutées au front matter de toutes les <em>sous-pages</em>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">cascade:</span>
  <span class="hljs-attr">banner:</span> <span class="hljs-string">image.jpg</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-info"><p>Les variables existantes ne sont pas écrasées.</p></aside>
<h3 id="circular">circular</h3>
<p>Définissez <code translate="no">circular</code> à <code translate="no">true</code> pour activer la navigation circulaire avec <a href="/fr/documentation/templates/variables/#page-prev-next"><em>page.&lt;prev/next&gt;</em></a>.</p>
<aside class="note note-info"><p>Avec des <a href="#sous-section">sous-sections</a>, seule la valeur <code translate="no">circular</code> de la <em>Section</em> de premier niveau est utilisée.</p></aside>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">circular:</span> <span class="hljs-literal">true</span>
<span class="hljs-meta">---</span></code></pre>
<h3 id="sous-section">Sous-section</h3>
<p>Un dossier imbriqué qui contient explicitement un fichier <code translate="no">index.md</code> devient une <em>sous-section</em> de sa <em>Section</em> parente.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">&lt;monsiteweb&gt;
└─ pages
   └─ blog                 &lt;- Section
      ├─ index.md
      ├─ post-1.md         &lt;- Page de la Section « blog »
      └─ 2024              &lt;- Sous-section (contient un « index.md »)
         ├─ index.md
         └─ post-2.md      &lt;- Page de la Section « blog » *et* de la sous-section « blog/2024 »</code></pre>
<p>Une <em>sous-section</em> :</p>
<ul>
<li>est une <em>Section</em> (même type, mêmes variables et même résolution de <a href="/fr/documentation/templates/regles-de-recherche/#type-section">gabarit</a>) accessible à sa propre URL (ex. : <code translate="no">/blog/2024/</code>)</li>
<li>est rendue avec les gabarits de ses <em>Sections</em> parentes si elle n'a pas les siens (ex. : <code translate="no">blog/list.html.twig</code>)</li>
<li>peut être imbriquée à n'importe quelle profondeur (ex. : <code translate="no">blog/2024/06/</code>)</li>
<li>liste ses propres pages, et ses pages appartiennent aussi à chacune de leurs <em>Sections</em> parentes</li>
<li>n'est <strong>pas</strong> listée dans sa <em>Section</em> parente</li>
<li>est placée dans la navigation <a href="/fr/documentation/templates/variables/#page-prev-next"><em>page.&lt;prev/next&gt;</em></a> de sa <em>Section</em> parente (selon son <code translate="no">sortby</code>), suivie de ses propres pages</li>
</ul>
<aside class="note note-info"><p>Un dossier imbriqué <strong>sans</strong> fichier <code translate="no">index.md</code> n'est pas une <em>sous-section</em> : ses pages appartiennent simplement à la <em>Section</em> parente.</p></aside>
<h2 id="page-d-accueil">Page d'accueil</h2>
<p>Comme une autre section, la <em>Page d'accueil</em> prend en charge la configuration <code translate="no">sortby</code> et <code translate="no">pagination</code>.</p>
<h3 id="pagesfrom">pagesfrom</h3>
<p>Définissez un nom de <em>Section</em> valide dans <code translate="no">pagesfrom</code> pour utiliser la collection de pages de cette <em>Section</em> dans la <em>Page d'accueil</em>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">pagesfrom:</span> <span class="hljs-string">blog</span>
<span class="hljs-meta">---</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/front-matter/</id>
    <title>Front matter</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/front-matter/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Front matter</h1>
<p>Le <em>front matter</em> peut contenir des variables personnalisées appliquées à la page courante.</p>
<p>Il doit se trouver au tout début du fichier et être un <a href="https://en.wikipedia.org/wiki/YAML" target="_blank" rel="noopener noreferrer">YAML</a> valide.</p>
<h2 id="variables-predefinies">Variables prédéfinies</h2>
<table>
<thead>
<tr>
<th>Variable</th>
<th>Description</th>
<th>Valeur par défaut</th>
<th>Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">title</code></td>
<td>Titre</td>
<td>Nom de fichier sans extension.</td>
<td><code translate="no">Post 1</code></td>
</tr>
<tr>
<td><code translate="no">layout</code></td>
<td>Template</td>
<td>Voir <a href="/fr/documentation/templates/regles-de-recherche/#regles-de-recherche"><em>Lookup rules</em></a>.</td>
<td><code translate="no">404</code></td>
</tr>
<tr>
<td><code translate="no">date</code></td>
<td>Date de création</td>
<td>Date de création du fichier (objet PHP <em>DateTime</em>).</td>
<td><code translate="no">2019/04/15</code></td>
</tr>
<tr>
<td><code translate="no">section</code></td>
<td>Section</td>
<td><em>Section</em> de la page.</td>
<td><code translate="no">blog</code></td>
</tr>
<tr>
<td><code translate="no">path</code></td>
<td>Chemin</td>
<td><em>Path</em> de la page.</td>
<td><code translate="no">blog/post-1</code></td>
</tr>
<tr>
<td><code translate="no">slug</code></td>
<td>Slug</td>
<td><em>Slug</em> de la page.</td>
<td><code translate="no">post-1</code></td>
</tr>
<tr>
<td><code translate="no">published</code></td>
<td>Publié ou non</td>
<td><code translate="no">true</code>.</td>
<td><code translate="no">false</code></td>
</tr>
<tr>
<td><code translate="no">draft</code></td>
<td>Brouillon ou non</td>
<td><code translate="no">false</code>.</td>
<td><code translate="no">true</code></td>
</tr>
</tbody>
</table>
<aside class="note note-info"><p>Toutes les variables prédéfinies peuvent être surchargées, sauf <code translate="no">section</code>.</p></aside>
<h2 id="updated">updated</h2>
<p>La variable <code translate="no">updated</code> sert à définir la date de dernière modification d’une page.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">updated:</span> <span class="hljs-number">2026</span><span class="hljs-number">-02</span><span class="hljs-number">-02</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-warning"><p>Avant la version 8.80.1, la variable <code translate="no">updated</code> était une variable prédéfinie. Elle est désormais optionnelle (et doit être définie dans le front matter pour être utilisée).</p></aside>
<h2 id="menu">menu</h2>
<p>Une page peut être ajoutée à un <a href="/fr/documentation/configuration/site/#menus">menu</a>.</p>
<p>Le nom de l’entrée est le <code translate="no">title</code> de la page et l’URL est le <code translate="no">path</code> de la page.</p>
<p>La même page peut être ajoutée à plusieurs menus, et la position de chaque entrée peut être définie avec la clé <code translate="no">weight</code> (la plus faible en premier). La clé <code translate="no">name</code> peut être utilisée pour personnaliser le nom de l’entrée par menu.</p>
<p><em>Exemples :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">menu:</span> <span class="hljs-string">main</span>
<span class="hljs-meta">---</span></code></pre>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">menu:</span> <span class="hljs-string">[main,</span> <span class="hljs-string">navigation]</span> <span class="hljs-comment"># same page in multiple menus</span>
<span class="hljs-meta">---</span></code></pre>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">menu:</span>
  <span class="hljs-attr">main:</span>
    <span class="hljs-attr">weight:</span> <span class="hljs-number">10</span>
  <span class="hljs-attr">navigation:</span>
    <span class="hljs-attr">weight:</span> <span class="hljs-number">20</span>
<span class="hljs-meta">---</span></code></pre>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">title:</span> <span class="hljs-string">'Notre expertise'</span>
<span class="hljs-attr">menu:</span>
  <span class="hljs-attr">main:</span>
    <span class="hljs-attr">weight:</span> <span class="hljs-number">15</span>
  <span class="hljs-attr">footer:</span>
    <span class="hljs-attr">weight:</span> <span class="hljs-number">15</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">"Expertise"</span> <span class="hljs-comment"># personnalise le nom de l'entrée dans ce menu</span>
<span class="hljs-meta">---</span></code></pre>
<h2 id="taxonomie">Taxonomie</h2>
<p>La taxonomie permet de connecter, relier et classer le contenu de votre site Web.<br>
Dans Cecil, ces termes sont regroupés dans des vocabulaires.</p>
<p>Les vocabulaires sont déclarés dans la <a href="/fr/documentation/configuration/site/#taxonomies"><em>Configuration</em></a>.</p>
<dl>
<dt>Vocabulaire</dt>
<dd>Une catégorisation du contenu (ex. : <code translate="no">tags</code>, <code translate="no">categories</code>, etc.).</dd>
<dt>Terme</dt>
<dd>Un terme est un élément d’un vocabulaire (ex. : <code translate="no">Développement</code>, <code translate="no">PHP</code>, etc.).</dd>
</dl>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">tags:</span> <span class="hljs-string">["Développement",</span> <span class="hljs-string">"PHP"</span><span class="hljs-string">]</span>
<span class="hljs-meta">---</span></code></pre>
<p>Cecil génère ensuite, pour chaque vocabulaire :</p>
<ul>
<li>une page listant ses termes, ex. : <code translate="no">/tags/</code></li>
<li>une page par terme listant ses pages, ex. : <code translate="no">/tags/developpement/</code> et <code translate="no">/tags/php/</code></li>
</ul>
<p>Voir les <a href="/fr/documentation/templates/regles-de-recherche/#type-vocabulary">règles de recherche des templates</a> et les <a href="/fr/documentation/templates/variables/#taxonomie">variables de taxonomie</a> pour personnaliser ces pages.</p>
<h2 id="planification">Planification</h2>
<p>Planifie la publication des pages.</p>
<p><em>Exemple :</em></p>
<p>La page sera publiée si la date courante est &gt;= 2023-02-07 :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">schedule:</span>
  <span class="hljs-attr">publish:</span> <span class="hljs-number">2023</span><span class="hljs-number">-02</span><span class="hljs-number">-07</span></code></pre>
<p>Cette page est publiée si la date courante est &lt;= 2022-04-28 :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">schedule:</span>
  <span class="hljs-attr">expiry:</span> <span class="hljs-number">2022</span><span class="hljs-number">-04</span><span class="hljs-number">-28</span></code></pre>
<h2 id="redirect">redirect</h2>
<p>Comme son nom l’indique, la variable <code translate="no">redirect</code> sert à rediriger une page vers une URL dédiée.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">redirect:</span> <span class="hljs-string">"https://arnaudligny.fr"</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-info"><p>La redirection fonctionne avec le template <a href="https://github.com/Cecilapp/Cecil/blob/main/resources/layouts/_default/redirect.html.twig" target="_blank" rel="noopener noreferrer"><code translate="no">redirect.html.twig</code></a>.</p></aside>
<h2 id="alias">alias</h2>
<p>Un alias est une redirection vers la page courante.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">title:</span> <span class="hljs-string">"About"</span>
<span class="hljs-attr">alias:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">contact</span>
<span class="hljs-meta">---</span></code></pre>
<p>Dans l’exemple précédent, <code translate="no">contact/</code> redirige vers <code translate="no">about/</code>.</p>
<h2 id="output">output</h2>
<p>Définit le format de sortie de la page.</p>
<p>Les formats disponibles sont : <code translate="no">html</code>, <code translate="no">atom</code>, <code translate="no">rss</code>, <code translate="no">json</code>, <code translate="no">xml</code>, etc.<br>
Vous pouvez définir un ou plusieurs formats dans un tableau.</p>
<p>Il n’est pas obligatoire de définir un format de sortie, mais si vous le faites, il doit correspondre à l’un des formats disponibles définis dans la <a href="/fr/documentation/configuration/sortie/#output-formats"><em>Configuration</em></a>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">output:</span> <span class="hljs-string">[html,</span> <span class="hljs-string">atom]</span>
<span class="hljs-meta">---</span></code></pre>
<h2 id="external">external</h2>
<p>Une page avec une variable <code translate="no">external</code> tente de récupérer le contenu de la ressource ciblée.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">external:</span> <span class="hljs-string">"https://raw.githubusercontent.com/Cecilapp/Cecil/main/README.md"</span>
<span class="hljs-meta">---</span></code></pre>
<h2 id="excluded">excluded</h2>
<p>Définissez <code translate="no">excluded</code> à <code translate="no">true</code> pour masquer une page des pages de liste (c.-à-d. : <em>Home page</em>, <em>Section</em>, <em>Sitemap</em>, etc.).</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">excluded:</span> <span class="hljs-literal">true</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-info"><p><code translate="no">excluded</code> est différent de <a href="#variables-predefinies"><code translate="no">published</code></a> : une page exclue est publiée, mais masquée des pages de liste.</p></aside>
<aside class="note note-warning"><p>Depuis la version 8.49.0, l’ancienne variable <code translate="no">exclude</code> a été remplacée par <code translate="no">excluded</code>.</p></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/markdown/</id>
    <title>Markdown</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/markdown/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Markdown</h1>
<p>Cecil prend en charge le format <a href="http://daringfireball.net/projects/markdown/syntax" target="_blank" rel="noopener noreferrer">Markdown</a>, ainsi que <a href="https://michelf.ca/projects/php-markdown/extra/" target="_blank" rel="noopener noreferrer">Markdown Extra</a>.</p>
<p>Cecil fournit aussi des <strong>fonctionnalités supplémentaires</strong> pour enrichir votre contenu, voir ci-dessous.</p>
<h2 id="attributs">Attributs</h2>
<p>Avec <a href="https://michelf.ca/projects/php-markdown/extra/" target="_blank" rel="noopener noreferrer">Markdown Extra</a>, vous pouvez définir un id, une classe et des attributs personnalisés sur certains éléments à l’aide d’un bloc d’attributs.<br>
Par exemple, placez le(s) attribut(s) souhaité(s) après un en-tête, un bloc de code délimité, un lien ou une image en fin de ligne, entre accolades, comme ceci :</p>
<pre><code class="language-markdown hljs markdown" translate="no"><span class="hljs-section">## En-tête {#id .class attribute=value}</span></code></pre>
<aside class="note note-warning"><p>Pour un élément en ligne, comme un lien, vous devez utiliser un retour à la ligne après l’accolade fermante :</p>
<pre><code class="language-markdown hljs markdown" translate="no">Lorem ipsum [<span class="hljs-string">dolor</span>](<span class="hljs-link">url</span>){attribute=value} 
sit amet.</code></pre></aside>
<h2 id="liens">Liens</h2>
<p>Vous pouvez créer un lien avec la syntaxe <code translate="no">[Texte](url)</code> ; <code translate="no">url</code> peut être un chemin, un chemin relatif vers un fichier Markdown, une URL externe, etc.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">[<span class="hljs-string">Link to a path</span>](<span class="hljs-link">/about/</span>)
[<span class="hljs-string">Link to a Markdown file</span>](<span class="hljs-link">/fr/a-propos/</span>)
[<span class="hljs-string">Link to Cecil website</span>](<span class="hljs-link">https://cecil.app</span>)</code></pre>
<aside class="note note-info"><p>Un lien relatif vers un fichier Markdown est résolu depuis le dossier du fichier courant (comme sur GitHub), puis remplacé par l’URL de la page ciblée.</p></aside>
<h3 id="lien-vers-une-page">Lien vers une page</h3>
<p>Vous pouvez facilement créer un lien vers une page avec la syntaxe <code translate="no">[Titre de page](page:page-id)</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">[<span class="hljs-string">Link to a blog post</span>](<span class="hljs-link">page:blog/post-1</span>)</code></pre>
<h3 id="externe">Externe</h3>
<p>Par défaut, les liens externes ont la valeur suivante pour l’attribut <code translate="no">rel</code> : <code translate="no">noopener noreferrer</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"&lt;url&gt;"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"noopener noreferrer"</span>&gt;</span>Link to another website<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></code></pre>
<p>Vous pouvez modifier ce comportement avec les <a href="/fr/documentation/configuration/pages/#pages-body-links">options <code translate="no">pages.body.links.external</code></a>.</p>
<h3 id="liens-integres">Liens intégrés</h3>
<p>Vous pouvez laisser Cecil essayer de transformer un lien en contenu embarqué en utilisant l’attribut <code translate="no">{embed}</code> ou en activant l’option de configuration globale <code translate="no">pages.body.links.embed.enabled</code> à <code translate="no">true</code>.</p>
<aside class="note note-important"><p>Seuls les liens <strong>YouTube</strong>, <strong>Vimeo</strong>, <strong>Dailymotion</strong> et <strong>GitHub Gists</strong> sont pris en charge.</p></aside>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">[<span class="hljs-string">CECIL : LE générateur de SITES STATIQUES en PHP</span>](<span class="hljs-link">https://www.youtube.com/watch?v=ur8koU0iYvc</span>){embed}</code></pre>
<p><div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
<iframe src="https://www.youtube-nocookie.com/embed/ur8koU0iYvc" loading="lazy" width="640" height="360" frameborder="0" allow="accelerometer;autoplay;encrypted-media;gyroscope;picture-in-picture;fullscreen;web-share;" allowfullscreen="" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background-color:#d8d8d8;"></iframe>
</div></p>
<h4>Local video/audio files</h4>
<p>Cecil peut aussi créer des éléments HTML vidéo et audio, selon l’extension du fichier.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">[<span class="hljs-string">Video file</span>](<span class="hljs-link">video.mp4</span>){embed controls poster=/images/video-test.png}
[<span class="hljs-string">Audio file</span>](<span class="hljs-link">song.mp3</span>){embed controls}</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">video</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/video.mp4"</span> <span class="hljs-attr">controls</span> <span class="hljs-attr">poster</span>=<span class="hljs-string">"/images/video-test.png"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"max-width:100%;height:auto;"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">video</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">audio</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/song.mp3"</span> <span class="hljs-attr">controls</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">audio</span>&gt;</span></code></pre>
<h2 id="images">Images</h2>
<p>Pour ajouter une image, utilisez un point d’exclamation (<code translate="no">!</code>) suivi d’une description alternative entre crochets (<code translate="no">[]</code>), puis du chemin ou de l’URL de l’image entre parenthèses (<code translate="no">()</code>).<br>
Vous pouvez facultativement ajouter un titre entre guillemets.</p>
<pre><code class="language-markdown hljs markdown" translate="no">![<span class="hljs-string">Alternative description</span>](<span class="hljs-link">/image.jpg "Image title"</span>)</code></pre>
<aside class="note note-info"><p>Le chemin doit être relatif à la racine de votre site Web (ex. : <code translate="no">/image.jpg</code>), mais Cecil est capable de normaliser un chemin relatif aux répertoires <em>assets</em> et <em>static</em> (ex. : <code translate="no">../../assets/image.jpg</code>).</p></aside>
<h3 id="lazy-loading">Lazy loading</h3>
<p>Cecil ajoute l’attribut <code translate="no">loading="lazy"</code> à chaque image.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg)</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/image.jpg"</span> <span class="hljs-attr">loading</span>=<span class="hljs-string">"lazy"</span>&gt;</span></code></pre>
<aside class="note note-info"><p>Vous pouvez désactiver ce comportement avec l’attribut <code translate="no">{loading=eager}</code> ou avec l’<a href="/fr/documentation/configuration/pages/#pages-body-images">option <code translate="no">lazy</code></a>.</p></aside>
<h3 id="decoding">Decoding</h3>
<p>Cecil ajoute l’attribut <code translate="no">decoding="async"</code> à chaque image.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg)</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/image.jpg"</span> <span class="hljs-attr">decoding</span>=<span class="hljs-string">"async"</span>&gt;</span></code></pre>
<aside class="note note-info"><p>Vous pouvez désactiver ce comportement avec l’attribut <code translate="no">{decoding=auto}</code> ou avec l’<a href="/fr/documentation/configuration/pages/#pages-body-images">option <code translate="no">decoding</code></a>.</p></aside>
<h3 id="redimensionnement">Redimensionnement</h3>
<p>Chaque image du <em>body</em> peut être redimensionnée automatiquement en définissant une largeur inférieure à celle d’origine, avec l’attribut additionnel <code translate="no">{width=X}</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg){width=800}</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/thumbnails/800/image.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"800"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"600"</span>&gt;</span></code></pre>
<aside class="note note-info"><p>Le ratio est conservé (l’attribut <code translate="no">height</code> est calculé automatiquement), le fichier original n’est pas modifié et la version redimensionnée est stockée dans <code translate="no">/thumbnails/&lt;width&gt;/</code>.</p></aside>
<aside class="note note-important"><p>Cette fonctionnalité nécessite une bibliothèque de traitement d’images : <a href="https://www.php.net/manual/book.imagick.php" target="_blank" rel="noopener noreferrer">Imagick</a> est utilisé en priorité s’il est disponible (et capable de lire le JPEG et le PNG), puis <a href="https://www.libvips.org/" target="_blank" rel="noopener noreferrer">libvips</a> (via l’extension PHP <a href="https://www.php.net/manual/book.ffi.php" target="_blank" rel="noopener noreferrer">FFI</a>), et enfin <a href="https://www.php.net/manual/book.image.php" target="_blank" rel="noopener noreferrer">GD</a> en dernier recours ; sinon, elle ajoute seulement un attribut HTML <code translate="no">width</code> à la balise <code translate="no">img</code>.</p></aside>
<aside class="note note-info"><p>Le support de libvips est optionnel et n’est pas inclus dans <code translate="no">cecil.phar</code>. Pour l’utiliser, Cecil doit être installé avec <a href="https://getcomposer.org" target="_blank" rel="noopener noreferrer">Composer</a> et il faut :</p>
<ol>
<li><a href="https://www.libvips.org/install.html" target="_blank" rel="noopener noreferrer">libvips</a> installé sur le système</li>
<li>l’extension PHP <a href="https://www.php.net/manual/book.ffi.php" target="_blank" rel="noopener noreferrer">FFI</a> activée</li>
<li>le paquet <code translate="no">intervention/image-driver-vips</code> installé avec Cecil</li>
</ol>
<p>Si Cecil est une dépendance de votre projet (voir <a href="/fr/documentation/developpeurs/bibliotheque/#support-de-libvips">Bibliothèque</a>) :</p>
<pre><code class="language-bash hljs bash" translate="no">composer require intervention/image-driver-vips</code></pre>
<p>Si Cecil est installé globalement :</p>
<pre><code class="language-bash hljs bash" translate="no">composer global require cecil/cecil intervention/image-driver-vips</code></pre></aside>
<h3 id="formats">Formats</h3>
<p>Si l’<a href="/fr/documentation/configuration/pages/#pages-body-images">option <code translate="no">formats</code></a> est définie, des images alternatives sont créées et ajoutées.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg)</code></pre>
<p>Peut être converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">picture</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">srcset</span>=<span class="hljs-string">"/image.avif"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"image/avif"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">srcset</span>=<span class="hljs-string">"/image.webp"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"image/webp"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/image.jpg"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">picture</span>&gt;</span></code></pre>
<aside class="note note-important"><p>Veuillez noter que <strong>tous les formats d’image</strong> ne sont pas toujours inclus dans les extensions d’image PHP.</p></aside>
<h3 id="responsive">Responsive</h3>
<p>Si l’<a href="/fr/documentation/configuration/pages/#pages-body-images">option <code translate="no">responsive</code></a> est activée, alors toutes les images du <em>body</em> seront automatiquement rendues « responsive ».</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg){width=800}</code></pre>
<p>sera converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/thumbnails/800/image.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"800"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"600"</span>
  <span class="hljs-attr">srcset</span>=<span class="hljs-string">"/thumbnails/320/image.jpg 320w,
          /thumbnails/640/image.jpg 640w,
          /thumbnails/800/image.jpg 800w"</span>
  <span class="hljs-attr">sizes</span>=<span class="hljs-string">"100vw"</span>
&gt;</span></code></pre>
<aside class="note note-info"><p>Comme une image du body est convertie en <a href="/fr/documentation/assets/#asset">Asset</a>, les différentes largeurs doivent être définies dans la <a href="/fr/documentation/configuration/assets/">configuration des assets</a>.</p></aside>
<p>L’attribut <code translate="no">sizes</code> prend la valeur de l’option de configuration <code translate="no">assets.images.responsive.sizes.default</code>, mais peut être modifié en créant une nouvelle entrée nommée d’après une <em>class</em> ajoutée à l’image.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">responsive:</span>
      <span class="hljs-attr">sizes:</span>
        <span class="hljs-attr">default:</span> <span class="hljs-string">100vw</span>
        <span class="hljs-attr">my_class:</span> <span class="hljs-string">"(max-width: 800px) 768px, 1024px"</span></code></pre>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg){.my_class}</code></pre>
<aside class="note note-info"><p>Vous pouvez combiner les options <code translate="no">formats</code> et <code translate="no">responsive</code>.</p></aside>
<h3 id="css-class">CSS class</h3>
<p>Vous pouvez définir une valeur par défaut pour l’attribut <code translate="no">class</code> de chaque image avec l’<a href="/fr/documentation/configuration/pages/#pages-body-images">option <code translate="no">class</code></a>.</p>
<h3 id="caption">Caption</h3>
<p>Le titre optionnel peut être utilisé pour créer automatiquement une légende (<code translate="no">figcaption</code>) en activant l’<a href="/fr/documentation/configuration/pages/#pages-body-images">option <code translate="no">caption</code></a>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/images/img.jpg "Title")</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">figure</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/image.jpg"</span> <span class="hljs-attr">title</span>=<span class="hljs-string">"Title"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">figcaption</span>&gt;</span>Title<span class="hljs-tag">&lt;/<span class="hljs-name">figcaption</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">figure</span>&gt;</span></code></pre>
<aside class="note note-info"><p>La légende prend en charge le contenu Markdown.</p></aside>
<h3 id="image-localisee">Image localisée</h3>
<p>Pour les pages traduites, Cecil recherche d’abord un fichier suffixé par la langue lors de la résolution des chemins d’image Markdown.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/images/cecil-logo.png)</code></pre>
<p>Avec une page française (<code translate="no">fr</code>), Cecil essaie d’abord <code translate="no">/images/cecil-logo.fr.png</code>, puis revient à <code translate="no">/images/cecil-logo.png</code>.</p>
<h3 id="placeholder">Placeholder</h3>
<p>Comme les images sont généralement des ressources plus lourdes et plus lentes, et qu’elles ne bloquent pas le rendu, il est préférable de donner aux utilisateurs quelque chose à voir pendant qu’ils attendent leur chargement.</p>
<p>L’attribut <code translate="no">placeholder</code> accepte 2 options :</p>
<ol>
<li><code translate="no">color</code>: affiche un fond coloré (basé sur la couleur dominante de l’image)</li>
<li><code translate="no">lqip</code>: <a href="https://www.guypo.com/introducing-lqip-low-quality-image-placeholders" target="_blank" rel="noopener noreferrer">Low-Quality Image Placeholder</a></li>
</ol>
<p><em>Exemples :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/images/img.jpg){placeholder=color}
![](/images/img.jpg){placeholder=lqip}</code></pre>
<aside class="note note-tip"><p>Vous pouvez définir une valeur pour l’attribut <code translate="no">placeholder</code> de chaque image avec l’<a href="/fr/documentation/configuration/pages/#pages-body-images">option <code translate="no">placeholder</code></a>.</p></aside>
<aside class="note note-warning"><p>L’option <code translate="no">lqip</code> n’est pas compatible avec les GIF animés.</p></aside>
<h2 id="table-des-matieres">Table des matières</h2>
<p>Vous pouvez ajouter une table des matières avec la syntaxe Markdown suivante :</p>
<pre><code class="language-markdown hljs markdown" translate="no">[toc]</code></pre>
<aside class="note note-info"><p>Par défaut, la ToC extrait les en-têtes H2 et H3. Vous pouvez modifier ce comportement avec les <a href="/fr/documentation/configuration/pages/#pages-body">options de body</a>.</p></aside>
<h2 id="extrait">Extrait</h2>
<p>Un extrait peut être défini dans le <em>body</em> avec l’une des balises suivantes : <code translate="no">excerpt</code> ou <code translate="no">break</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-html hljs xml" translate="no">Introduction.
<span class="hljs-comment">&lt;!-- excerpt --&gt;</span>
Main content.</code></pre>
<p>Utilisez ensuite le filtre <a href="/fr/documentation/templates/reference/filtres/#excerpt-html"><code translate="no">excerpt_html</code></a> dans votre template.</p>
<h2 id="notes">Notes</h2>
<p>Créez un bloc de <em>Note</em> (info, astuce, important, etc.).</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">:::tip
<span class="hljs-strong">**Tip:**</span> This is advice.
:::</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">aside</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"note note-tip"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>Tip:<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span> This is advice.
  <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">aside</span>&gt;</span></code></pre>
<aside class="note note-tip"><p><strong>Tip:</strong> This is advice.</p></aside>
<p><em>Autres exemples :</em></p>
<aside class="note"><p>empty</p></aside>
<aside class="note note-info"><p>info</p></aside>
<aside class="note note-tip"><p>tip</p></aside>
<aside class="note note-important"><p>important</p></aside>
<aside class="note note-warning"><p>warning</p></aside>
<aside class="note note-caution"><p>caution</p></aside>
<h2 id="coloration-syntaxique">Coloration syntaxique</h2>
<p>La coloration syntaxique des blocs de code est activée par défaut avec l’option <a href="/fr/documentation/configuration/pages/#pages-body-highlight">pages.body.highlight</a>.</p>
<p>Si besoin, vous pouvez la désactiver avec :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">body:</span>
    <span class="hljs-attr">highlight:</span> <span class="hljs-literal">false</span></code></pre>
<p><em>Exemple :</em></p>
<pre>
```php
echo "Hello world";
```
</pre>
<p>Est rendu en :</p>
<pre><code class="language-php hljs php" translate="no"><span class="hljs-keyword">echo</span> <span class="hljs-string">"Hello world"</span>;</code></pre>
<aside class="note note-info"><p>Vous pouvez personnaliser le style de coloration syntaxique en créant votre propre thème. Consultez le <a href="https://highlightjs.readthedocs.io/en/latest/theme-guide.html" target="_blank" rel="noopener noreferrer">guide des thèmes de Highlight.js</a>.</p></aside>
<h2 id="texte-insere">Texte inséré</h2>
<p>Représente une plage de texte qui a été ajoutée.</p>
<pre><code class="language-markdown hljs markdown" translate="no">++text++</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">ins</span>&gt;</span>text<span class="hljs-tag">&lt;/<span class="hljs-name">ins</span>&gt;</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/multilingue/</id>
    <title>Multilingue</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/multilingue/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Multilingue</h1>
<p>Si vos pages sont disponibles en plusieurs <a href="/fr/documentation/configuration/langues/#languages">langues</a>, il existe 2 façons différentes de le définir :</p>
<h2 id="via-le-nom-de-fichier">Via le nom de fichier</h2>
<p>C’est la méthode la plus courante pour traduire une page depuis la <a href="/fr/documentation/configuration/langues/#language">langue</a> principale vers une autre langue.</p>
<p>Il suffit de dupliquer la page de référence et de lui ajouter en suffixe le <code translate="no">code</code> de la langue cible (ex. : <code translate="no">fr</code>).</p>
<p><em>Exemple :</em></p>
<pre><code class="language-plaintext hljs plaintext" translate="no">├─ about.md    # the reference page
└─ about.fr.md # the french version (`fr`)</code></pre>
<aside class="note note-tip"><p>Vous pouvez changer l’URL de la page traduite avec la variable <code translate="no">slug</code> dans le front matter. Par exemple :</p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">slug:</span> <span class="hljs-string">a-propos</span>
<span class="hljs-meta">---</span>
<span class="hljs-comment"># about.md    -&gt; /about/</span>
<span class="hljs-comment"># about.fr.md -&gt; /fr/a-propos/</span></code></pre></aside>
<h2 id="via-le-front-matter">Via le front matter</h2>
<p>Si vous souhaitez créer une page dans une langue autre que la langue principale, sans qu’elle soit la traduction d’une page existante, vous pouvez utiliser la variable <code translate="no">language</code> dans son front matter.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">language:</span> <span class="hljs-string">fr</span>
<span class="hljs-meta">---</span></code></pre>
<h2 id="lier-les-pages-traduites">Lier les pages traduites</h2>
<p>Chaque page traduite référence les pages dans les autres langues.</p>
<p>Cette collection de pages est disponible dans les <a href="/fr/documentation/templates/variables/#page">templates</a> via la variable suivante :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ page.translations }}</span></code></pre>
<aside class="note note-info"><p>La variable <code translate="no">langref</code> est fournie par défaut, mais vous pouvez la modifier dans le front matter :</p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">langref:</span> <span class="hljs-string">my-page-ref</span>
<span class="hljs-meta">---</span></code></pre></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/contenu-dynamique/</id>
    <title>Contenu dynamique</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/contenu-dynamique/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Contenu dynamique</h1>
<p>Vous pouvez créer du contenu dynamique dans une page en utilisant la fonction Twig <a href="https://twig.symfony.com/doc/3.x/functions/template_from_string.html" target="_blank" rel="noopener noreferrer"><code translate="no">template_from_string</code></a>.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ <span class="hljs-name">include</span><span class="hljs-params">(template_from_string(page.content, "contenu dynamique pour la page " ~ page.id)</span>) }}</span></code></pre>
<p>Avec cette approche, vous pouvez utiliser n’importe quelle variable de page dans le <em>body</em> de la page.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="xml">--
var: 'value'
---
La valeur de `var` est </span><span class="hljs-template-variable">{{ page.var }}</span><span class="xml">.</span></code></pre>]]>
    </content>
  </entry>
</feed>
