{"title":"Traduction","version":"4.2","locale":"fr","docname":"topics/i18n/translation","url":"/fr/4.2/topics/i18n/translation/","canonical":"https://djangodocs.dev/fr/4.2/topics/i18n/translation/","summary":"Aperçu Lien vers cette rubrique # Dans le but de rendre traduisible un projet Django, il est nécessaire d’ajouter un minimum de marqueurs dans le code Python et les…","html":"<h1>Traduction<a class=\"heading-anchor\" href=\"#translation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"overview\">\n<h2>Aperçu<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dans le but de rendre traduisible un projet Django, il est nécessaire d’ajouter un minimum de marqueurs dans le code Python et les gabarits. Ces marqueurs s’appellent des <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-translation-string\"><span class=\"xref std std-term\">chaînes de traduction</span></a>. Ils indiquent à Django que « ce texte doit être traduit dans la langue de l’utilisateur pour autant qu’il existe une traduction de ce texte dans cette langue ». Il est de votre responsabilité de marquer les chaînes de caractères traduisibles ; le système ne peut traduire que les éléments qu’on lui a indiqués.</p>\n<p>Django fournit ensuite des utilitaires pour extraire les chaînes à traduire dans un <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">fichier de messages</span></a>. Ce fichier sert ensuite aux traducteurs qui pourront faire leur travail en rédigeant les équivalences des chaînes à traduire dans leur langue. Lorsque que ce travail est terminé, le fichier doit être compilé. Ce processus se base sur les outils GNU gettext.</p>\n<p>Quand tout cela est fait, Django s’occupe de traduire les applications web à la volée dans chacune des langues disponibles, en accord avec les préférences linguistiques des utilisateurs.</p>\n<p>Le système d’internationalisation de Django est activé par défaut, ce qui peut générer un petit surplus de travail à certains endroits du système. Si vous n’utilisez pas l’internationalisation, prenez les deux secondes nécessaires à définir <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code></a> dans votre fichier de réglages. Django pourra alors effectuer certaines optimisations en ne chargeant pas tout le mécanisme d’internationalisation.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Vérifiez si la traduction est activée dans votre projet (la manière la plus rapide est de contrôler la présence de <a class=\"reference internal\" href=\"/fr/4.2/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.middleware.locale.LocaleMiddleware</span></code></a> dans <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>). Si ce n’est pas encore fait, lisez <a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">Processus de découverte de la préférence de langue par Django</span></a>.</p>\n</aside>\n</section>\n<section id=\"internationalization-in-python-code\">\n<h2>Internationalisation : dans le code Python<a class=\"heading-anchor\" href=\"#internationalization-in-python-code\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"standard-translation\">\n<h3>Traduction standard<a class=\"heading-anchor\" href=\"#standard-translation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Définissez une chaîne à traduire en utilisant la fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a>. Par convention, il est fréquent de l’importer par un alias plus court, <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>, pour s’économiser des frappes au clavier.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Le module <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> de la bibliothèque Python standard installe <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> dans l’espace de noms global comme alias de <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code>. Dans Django, nous avons choisi de ne pas suivre cette pratique, pour plusieurs raisons :</p>\n<ol class=\"arabic simple\">\n<li><p>Parfois, il est préférable d’utiliser <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code></a> comme méthode de traduction par défaut dans un certain fichier. En l’absence de <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> dans l’espace de noms global, le développeur doit réfléchir à ce qui est le plus approprié comme fonction de traduction.</p></li>\n<li><p>Le caractère soulignement (<code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>) est utilisé pour représenter le « résultat précédent » dans le shell interactif de Python et les tests <code class=\"docutils literal notranslate\"><span class=\"pre\">doctest</span></code>. L’installation globale de <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> interfère avec le précédent. L’importation explicite de <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> comme <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> évite ce problème.</p></li>\n</ol>\n</aside>\n<aside class=\"admonition-what-functions-may-be-aliased-as admonition\">\n<p class=\"admonition-title\">Quelles fonctions peuvent-elles avoir <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code> comme alias ?</p>\n<p>En raison du fonctionnement de <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> (utilisé par <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a>), seules les fonctions acceptant un seul paramètre textuel peuvent être importées avec l’alias <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code></a></p></li>\n</ul>\n</aside>\n<p>Dans cet exemple, le texte <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Welcome</span> <span class=\"pre\">to</span> <span class=\"pre\">my</span> <span class=\"pre\">site.&quot;</span></code> est marqué comme chaîne à traduire :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>On aurait pu écrire cela sans employer l’alias. Cet exemple est identique au précédent :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">gettext</span><span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>La traduction fonctionne sur des valeurs calculées. Cet exemple est identique aux deux précédents :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">words</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Welcome&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;to&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;my&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;site.&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot; &quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">words</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>La traduction fonctionne avec des variables. Encore une fois, voici un exemple identique :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">sentence</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Welcome to my site.&quot;</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"n\">sentence</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(L’inconvénient avec l’utilisation de variables ou de valeurs calculées comme dans les deux exemples précédents, c’est que l’utilitaire de détection des chaînes à traduire de Django, <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a>, ne sera pas capable de trouver ces chaînes. Plus de détails sur <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> un peu plus tard.)</p>\n<p>Les chaînes que vous placez dans <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> acceptent des substituants sous la forme de la syntaxe d’interpolation par paramètres nommés standard de Python. Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"n\">d</span><span class=\"p\">):</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Today is </span><span class=\"si\">%(month)s</span><span class=\"s2\"> </span><span class=\"si\">%(day)s</span><span class=\"s2\">.&quot;</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s2\">&quot;month&quot;</span><span class=\"p\">:</span> <span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">:</span> <span class=\"n\">d</span><span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cette technique permet aux différentes traductions de modifier l’ordre des substituants. Par exemple, pour un texte anglais <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Today</span> <span class=\"pre\">is</span> <span class=\"pre\">November</span> <span class=\"pre\">26.&quot;</span></code>, la traduction espagnole pourrait être <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Hoy</span> <span class=\"pre\">es</span> <span class=\"pre\">26</span> <span class=\"pre\">de</span> <span class=\"pre\">noviembre.&quot;</span></code>, avec les substituants mois et jour intervertis.</p>\n<p>Pour cette raison, il est recommandé d’utiliser l’interpolation par paramètre nommé (ex : <code class=\"docutils literal notranslate\"><span class=\"pre\">%(day)s</span></code>) au lieu de l’interpolation par position (ex : <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">%d</span></code>) chaque fois qu’il y a plus d’un paramètre. Avec l’interpolation par position, les traductions ne peuvent pas changer l’ordre des substituants.</p>\n<p>Comme l’extraction de chaînes est effectuée par la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code>, seules les syntaxes prises en charge par <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> sont prises en charge par Django. En particulier, les chaînes Python <a class=\"reference external\" href=\"https://docs.python.org/3/reference/lexical_analysis.html#f-strings\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">f-strings</span></a> ne sont actuellement pas prises en charge par <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> et les chaînes « template strings » de JavaScript nécessitent une version de <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> à partir de 0.21.</p>\n</section>\n<section id=\"comments-for-translators\">\n<span id=\"translator-comments\"></span><h3>Commentaires pour les traducteurs<a class=\"heading-anchor\" href=\"#comments-for-translators\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous souhaitez donner des indications aux traducteurs à propos d’une chaîne à traduire, vous pouvez ajouter un commentaire préfixé par le mot-clé <code class=\"docutils literal notranslate\"><span class=\"pre\">Translators</span></code> à la ligne précédant la chaîne ; par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Translators: This message appears on the home page only</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">gettext</span><span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Le commentaire apparaîtra alors dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> résultant de l’extraction des chaînes, juste avant le bloc de la chaîne à traduire, et la plupart des outils de traduction l’affichent également dans leur interface.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Pour les curieux, voici le fragment correspondant dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> résultant :</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"c1\">#. Translators: This message appears on the home page only</span>\n<span class=\"c1\"># path/to/python/file.py:123</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Welcome to my site.&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n</aside>\n<p>Cela fonctionne aussi dans les gabarits. Voir <a class=\"reference internal\" href=\"#translator-comments-in-templates\"><span class=\"std std-ref\">Commentaires pour les traducteurs dans les gabarits</span></a> pour plus de détails.</p>\n</section>\n<section id=\"marking-strings-as-no-op\">\n<h3>Marquage des chaînes « en blanc »<a class=\"heading-anchor\" href=\"#marking-strings-as-no-op\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext_noop\" title=\"django.utils.translation.gettext_noop\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.gettext_noop()</span></code></a> permet de marquer une chaîne comme chaîne à traduire, mais sans la traduire réellement. La traduction effective peut se faire plus tard à partir d’une variable.</p>\n<p>Cette technique est utile pour des chaînes constantes devant être stockées dans la langue source parce qu’elles sont échangées entre systèmes ou utilisateurs, comme des chaînes en base de données, mais qu’elles devraient être traduites le plus tard possible, juste avant d’être affichées pour un utilisateur.</p>\n</section>\n<section id=\"pluralization\">\n<h3>Pluriels<a class=\"heading-anchor\" href=\"#pluralization\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.ngettext\" title=\"django.utils.translation.ngettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.ngettext()</span></code></a> permet de marquer des messages contenant un pluriel.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext()</span></code> accepte trois paramètres : la chaîne à traduire au singulier, la chaîne à traduire au pluriel et le nombre d’objets.</p>\n<p>Cette fonction est utile lorsque vous voulez traduire votre application Django dans des langues où le nombre et la complexité des <a class=\"reference external\" href=\"https://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms\">formes plurielles</a> sont plus grands que les deux formes utilisées en anglais (« object » pour le singulier et « objects » dans tous les cas où <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> est différent de un, quelle que soit sa valeur).</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">hello_world</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">count</span><span class=\"p\">):</span>\n    <span class=\"n\">page</span> <span class=\"o\">=</span> <span class=\"n\">ngettext</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;there is </span><span class=\"si\">%(count)d</span><span class=\"s2\"> object&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;there are </span><span class=\"si\">%(count)d</span><span class=\"s2\"> objects&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">count</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;count&quot;</span><span class=\"p\">:</span> <span class=\"n\">count</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">page</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Dans cet exemple, le nombre d’objets est communiqué à la langue de traduction par la variable <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code>.</p>\n<p>Notez que les pluriels sont compliqués et fonctionnent différemment pour chaque langue. La comparaison de <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> avec 1 n’est pas toujours la règle correcte. Ce code semble sophistiqué, mais produira des résultats incorrects pour certaines langues :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Report</span>\n\n<span class=\"n\">count</span> <span class=\"o\">=</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n<span class=\"k\">if</span> <span class=\"n\">count</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name_plural</span>\n\n<span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">ngettext</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;There is </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;There are </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">count</span><span class=\"p\">,</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s2\">&quot;count&quot;</span><span class=\"p\">:</span> <span class=\"n\">count</span><span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">name</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>N’essayez pas d’implémenter votre propre logique de singulier/pluriel, vous n’y arriverez pas. Dans un cas comme celui-ci, pensez plutôt à faire quelque chose comme :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">ngettext</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;There is </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> object available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;There are </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> objects available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">count</span><span class=\"p\">,</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;count&quot;</span><span class=\"p\">:</span> <span class=\"n\">count</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" id=\"pluralization-var-notes\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>En utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext()</span></code>, prenez soin de toujours utiliser le même nom pour chaque variable extrapolée incluse dans la chaîne. Dans les exemples ci-dessus, notez comment nous avons utilisé la variable Python <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> dans les deux chaînes à traduire. Cet exemple, en plus d’être faux pour certaines langues comme nous l’avons mentionné, ne fonctionnera pas :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">ngettext</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;There is </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;There are </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(plural_name)s</span><span class=\"s2\"> available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">count</span><span class=\"p\">,</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;count&quot;</span><span class=\"p\">:</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">(),</span>\n    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;plural_name&quot;</span><span class=\"p\">:</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name_plural</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Vous obtiendriez une erreur lors du lancement de <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"pytb\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Pytb</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Pytb code\"><code><span class=\"x\">a format specification for argument &#39;name&#39;, as in &#39;msgstr[0]&#39;, doesn&#39;t exist in &#39;msgid&#39;</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"contextual-markers\">\n<span id=\"id1\"></span><h3>Marqueurs contextuels<a class=\"heading-anchor\" href=\"#contextual-markers\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Il peut arriver que des mots ont plusieurs significations, comme <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;May&quot;</span></code> en anglais, qui peut se référer à un nom de mois ou à un verbe. Pour permettre aux traducteurs de traduire correctement ces mots dans des contextes différents, il est possible d’utiliser la fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.pgettext\" title=\"django.utils.translation.pgettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.pgettext()</span></code></a>, ou <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.npgettext\" title=\"django.utils.translation.npgettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.npgettext()</span></code></a> si la chaîne contient des pluriels. Les deux acceptent une chaîne de contexte comme premier paramètre.</p>\n<p>Dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> résultant, la même chaîne apparaîtra aussi souvent qu’il y a de marqueurs contextuels différents (le contexte apparaît à la ligne <code class=\"docutils literal notranslate\"><span class=\"pre\">msgctxt</span></code>), permettant ainsi au traducteur d’attribuer des traductions différentes à chacune d’elles.</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">pgettext</span>\n\n<span class=\"n\">month</span> <span class=\"o\">=</span> <span class=\"n\">pgettext</span><span class=\"p\">(</span><span class=\"s2\">&quot;month name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;May&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>ou :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">pgettext_lazy</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span>\n        <span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"n\">pgettext_lazy</span><span class=\"p\">(</span><span class=\"s2\">&quot;help text for MyThing model&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;This is the help text&quot;</span><span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>apparaîtra dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> comme :</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"nv\">msgctxt</span> <span class=\"s\">&quot;month name&quot;</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;May&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n<p>Les marqueurs contextuels sont également pris en charge par les balises de gabarit <a class=\"reference internal\" href=\"#std-templatetag-translate\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">translate</span></code></a> et <a class=\"reference internal\" href=\"#std-templatetag-blocktranslate\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code></a>.</p>\n</section>\n<section id=\"lazy-translation\">\n<span id=\"lazy-translations\"></span><h3>Traduction différée<a class=\"heading-anchor\" href=\"#lazy-translation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les versions différées des fonctions de traduction dans <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#module-django.utils.translation\" title=\"django.utils.translation: Internationalization support.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.translation</span></code></a> (facilement reconnaissables par le suffixe <code class=\"docutils literal notranslate\"><span class=\"pre\">lazy</span></code> dans leur nom) permettent de traduire du texte en différé, au moment où la chaîne est réellement utilisée plutôt qu’au moment où la fonction est appelée.</p>\n<p>Ces fonctions stockent une référence différée à la chaîne originale, et non pas la traduction réelle. La traduction en tant que telle est effectuée lorsque le texte est utilisé dans un contexte textuel, par exemple dans le rendu d’un gabarit.</p>\n<p>Ce procédé est essentiel lorsque les appels à ces fonctions sont situés dans des endroits du code qui sont exécutés lors du chargement des modules.</p>\n<p>Ceci peut facilement se produire lors de la définition des modèles, des formulaires et des formulaires de modèle, car la manière dont Django les implémente fait que leurs champs sont des attributs de classe. C’est pour cette raison qu’il faut utiliser des traductions différées dans les cas suivants :</p>\n<section id=\"model-fields-and-relationships-verbose-name-and-help-text-option-values\">\n<h4>Valeurs d’options <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> des champs et relations de modèle<a class=\"heading-anchor\" href=\"#model-fields-and-relationships-verbose-name-and-help-text-option-values\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Par exemple, pour traduire le texte d’aide du champ <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> dans le modèle suivant, faites comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;This is the help text&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Vous pouvez marquer les noms des relations <a class=\"reference internal\" href=\"/fr/4.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>, <a class=\"reference internal\" href=\"/fr/4.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> ou <a class=\"reference internal\" href=\"/fr/4.2/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> comme chaînes à traduire en utilisant leur option <a class=\"reference internal\" href=\"/fr/4.2/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">kind</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">ThingKind</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;kinds&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">verbose_name</span><span class=\"o\">=</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;kind&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>Comme vous le feriez pour <a class=\"reference internal\" href=\"/fr/4.2/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a>, le texte de nom verbeux de la relation devrait être en minuscules, car Django s’occupe de mettre les majuscules dans les situations appropriées.</p>\n</section>\n<section id=\"model-verbose-names-values\">\n<h4>Valeurs de noms verbeux de modèle<a class=\"heading-anchor\" href=\"#model-verbose-names-values\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Il est recommandé de toujours fournir les options explicites <a class=\"reference internal\" href=\"/fr/4.2/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a> et <a class=\"reference internal\" href=\"/fr/4.2/ref/models/options/#django.db.models.Options.verbose_name_plural\" title=\"django.db.models.Options.verbose_name_plural\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name_plural</span></code></a> plutôt que de vous rabattre sur la version anglo-centrique et déterminée de manière quelque peu naïve du nom verbeux que Django crée en se basant sur le nom de classe du modèle :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">),</span> <span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;This is the help text&quot;</span><span class=\"p\">))</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">verbose_name</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;my thing&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;my things&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"model-methods-description-argument-to-the-display-decorator\">\n<h4>L’argument <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> des méthodes de modèles passé au décorateur <code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;display</span></code><a class=\"heading-anchor\" href=\"#model-methods-description-argument-to-the-display-decorator\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les méthodes de modèle, vous pouvez indiquer à Django et au site d’administration des descriptions traduisibles par l’argument <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> du décorateur <a class=\"reference internal\" href=\"/fr/4.2/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">display()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">kind</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">ThingKind</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;kinds&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">verbose_name</span><span class=\"o\">=</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;kind&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">display</span><span class=\"p\">(</span><span class=\"n\">description</span><span class=\"o\">=</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Is it a mouse?&quot;</span><span class=\"p\">))</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">is_mouse</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">kind</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">==</span> <span class=\"n\">MOUSE_TYPE</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"working-with-lazy-translation-objects\">\n<h3>Manipulation des objets de traduction différée<a class=\"heading-anchor\" href=\"#working-with-lazy-translation-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le résultat d’un appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code> peut être utilisé partout là où une chaîne (un objet <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">str</span></code></a>) peut être utilisée dans le code Django, mais cela ne fonctionne par forcément avec n’importe quel code Python. Par exemple, le code suivant ne marchera pas car la bibliothèque <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/requests/\">requests</a> ne gère pas les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">body</span> <span class=\"o\">=</span> <span class=\"n\">gettext_lazy</span><span class=\"p\">(</span><span class=\"s2\">&quot;I </span><span class=\"se\">\\u2764</span><span class=\"s2\"> Django&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># (Unicode :heart:)</span>\n<span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://example.com/send&quot;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">:</span> <span class=\"n\">body</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Vous pouvez éviter ce genre de problème en forçant les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code> en chaînes de texte avant de les passer à du code non Django :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://example.com/send&quot;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">:</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">body</span><span class=\"p\">)})</span>\n</code></pre></div>\n<p>Si vous n’aimez pas le long nom de <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy</span></code>, vous pouvez en faire un alias <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code> (soulignement), comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;This is the help text&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>L’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext_lazy()</span></code> pour marquer des chaînes dans des modèles et des fonctions utilitaires est une opération courante. Lorsque que vous manipulez ces objets ailleurs dans votre code, vous devriez prendre soin de ne jamais les convertir accidentellement en chaînes de caractères, car ils devraient être convertis le plus tard possible (afin que la langue correcte soit active). Ceci nécessite l’emploi de la fonction utilitaire décrite ci-après.</p>\n<section id=\"lazy-translations-and-plural\">\n<span id=\"lazy-plural-translations\"></span><h4>Traductions différées et pluriels<a class=\"heading-anchor\" href=\"#lazy-translations-and-plural\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Lors de l’utilisation de traductions différées avec une chaîne contenant des pluriels (<code class=\"docutils literal notranslate\"><span class=\"pre\">n[p]gettext_lazy</span></code>), vous ne connaissez généralement pas le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> au moment de la définition de la chaîne. C’est pourquoi vous êtes autorisé dans ce cas à passer un nom de clé au lieu d’un nombre comme paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code>. Ensuite, cette clé <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> sera cherchée dans le dictionnaire durant l’extrapolation de la chaîne. Voici un exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext_lazy</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">error_message</span> <span class=\"o\">=</span> <span class=\"n\">ngettext_lazy</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;You only provided </span><span class=\"si\">%(num)d</span><span class=\"s2\"> argument&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;You only provided </span><span class=\"si\">%(num)d</span><span class=\"s2\"> arguments&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">if</span> <span class=\"n\">error</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">error_message</span> <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">:</span> <span class=\"n\">number</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Si la chaîne contient un seul substituant non nommé, vous pouvez directement interpoler avec le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">error_message</span> <span class=\"o\">=</span> <span class=\"n\">ngettext_lazy</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;You provided </span><span class=\"si\">%d</span><span class=\"s2\"> argument&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;You provided </span><span class=\"si\">%d</span><span class=\"s2\"> arguments&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">if</span> <span class=\"n\">error</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">error_message</span> <span class=\"o\">%</span> <span class=\"n\">number</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"formatting-strings-format-lazy\">\n<h4>Mise en forme de chaînes : <code class=\"docutils literal notranslate\"><span class=\"pre\">format_lazy()</span></code><a class=\"heading-anchor\" href=\"#formatting-strings-format-lazy\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La méthode <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format()</span></code></a> de Python ne fonctionne pas quand la chaîne <code class=\"docutils literal notranslate\"><span class=\"pre\">format_string</span></code> ou l’un des paramètres de <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format()</span></code></a> contient des objets de traduction différée. Il faut utiliser <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.text.format_lazy\" title=\"django.utils.text.format_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.text.format_lazy()</span></code></a> à la place, ce qui va créer un objet différé qui se chargera d’exécuter la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">str.format()</span></code> au moment précis ou le résultat sera inclus dans une chaîne. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.text</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">format_lazy</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span>\n\n<span class=\"o\">...</span>\n<span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">gettext_lazy</span><span class=\"p\">(</span><span class=\"s2\">&quot;John Lennon&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">instrument</span> <span class=\"o\">=</span> <span class=\"n\">gettext_lazy</span><span class=\"p\">(</span><span class=\"s2\">&quot;guitar&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">format_lazy</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">{name}</span><span class=\"s2\">: </span><span class=\"si\">{instrument}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">instrument</span><span class=\"o\">=</span><span class=\"n\">instrument</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Dans ce cas, les traductions différées dans <code class=\"docutils literal notranslate\"><span class=\"pre\">result</span></code> ne seront converties en chaînes qu’au moment où <code class=\"docutils literal notranslate\"><span class=\"pre\">result</span></code> sera elle-même utilisée dans une chaîne (habituellement au moment du rendu du gabarit).</p>\n</section>\n<section id=\"other-uses-of-lazy-in-delayed-translations\">\n<h4>Autres usages de traductions différées avec <code class=\"docutils literal notranslate\"><span class=\"pre\">lazy</span></code><a class=\"heading-anchor\" href=\"#other-uses-of-lazy-in-delayed-translations\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Dans tout autre situation où il serait utile de différer la traduction mais qu’il est nécessaire de passer la chaîne à traduire comme paramètre d’une autre fonction, il est possible d’envelopper vous-même cette fonction à l’intérieur d’un appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">lazy</span></code>. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.functional</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">lazy</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.safestring</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">mark_safe</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"n\">mark_safe_lazy</span> <span class=\"o\">=</span> <span class=\"n\">lazy</span><span class=\"p\">(</span><span class=\"n\">mark_safe</span><span class=\"p\">,</span> <span class=\"nb\">str</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Puis, plus tard :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">lazy_string</span> <span class=\"o\">=</span> <span class=\"n\">mark_safe_lazy</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;p&gt;My &lt;strong&gt;string!&lt;/strong&gt;&lt;/p&gt;&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"localized-names-of-languages\">\n<h3>Noms de langues régionalisés<a class=\"heading-anchor\" href=\"#localized-names-of-languages\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.utils.translation.get_language_info\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_language_info</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lang_code</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.translation.get_language_info\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>La fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">get_language_info()</span></code> fournit des informations détaillées sur les langues :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">activate</span><span class=\"p\">,</span> <span class=\"n\">get_language_info</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">li</span> <span class=\"o\">=</span> <span class=\"n\">get_language_info</span><span class=\"p\">(</span><span class=\"s2\">&quot;de&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">],</span> <span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s2\">&quot;name_local&quot;</span><span class=\"p\">],</span> <span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s2\">&quot;name_translated&quot;</span><span class=\"p\">],</span> <span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s2\">&quot;bidi&quot;</span><span class=\"p\">])</span>\n<span class=\"go\">German Deutsch Allemand False</span>\n</code></pre></div>\n<p>Les attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">name_local</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">name_translated</span></code> du dictionnaire contiennent respectivement le nom de langue en anglais, dans la langue elle-même et dans la langue actuellement active. L’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">bidi</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> seulement pour les langues s’écrivant de droite à gauche.</p>\n<p>La source des informations sur les langues se trouve dans le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.conf.locale</span></code>. Ces informations sont également accessibles dans le code des gabarits. Voir ci-dessous.</p>\n</section>\n</section>\n<section id=\"internationalization-in-template-code\">\n<span id=\"specifying-translation-strings-in-template-code\"></span><h2>Internationalisation : dans le code des gabarits<a class=\"heading-anchor\" href=\"#internationalization-in-template-code\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les traductions dans les <a class=\"reference internal\" href=\"/fr/4.2/ref/templates/language/\"><span class=\"doc\">gabarits Django</span></a> utilisent deux balises de gabarit et une syntaxe légèrement différente que dans le code Python. Pour donner accès à ces balises dans vos gabarits, ajoutez <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">i18n</span> <span class=\"pre\">%}</span></code> au sommet de votre gabarit. Comme pour toutes les balises de gabarit, cette balise doit être chargée dans tous les gabarits qui utilisent les traductions, même pour les gabarits qui étendent d’autres gabarits ayant déjà chargé la bibliothèque <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n</span></code>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Les chaînes traduites ne sont pas échappées lorsqu’elle sont introduites dans un gabarit. Cela permet d’inclure du HTML dans les traductions, par exemple pour des mises en évidence, mais de potentiels dangereux caractères seront également insérés tel quel.</p>\n</aside>\n<section id=\"translate-template-tag\">\n<span id=\"std-templatetag-translate\"></span><span id=\"std-templatetag-trans\"></span><h3>Balise de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">translate</span></code><a class=\"heading-anchor\" href=\"#translate-template-tag\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La balise de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">translate</span> <span class=\"pre\">%}</span></code> traduit soit une chaîne constante (entourée de guillemets simples ou doubles) ou un contenu de variable :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;This is the title.&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"nv\">myvar</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Si l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">noop</span></code> est présente, l’accès à la variable se fait toujours mais la traduction est omise. C’est utile pour marquer du contenu qui devra être traduit à un moment ultérieur :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;myvar&quot;</span> <span class=\"nv\">noop</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>En interne, cette technique de traduction fait appel à <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a>.</p>\n<p>Dans le cas où une variable de gabarit (<code class=\"docutils literal notranslate\"><span class=\"pre\">myvar</span></code> ci-dessus) est passée à la balise, celle-ci résout en premier la variable en chaîne au moment de l’exécution puis consulte les catalogues de messages pour trouver une traduction.</p>\n<p>Il n’est pas possible de mélanger du texte littéral et des variables dans <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">translate</span> <span class=\"pre\">%}</span></code>. si vos traductions nécessitent des chaînes contenant des variables (substituants), utilisez plutôt <a class=\"reference internal\" href=\"#std-templatetag-blocktranslate\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code></a>.</p>\n<p>Si vous aimeriez récupérer une chaîne traduite sans l’afficher, vous pouvez utiliser la syntaxe suivante :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;This is the title&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">the_title</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">meta</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;description&quot;</span> <span class=\"na\">content</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>En pratique, vous utiliserez cela pour obtenir une chaîne utilisée à plusieurs endroits dans un gabarit ou qui doit être passée comme paramètre à d’autres balises ou filtres de gabarit :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;starting point&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">start</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;end point&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">end</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;La Grande Boucle&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">race</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/&quot;</span> <span class=\"na\">title</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span><span class=\"s\">Back to &#39;</span><span class=\"cp\">{{</span> <span class=\"nv\">race</span> <span class=\"cp\">}}</span><span class=\"s\">&#39; homepage</span><span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">race</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">stage</span> <span class=\"k\">in</span> <span class=\"nv\">tour_stages</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">cycle</span> <span class=\"nv\">start</span> <span class=\"nv\">end</span> <span class=\"cp\">%}</span>: <span class=\"cp\">{{</span> <span class=\"nv\">stage</span> <span class=\"cp\">}}{%</span> <span class=\"k\">if</span> <span class=\"nb\">forloop</span><span class=\"nv\">.counter</span><span class=\"o\">|</span><span class=\"nf\">divisibleby</span><span class=\"o\">:</span><span class=\"m\">2</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;</span><span class=\"nt\">br</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>, <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">translate</span> <span class=\"pre\">%}</span></code> prend aussi en charge les <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">marqueurs contextuels</span></a> à l’aide du mot-clé <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;May&quot;</span> <span class=\"nv\">context</span> <span class=\"s2\">&quot;month name&quot;</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n<section id=\"blocktranslate-template-tag\">\n<span id=\"std-templatetag-blocktranslate\"></span><span id=\"std-templatetag-blocktrans\"></span><h3>Balise de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code><a class=\"heading-anchor\" href=\"#blocktranslate-template-tag\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Contrairement à la balise <a class=\"reference internal\" href=\"#std-templatetag-translate\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">translate</span></code></a>, la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code> permet de marquer comme chaînes à traduire des phrases complexes contenant à la fois du texte littéral et des variables par le moyen des substituants :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span>This string will have <span class=\"cp\">{{</span> <span class=\"nv\">value</span> <span class=\"cp\">}}</span> inside.<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Pour traduire une expression de gabarit, par exemple un accès aux attributs d’un objet ou une utilisation de filtre de gabarit, il est nécessaire de lier l’expression à une variable locale pour l’utiliser ensuite dans le bloc à traduire. Exemple :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">amount</span><span class=\"o\">=</span><span class=\"nv\">article.price</span> <span class=\"cp\">%}</span>\nThat will cost $ <span class=\"cp\">{{</span> <span class=\"nv\">amount</span> <span class=\"cp\">}}</span>.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">myvar</span><span class=\"o\">=</span><span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">filter</span> <span class=\"cp\">%}</span>\nThis will have <span class=\"cp\">{{</span> <span class=\"nv\">myvar</span> <span class=\"cp\">}}</span> inside.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Vous pouvez utiliser plusieurs expressions à l’intérieur d’une seule balise <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">book_t</span><span class=\"o\">=</span><span class=\"nv\">book</span><span class=\"o\">|</span><span class=\"nf\">title</span> <span class=\"nv\">author_t</span><span class=\"o\">=</span><span class=\"nv\">author</span><span class=\"o\">|</span><span class=\"nf\">title</span> <span class=\"cp\">%}</span>\nThis is <span class=\"cp\">{{</span> <span class=\"nv\">book_t</span> <span class=\"cp\">}}</span> by <span class=\"cp\">{{</span> <span class=\"nv\">author_t</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>L’ancien format plus verbeux est toujours accepté : {% blocktranslate with book|title as book_t and author|title as author_t %}`</p>\n</aside>\n<p>D’autres balises de bloc (par exemple <a class=\"reference internal\" href=\"/fr/4.2/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code></a> ou <a class=\"reference internal\" href=\"/fr/4.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">if</span> <span class=\"pre\">%}</span></code></a>) ne sont pas autorisées à l’intérieur des balises <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code>.</p>\n<p>Si la résolution d’un des paramètres du bloc échoue, <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code> se rabat sur la langue par défaut en désactivant temporairement la langue actuelle avec la fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.deactivate_all\" title=\"django.utils.translation.deactivate_all\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">deactivate_all()</span></code></a>.</p>\n<p>Cette balise permet également l’utilisation de pluriels. Pour l’utiliser :</p>\n<ul class=\"simple\">\n<li><p>Désignez et liez une valeur de compteur nommée <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code>. Cette valeur sera celle utilisée pour choisir la bonne forme de pluriel.</p></li>\n<li><p>Indiquez à la fois les formes au singulier et au pluriel en les séparant par la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">plural</span> <span class=\"pre\">%}</span></code> à l’intérieur des balises <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endblocktranslate</span> <span class=\"pre\">%}</span></code>.</p></li>\n</ul>\n<p>Un exemple :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"nv\">count</span> <span class=\"nv\">counter</span><span class=\"o\">=</span><span class=\"nv\">list</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"cp\">%}</span>\nThere is only one <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span> object.\n<span class=\"cp\">{%</span> <span class=\"k\">plural</span> <span class=\"cp\">%}</span>\nThere are <span class=\"cp\">{{</span> <span class=\"nv\">counter</span> <span class=\"cp\">}}</span> <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span> objects.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Un exemple plus complexe :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">amount</span><span class=\"o\">=</span><span class=\"nv\">article.price</span> <span class=\"nv\">count</span> <span class=\"nv\">years</span><span class=\"o\">=</span><span class=\"nv\">i.length</span> <span class=\"cp\">%}</span>\nThat will cost $ <span class=\"cp\">{{</span> <span class=\"nv\">amount</span> <span class=\"cp\">}}</span> per year.\n<span class=\"cp\">{%</span> <span class=\"k\">plural</span> <span class=\"cp\">%}</span>\nThat will cost $ <span class=\"cp\">{{</span> <span class=\"nv\">amount</span> <span class=\"cp\">}}</span> per <span class=\"cp\">{{</span> <span class=\"nv\">years</span> <span class=\"cp\">}}</span> years.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Lorsque vous utilisez à la fois la fonction de pluriel et l’attribution de valeurs à des variables locales en plus de la valeur de compteur, il faut savoir qu’en interne, <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code> est converti en un appel <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code>. Cela signifie que les <a class=\"reference internal\" href=\"#pluralization-var-notes\"><span class=\"std std-ref\">notes concernant les variables ngettext</span></a> s’appliquent également.</p>\n<p>La résolution inverse d’URL ne peut pas se faire à l’intérieur de <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code> et doit donc être effectuée au préalable :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;path.to.view&#39;</span> <span class=\"nv\">arg</span> <span class=\"nv\">arg2</span> <span class=\"k\">as</span> <span class=\"nv\">the_url</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span>\nThis is a URL: <span class=\"cp\">{{</span> <span class=\"nv\">the_url</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Si vous aimeriez récupérer une chaîne traduite sans l’afficher, vous pouvez utiliser la syntaxe suivante :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"nv\">asvar</span> <span class=\"nv\">the_title</span> <span class=\"cp\">%}</span>The title is <span class=\"cp\">{{</span> <span class=\"nv\">title</span> <span class=\"cp\">}}</span>.<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">meta</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;description&quot;</span> <span class=\"na\">content</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>En pratique, vous utiliserez cela pour obtenir une chaîne utilisée à plusieurs endroits dans un gabarit ou qui doit être passée comme paramètre à d’autres balises ou filtres de gabarit.</p>\n<aside class=\"version-note version-changed\" data-version=\"4.2\">\n<p class=\"version-note-title\">Changed in Django 4.2</p><p>Dans les anciennes versions, les instances <code class=\"docutils literal notranslate\"><span class=\"pre\">asvar</span></code> n’étaient pas marquées comme sûres concernant la production HTML.</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> prend aussi en charge les <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">marqueurs contextuels</span></a> à l’aide du mot-clé <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">name</span><span class=\"o\">=</span><span class=\"nv\">user.username</span> <span class=\"nv\">context</span> <span class=\"s2\">&quot;greeting&quot;</span> <span class=\"cp\">%}</span>Hi <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Une autre fonctionnalité prise en charge par la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> est l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">trimmed</span></code>. Cette option supprime les caractères de nouvelle ligne au début et à la fin du contenu de la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code>, remplace les espaces blancs au début et à la fin d’une ligne et fusionne toutes les lignes en une seule via l’utilisation d’un espace pour les séparer. Ceci est très utile pour l’indentation du contenu d’une balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> sans avoir les caractères d’indentation qui se retrouvent dans l’entrée correspondante du fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>, rendant le processus de traduction plus facile.</p>\n<p>Par exemple, la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> suivante :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"nv\">trimmed</span> <span class=\"cp\">%}</span>\n  First sentence.\n  Second paragraph.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>donne comme résultat <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;First</span> <span class=\"pre\">sentence.</span> <span class=\"pre\">Second</span> <span class=\"pre\">paragraph.&quot;</span></code> dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>, comparé à <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;\\n</span> <span class=\"pre\">First</span> <span class=\"pre\">sentence.\\n</span> <span class=\"pre\">Second</span> <span class=\"pre\">paragraph.\\n&quot;</span></code> si l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">trimmed</span></code> n’avait pas été utilisée.</p>\n</section>\n<section id=\"string-literals-passed-to-tags-and-filters\">\n<h3>Texte littéral transmis aux balises et aux filtres<a class=\"heading-anchor\" href=\"#string-literals-passed-to-tags-and-filters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vous pouvez traduire le texte littéral transmis comme paramètre à des balises et des filtres en utilisant la syntaxe familière <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">some_tag</span> <span class=\"kp\">_</span><span class=\"o\">(</span><span class=\"s2\">&quot;Page not found&quot;</span><span class=\"o\">)</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">yesno</span><span class=\"o\">:</span><span class=\"kp\">_</span><span class=\"o\">(</span><span class=\"s2\">&quot;yes,no&quot;</span><span class=\"o\">)</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Dans ce cas, aussi bien la balise que le filtre recevra la chaîne traduite, ils n’ont donc pas besoin de se préoccuper des traductions.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Dans cet exemple, l’infrastructure de traduction recevra la chaîne <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes,no&quot;</span></code>, et non pas les chaînes individuelles <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes&quot;</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;no&quot;</span></code>. La chaîne à traduire devra contenir la virgule afin que le code d’analyse du filtre sache où séparer les paramètres. Par exemple, un traducteur allemand pourrait traduire la chaîne <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes,no&quot;</span></code> comme <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;ja,nein&quot;</span></code> (en préservant la virgule).</p>\n</aside>\n</section>\n<section id=\"comments-for-translators-in-templates\">\n<span id=\"translator-comments-in-templates\"></span><h3>Commentaires pour les traducteurs dans les gabarits<a class=\"heading-anchor\" href=\"#comments-for-translators-in-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Tout comme avec le <a class=\"reference internal\" href=\"#translator-comments\"><span class=\"std std-ref\">code Python</span></a>, ces notes à l’intention des traducteurs peuvent être indiquées en utilisant des commentaires, soit avec la balise <a class=\"reference internal\" href=\"/fr/4.2/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">comment</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">comment</span> <span class=\"cp\">%}</span><span class=\"c\">Translators: View verb</span><span class=\"cp\">{%</span> <span class=\"k\">endcomment</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;View&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">comment</span> <span class=\"cp\">%}</span><span class=\"c\">Translators: Short intro blurb</span><span class=\"cp\">{%</span> <span class=\"k\">endcomment</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span>A multiline translatable\nliteral.<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>ou avec la <a class=\"reference internal\" href=\"/fr/4.2/ref/templates/language/#template-comments\"><span class=\"std std-ref\">syntaxe de commentaire sur une seule ligne</span></a> <code class=\"docutils literal notranslate\"><span class=\"pre\">{#</span></code> … <code class=\"docutils literal notranslate\"><span class=\"pre\">#}</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"c\">{# Translators: Label of a button that triggers search #}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">button</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;Go&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">button</span><span class=\"p\">&gt;</span>\n\n<span class=\"c\">{# Translators: This is a text of the base template #}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span>Ambiguous translatable block of text<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Pour les curieux, voici les fragments correspondant dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> résultant :</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"c1\">#. Translators: View verb</span>\n<span class=\"c1\"># path/to/template/file.html:10</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;View&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n\n<span class=\"c1\">#. Translators: Short intro blurb</span>\n<span class=\"c1\"># path/to/template/file.html:13</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;&quot;</span>\n<span class=\"s\">&quot;A multiline translatable&quot;</span>\n<span class=\"s\">&quot;literal.&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n\n<span class=\"c1\"># ...</span>\n\n<span class=\"c1\">#. Translators: Label of a button that triggers search</span>\n<span class=\"c1\"># path/to/template/file.html:100</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Go&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n\n<span class=\"c1\">#. Translators: This is a text of the base template</span>\n<span class=\"c1\"># path/to/template/file.html:103</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Ambiguous translatable block of text&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"switching-language-in-templates\">\n<span id=\"std-templatetag-language\"></span><h3>Changement de langue dans les gabarits<a class=\"heading-anchor\" href=\"#switching-language-in-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous avez besoin de changer de langue à l’intérieur d’un gabarit, vous pouvez utiliser la balise de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">language</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">get_current_language</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span>\n<span class=\"cm\">&lt;!-- Current language: </span><span class=\"cp\">{{</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">}}</span><span class=\"cm\"> --&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;Welcome to our page&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">language</span> <span class=\"s1\">&#39;en&#39;</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">get_current_language</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span>\n    <span class=\"cm\">&lt;!-- Current language: </span><span class=\"cp\">{{</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">}}</span><span class=\"cm\"> --&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;Welcome to our page&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endlanguage</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Alors que la première occurrence de « Welcome to our page » utilise la langue active, la seconde sera toujours en anglais.</p>\n</section>\n<section id=\"other-tags\">\n<span id=\"i18n-template-tags\"></span><h3>Autres balises<a class=\"heading-anchor\" href=\"#other-tags\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ces balises nécessitent aussi le chargement <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">i18n</span> <span class=\"pre\">%}</span></code>.</p>\n<section id=\"get-available-languages\">\n<span id=\"std-templatetag-get_available_languages\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_available_languages</span></code><a class=\"heading-anchor\" href=\"#get-available-languages\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_available_languages</span> <span class=\"pre\">as</span> <span class=\"pre\">LANGUAGES</span> <span class=\"pre\">%}</span></code> renvoie une liste de tuples dont le premier élément est le <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">code de langue</span></a> et le second est le nom de la langue (traduit dans la langue actuellement active).</p>\n</section>\n<section id=\"get-current-language\">\n<span id=\"std-templatetag-get_current_language\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_current_language</span></code><a class=\"heading-anchor\" href=\"#get-current-language\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_current_language</span> <span class=\"pre\">as</span> <span class=\"pre\">LANGUAGE_CODE</span> <span class=\"pre\">%}</span></code> renvoie la langue préférée de l’utilisateur actuel sous forme textuelle. Exemple : <code class=\"docutils literal notranslate\"><span class=\"pre\">en-us</span></code>. Voir <a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">Processus de découverte de la préférence de langue par Django</span></a>.</p>\n</section>\n<section id=\"get-current-language-bidi\">\n<span id=\"std-templatetag-get_current_language_bidi\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_current_language_bidi</span></code><a class=\"heading-anchor\" href=\"#get-current-language-bidi\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_current_language_bidi</span> <span class=\"pre\">as</span> <span class=\"pre\">LANGUAGE_BIDI</span> <span class=\"pre\">%}</span></code> renvoie la direction du texte de la langue actuelle. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, il s’agit d’une langue s’écrivant de droite à gauche, comme l’hébreu ou l’arabe. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, il s’agit d’une langue s’écrivant de gauche à droite, comme l’anglais, le français, l’allemand, etc.</p>\n</section>\n<section id=\"i18n-context-processor\">\n<span id=\"template-translation-vars\"></span><h4>Processeur de contexte <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n</span></code><a class=\"heading-anchor\" href=\"#i18n-context-processor\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Si vous activez le processeur de contexte <a class=\"reference internal\" href=\"/fr/4.2/ref/templates/api/#django.template.context_processors.i18n\" title=\"django.template.context_processors.i18n\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.context_processors.i18n</span></code></a>, chaque <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code> aura accès à  <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_BIDI</span></code> tels que décrits ci-dessus.</p>\n</section>\n<section id=\"get-language-info\">\n<span id=\"std-templatetag-get_language_info\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_language_info</span></code><a class=\"heading-anchor\" href=\"#get-language-info\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Vous pouvez aussi récupérer toute information à propos des langues disponibles en utilisant des balises et des filtres intégrés. Pour obtenir des informations sur une seule langue, utilisez la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info</span> <span class=\"pre\">%}</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">get_language_info</span> <span class=\"nv\">for</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"k\">as</span> <span class=\"nv\">lang</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">get_language_info</span> <span class=\"nv\">for</span> <span class=\"s2\">&quot;pl&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">lang</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Vous pouvez ensuite accéder à ces informations :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Language code: <span class=\"cp\">{{</span> <span class=\"nv\">lang.code</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;</span><span class=\"nt\">br</span><span class=\"p\">&gt;</span>\nName of language: <span class=\"cp\">{{</span> <span class=\"nv\">lang.name_local</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;</span><span class=\"nt\">br</span><span class=\"p\">&gt;</span>\nName in English: <span class=\"cp\">{{</span> <span class=\"nv\">lang.name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;</span><span class=\"nt\">br</span><span class=\"p\">&gt;</span>\nBi-directional: <span class=\"cp\">{{</span> <span class=\"nv\">lang.bidi</span> <span class=\"cp\">}}</span>\nName in the active language: <span class=\"cp\">{{</span> <span class=\"nv\">lang.name_translated</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n</section>\n<section id=\"get-language-info-list\">\n<span id=\"std-templatetag-get_language_info_list\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_language_info_list</span></code><a class=\"heading-anchor\" href=\"#get-language-info-list\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Vous pouvez aussi utiliser la balise de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code> pour obtenir les informations d’une liste de langues (par ex. les langues actives figurant dans <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a>). Consultez <a class=\"reference internal\" href=\"#set-language-redirect-view\"><span class=\"std std-ref\">la section sur la vue de redirection set_language</span></a> pour trouver un exemple sur la manière d’afficher un sélecteur de langue avec <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code>.</p>\n<p>En plus du style liste de tuples de <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code> accepte des listes de codes de langue. Si vous faites ceci dans votre vue :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;available_languages&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;es&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">]}</span>\n<span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mytemplate.html&quot;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>vous pouvez faire une boucle sur ces langues dans le gabarit :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">get_language_info_list</span> <span class=\"nv\">for</span> <span class=\"nv\">available_languages</span> <span class=\"k\">as</span> <span class=\"nv\">langs</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">lang</span> <span class=\"k\">in</span> <span class=\"nv\">langs</span> <span class=\"cp\">%}</span> ... <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n<section id=\"template-filters\">\n<span id=\"std-templatefilter-language_name_translated\"></span><span id=\"std-templatefilter-language_bidi\"></span><span id=\"std-templatefilter-language_name_local\"></span><span id=\"std-templatefilter-language_name\"></span><h4>Filtres de gabarit<a class=\"heading-anchor\" href=\"#template-filters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Il existe aussi quelques filtres pour votre confort :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">LANGUAGE_CODE|language_name</span> <span class=\"pre\">}}</span></code> (« German »)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">LANGUAGE_CODE|language_name_local</span> <span class=\"pre\">}}</span></code> (« Deutsch »)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">LANGUAGE_CODE|language_bidi</span> <span class=\"pre\">}}</span></code> (False)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">LANGUAGE_CODE|language_name_translated</span> <span class=\"pre\">}}</span></code> (« německy », lorsque la langue actuelle est le tchèque)</p></li>\n</ul>\n</section>\n</section>\n</section>\n<section id=\"internationalization-in-javascript-code\">\n<h2>Internationalisation : dans le code JavaScript<a class=\"heading-anchor\" href=\"#internationalization-in-javascript-code\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>L’ajout de traductions en Javascript pose quelques problèmes :</p>\n<ul class=\"simple\">\n<li><p>Le code JavaScript n’a pas d’accès à une implémentation de <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>.</p></li>\n<li><p>Le code JavaScript n’a pas accès à des fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>; ils doivent être fournis par le serveur.</p></li>\n<li><p>Les catalogues de traduction pour JavaScript doivent être aussi compacts que possible.</p></li>\n</ul>\n<p>Django fournit une solution intégrée pour ces problèmes : il transpose les traductions dans JavaScript afin que vous puissiez appeler les fonctions de type <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> dans votre code JavaScript.</p>\n<p>La solution principale à ces problèmes est la vue <code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code> suivante, qui génère une bibliothèque de code JavaScript avec des fonctions qui simulent l’interface <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>, ainsi qu’un tableau de chaînes de traduction.</p>\n<section id=\"module-django.views.i18n\">\n<span id=\"the-javascriptcatalog-view\"></span><h3>La vue <code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code><a class=\"heading-anchor\" href=\"#module-django.views.i18n\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JavaScriptCatalog\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">JavaScriptCatalog</span></span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Une vue qui génère une bibliothèque de code JavaScript avec des fonctions qui simulent l’interface <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>, ainsi qu’un tableau de chaînes de traduction.</p>\n<p><strong>Attributs</strong></p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JavaScriptCatalog.domain\">\n<span class=\"sig-name descname\"><span class=\"pre\">domain</span></span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog.domain\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Domaine de traduction contenant les chaînes à ajouter dans le résultat de la vue. Contient <code class=\"docutils literal notranslate\"><span class=\"pre\">'djangojs'</span></code> par défaut.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JavaScriptCatalog.packages\">\n<span class=\"sig-name descname\"><span class=\"pre\">packages</span></span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog.packages\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Une liste de <a class=\"reference internal\" href=\"/fr/4.2/ref/applications/#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">noms</span> <span class=\"pre\">d'applications</span></code></a> parmi les applications installées. Ces applications doivent contenir un dossier <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code>. Tous ces catalogues ainsi que ceux trouvés dans <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> (qui sont toujours inclus) sont fusionnés en un seul catalogue. La valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, ce qui signifie que toutes les traductions disponibles de toutes les applications dans <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> sont présentes dans le résultat JavaScript.</p>\n</dd></dl>\n\n<p><strong>Exemple avec les valeurs par défaut</strong> :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">JavaScriptCatalog</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span> <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><strong>Exemple avec des paquets personnalisés</strong> :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/myapp/&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(</span><span class=\"n\">packages</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;your.app.label&quot;</span><span class=\"p\">]),</span>\n        <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Si votre configuration d’URL racine utilise  <a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code> doit également être enveloppé dans <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code> pour que le catalogue soit correctement généré.</p>\n<p><strong>Exemple avec</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">i18n_patterns</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"n\">i18n_patterns</span><span class=\"p\">(</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span> <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<p>La priorité des traductions se fait par ordre d’apparition des modules dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">packages</span></code>; ceux qui apparaissent en dernier ont la priorité sur les premiers. Ceci est important dans le cas où une même chaîne est traduite différemment dans plusieurs catalogues.</p>\n<p>Si vous utilisez plus d’une vue <code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code> sur un site et que plusieurs définissent les mêmes chaînes, les chaînes du catalogue chargé en dernier ont la priorité.</p>\n</section>\n<section id=\"using-the-javascript-translation-catalog\">\n<h3>Emploi du catalogue des traductions JavaScript<a class=\"heading-anchor\" href=\"#using-the-javascript-translation-catalog\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pour utiliser le catalogue, insérez le script généré dynamiquement comme ceci :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">script</span> <span class=\"na\">src</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;javascript-catalog&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Nous utilisons la résolution inverse d’URL pour trouver l’URL de la vue du catalogue JavaScript. Lorsque le catalogue est chargé, votre code JavaScript peut utiliser les méthodes suivantes :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">interpolate</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">get_format</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_noop</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pgettext</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">npgettext</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pluralidx</span></code></p></li>\n</ul>\n<section id=\"gettext\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code><a class=\"heading-anchor\" href=\"#gettext\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> fonctionne de manière similaire à l’interface <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> standard accessible depuis le code Python :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">gettext</span><span class=\"p\">(</span><span class=\"s2\">&quot;this is to be translated&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"ngettext\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code><a class=\"heading-anchor\" href=\"#ngettext\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code> fournit une interface pour mettre au pluriel des mots et des phrases :</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">objectCount</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">1</span><span class=\"w\"> </span><span class=\"c1\">// or 0, or 2, or 3, ...</span>\n<span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">string</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"s1\">&#39;literal for the singular case&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s1\">&#39;literal for the plural case&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"nx\">objectCount</span>\n<span class=\"p\">);</span>\n</code></pre></div>\n</section>\n<section id=\"interpolate\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">interpolate</span></code><a class=\"heading-anchor\" href=\"#interpolate\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">interpolate</span></code> permet de remplir dynamiquement une chaîne de mise en forme. La syntaxe d’interpolation est empruntée à Python ; ainsi, la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">interpolate</span></code> prend en charge à la fois les paramètres nommés et les paramètres positionnels :</p>\n<ul>\n<li><p>Interpolation positionnelle : <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> contient un objet Array JavaScript dont les valeurs d’éléments sont interpolées dans l’ordre d’apparition de leur substituant <code class=\"docutils literal notranslate\"><span class=\"pre\">fmt</span></code> correspondant. Par exemple :</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">formats</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n<span class=\"w\">  </span><span class=\"s1\">&#39;There is %s object. Remaining: %s&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">  </span><span class=\"s1\">&#39;There are %s objects. Remaining: %s&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">  </span><span class=\"mf\">11</span>\n<span class=\"p\">);</span>\n<span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">string</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">interpolate</span><span class=\"p\">(</span><span class=\"nx\">formats</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"mf\">11</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mf\">20</span><span class=\"p\">]);</span>\n<span class=\"c1\">// string is &#39;There are 11 objects. Remaining: 20&#39;</span>\n</code></pre></div>\n</li>\n<li><p>Interpolation nommée : ce mode est sélectionné en passant <code class=\"docutils literal notranslate\"><span class=\"pre\">true</span></code> dans le paramètre booléen facultatif <code class=\"docutils literal notranslate\"><span class=\"pre\">named</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> contient un objet JavaScript ou un tableau associatif. Par exemple :</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"nx\">count</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"mf\">10</span><span class=\"p\">,</span>\n<span class=\"w\">  </span><span class=\"nx\">total</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"mf\">50</span>\n<span class=\"p\">};</span>\n\n<span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">formats</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"s1\">&#39;Total: %(total)s, there is %(count)s object&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s1\">&#39;there are %(count)s of a total of %(total)s objects&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"nx\">data</span><span class=\"p\">.</span><span class=\"nx\">count</span>\n<span class=\"p\">);</span>\n<span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">string</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">interpolate</span><span class=\"p\">(</span><span class=\"nx\">formats</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nx\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kc\">true</span><span class=\"p\">);</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Il ne faut cependant pas abuser de l’interpolation de chaînes : c’est toujours du JavaScript, le code effectue donc des substitutions répétées par expression régulière. Ce n’est pas aussi rapide que l’interpolation de chaînes en Python, il s’agit donc de réserver cet usage pour les cas où c’est vraiment nécessaire (par exemple conjointement avec``ngettext`` pour générer des pluriels corrects).</p>\n</section>\n<section id=\"get-format\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_format</span></code><a class=\"heading-anchor\" href=\"#get-format\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">get_format</span></code> accède aux réglages de mise en forme régionalisée et peut obtenir la chaîne de format d’un nom de réglage donné :</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">get_format</span><span class=\"p\">(</span><span class=\"s1\">&#39;DATE_FORMAT&#39;</span><span class=\"p\">));</span>\n<span class=\"c1\">// &#39;N j, Y&#39;</span>\n</code></pre></div>\n<p>Elle peut accéder aux réglages suivants :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-DATE_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATE_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-DATE_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATE_INPUT_FORMATS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-DATETIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATETIME_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-DATETIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATETIME_INPUT_FORMATS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-DECIMAL_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DECIMAL_SEPARATOR</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-FIRST_DAY_OF_WEEK\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FIRST_DAY_OF_WEEK</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-MONTH_DAY_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MONTH_DAY_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-NUMBER_GROUPING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NUMBER_GROUPING</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-SHORT_DATE_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SHORT_DATE_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-SHORT_DATETIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SHORT_DATETIME_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-THOUSAND_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">THOUSAND_SEPARATOR</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-TIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-TIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_INPUT_FORMATS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-YEAR_MONTH_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">YEAR_MONTH_FORMAT</span></code></a></p></li>\n</ul>\n<p>C’est bien utile pour conserver une cohérence de mise en forme en lien avec les valeurs produites par le code Python.</p>\n</section>\n<section id=\"gettext-noop\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_noop</span></code><a class=\"heading-anchor\" href=\"#gettext-noop\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Ceci émule la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>, mais ne fait rien d’autre que de renvoyer le contenu qui lui est transmis :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">gettext_noop</span><span class=\"p\">(</span><span class=\"s2\">&quot;this will not be translated&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>C’est utile pour identifier des portions de code qui vont avoir besoin d’être traduites plus tard.</p>\n</section>\n<section id=\"pgettext\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">pgettext</span></code><a class=\"heading-anchor\" href=\"#pgettext\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">pgettext</span></code> fonctionne de manière similaire à son équivalent Python (<a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.pgettext\" title=\"django.utils.translation.pgettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">pgettext()</span></code></a>), fournissant un contenu traduit en fonction d’un contexte :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">pgettext</span><span class=\"p\">(</span><span class=\"s2\">&quot;month name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;May&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"npgettext\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">npgettext</span></code><a class=\"heading-anchor\" href=\"#npgettext\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">npgettext</span></code> fonctionne également comme son équivalent Python (<a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.npgettext\" title=\"django.utils.translation.npgettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">npgettext()</span></code></a>), fournissant un contenu <strong>pluriel</strong> traduit en fonction d’un contexte :</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">npgettext</span><span class=\"p\">(</span><span class=\"s1\">&#39;group&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;party&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mf\">1</span><span class=\"p\">));</span>\n<span class=\"c1\">// party</span>\n<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">npgettext</span><span class=\"p\">(</span><span class=\"s1\">&#39;group&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;party&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mf\">2</span><span class=\"p\">));</span>\n<span class=\"c1\">// parties</span>\n</code></pre></div>\n</section>\n<section id=\"pluralidx\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">pluralidx</span></code><a class=\"heading-anchor\" href=\"#pluralidx\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>La fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">pluralidx</span></code> fonctionne de manière semblable au filtre de gabarit <a class=\"reference internal\" href=\"/fr/4.2/ref/templates/builtins/#std-templatefilter-pluralize\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">pluralize</span></code></a>, déterminant si un nombre <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> donné doit utiliser une forme plurielle d’un mot ou pas :</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">pluralidx</span><span class=\"p\">(</span><span class=\"mf\">0</span><span class=\"p\">));</span>\n<span class=\"c1\">// true</span>\n<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">pluralidx</span><span class=\"p\">(</span><span class=\"mf\">1</span><span class=\"p\">));</span>\n<span class=\"c1\">// false</span>\n<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">pluralidx</span><span class=\"p\">(</span><span class=\"mf\">2</span><span class=\"p\">));</span>\n<span class=\"c1\">// true</span>\n</code></pre></div>\n<p>Dans le cas le plus simple, si aucune mise au pluriel n’est nécessaire, cette fonction renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">false</span></code> pour le nombre <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">true</span></code> pour tous les autres nombres.</p>\n<p>Cependant, la mise au pluriel n’est pas si simple dans toutes les langues. Si la langue ne gère pas les pluriels, une valeur vide est renvoyée.</p>\n<p>De plus, si les pluriels se basent sur des règles complexes, la vue du catalogue produit une expression conditionnelle. Son résultat aboutit soit à une valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">true</span></code> (pluriel nécessaire), soit à une valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">false</span></code> (pluriel <strong>non</strong> nécessaire).</p>\n</section>\n</section>\n<section id=\"the-jsoncatalog-view\">\n<h3>La vue <code class=\"docutils literal notranslate\"><span class=\"pre\">JSONCatalog</span></code><a class=\"heading-anchor\" href=\"#the-jsoncatalog-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JSONCatalog\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">JSONCatalog</span></span><a class=\"heading-anchor\" href=\"#django.views.i18n.JSONCatalog\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Pour pouvoir utiliser une autre bibliothèque côté client pour la gestion des traductions, il peut être avantageux de profiter de la vue <code class=\"docutils literal notranslate\"><span class=\"pre\">JSONCatalog</span></code>. Le résultat est proche de <a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code></a> mais le contenu est renvoyé sous forme de réponse JSON.</p>\n<p>Consultez la documentation de <a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code></a> pour connaître les valeurs possibles et l’utilisation des attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">packages</span></code>.</p>\n<p>Le format de la réponse est le suivant :</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>{\n    &quot;catalog&quot;: {\n        # Translations catalog\n    },\n    &quot;formats&quot;: {\n        # Language formats for date, time, etc.\n    },\n    &quot;plural&quot;: &quot;...&quot;  # Expression for plural forms, or null.\n}\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"note-on-performance\">\n<h3>Note sur les performances<a class=\"heading-anchor\" href=\"#note-on-performance\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les différentes vues JavaScript/JSON i18n génèrent leur catalogue à partir de fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code> pour chaque requête. Comme le résultat est constant, au moins pour une version donnée du site, c’est une bonne occasion d’utiliser le cache.</p>\n<p>Le cache côté serveur réduit la charge sur le processeur. Le décorateur <a class=\"reference internal\" href=\"/fr/4.2/topics/cache/#django.views.decorators.cache.cache_page\" title=\"django.views.decorators.cache.cache_page\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_page()</span></code></a> permet de le faire facilement. Pour provoquer l’invalidation du cache lorsque les traductions ont changé, ajoutez un préfixe de clé dépendant de la version, comme le montre l’exemple ci-dessous, ou faites correspondre la vue à une URL dépendant de la version :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_page</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">JavaScriptCatalog</span>\n\n<span class=\"c1\"># The value returned by get_version() must change when translations change.</span>\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">cache_page</span><span class=\"p\">(</span><span class=\"mi\">86400</span><span class=\"p\">,</span> <span class=\"n\">key_prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;jsi18n-</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">get_version</span><span class=\"p\">())(</span>\n            <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()</span>\n        <span class=\"p\">),</span>\n        <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Le cache côté client économise de la bande passante et accélère le chargement de votre site. Si vous utilisez les <code class=\"docutils literal notranslate\"><span class=\"pre\">ETags</span></code> (<a class=\"reference internal\" href=\"/fr/4.2/ref/middleware/#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ConditionalGetMiddleware</span></code></a>), il n’y a rien à faire de plus. Sinon, vous pouvez appliquer des <a class=\"reference internal\" href=\"/fr/4.2/topics/conditional-view-processing/#conditional-decorators\"><span class=\"std std-ref\">décorateurs conditionnels</span></a>. Dans l’exemple qui suit, le cache est invalidé chaque fois que vous relancez le serveur d’applications :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">last_modified</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">JavaScriptCatalog</span>\n\n<span class=\"n\">last_modified_date</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">last_modified</span><span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"n\">req</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kw</span><span class=\"p\">:</span> <span class=\"n\">last_modified_date</span><span class=\"p\">)(</span>\n            <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()</span>\n        <span class=\"p\">),</span>\n        <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Il est même possible de pré-générer le catalogue JavaScript dans le cadre de votre procédure de déploiement et le servir comme fichier statique. Cette technique radicale est implémentée dans <a class=\"reference external\" href=\"https://django-statici18n.readthedocs.io/\">django-statici18n</a>.</p>\n</section>\n</section>\n<section id=\"module-django.conf.urls.i18n\">\n<span id=\"internationalization-in-url-patterns\"></span><span id=\"url-internationalization\"></span><h2>Internationalisation : dans les motifs d’URL<a class=\"heading-anchor\" href=\"#module-django.conf.urls.i18n\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django fournit deux mécanismes pour internationaliser les motifs d’URL :</p>\n<ul class=\"simple\">\n<li><p>En ajoutant le préfixe de langue à la racine des motifs d’URL afin que <a class=\"reference internal\" href=\"/fr/4.2/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code></a> puisse détecter la langue à activer à partir de l’URL demandée.</p></li>\n<li><p>En rendant traduisibles les motifs d’URL eux-mêmes via la fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.gettext_lazy()</span></code></a>.</p></li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>L’utilisation de chacune de ces techniques exige qu’une langue active soit définie pour chaque requête ; en d’autres termes, votre réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> doit contenir <a class=\"reference internal\" href=\"/fr/4.2/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.middleware.locale.LocaleMiddleware</span></code></a>.</p>\n</aside>\n<section id=\"language-prefix-in-url-patterns\">\n<h3>Préfixe de langue dans les motifs d’URL<a class=\"heading-anchor\" href=\"#language-prefix-in-url-patterns\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.conf.urls.i18n.i18n_patterns\">\n<span class=\"sig-name descname\"><span class=\"pre\">i18n_patterns</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">urls</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">prefix_default_language</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.conf.urls.i18n.i18n_patterns\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Cette fonction peut être utilisée dans une configuration d’URL racine et Django préfixe automatiquement tous les motifs d’URL définis par <a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code></a> avec le code de langue actuellement actif.</p>\n<p>En définissant <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix_default_language</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, le préfixe pour la langue par défaut (<a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a>) est enlevé. Cela peut être utile lors de l’ajout de traductions à un site existant afin que les URL actuelles ne changent pas.</p>\n<p>Exemples de motifs d’URL :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">i18n_patterns</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">include</span><span class=\"p\">,</span> <span class=\"n\">path</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">about</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">about_views</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">news</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">news_views</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">sitemap.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">sitemap</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;sitemap.xml&quot;</span><span class=\"p\">,</span> <span class=\"n\">sitemap</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;sitemap-xml&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\n<span class=\"n\">news_patterns</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;category/&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">category</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;category&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">details</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n    <span class=\"s2\">&quot;news&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">+=</span> <span class=\"n\">i18n_patterns</span><span class=\"p\">(</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">,</span> <span class=\"n\">about_views</span><span class=\"o\">.</span><span class=\"n\">main</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;about&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;news/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"n\">news_patterns</span><span class=\"p\">,</span> <span class=\"n\">namespace</span><span class=\"o\">=</span><span class=\"s2\">&quot;news&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Après la définition de ces motifs d’URL, Django ajoute automatiquement le préfixe de langue dans les motifs d’URL qui ont été ajoutés avec la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns</span></code>. Exemple :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">activate</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;sitemap-xml&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;/sitemap.xml&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:index&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;/en/news/&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:detail&quot;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;news-slug&quot;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;/nl/news/news-slug/&#39;</span>\n</code></pre></div>\n<p>Avec <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix_default_language=False</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE='en'</span></code>, les URL seront :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:index&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;/news/&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:index&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;/nl/news/&#39;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p><a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code></a> ne peut figurer que dans la configuration d’URL racine. Si vous essayez de l’utiliser dans une configuration d’URL incluse, vous obtiendrez une exception <a class=\"reference internal\" href=\"/fr/4.2/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ImproperlyConfigured</span></code></a>.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Assurez-vous de ne pas avoir de motifs d’URL non préfixés qui pourraient être confondus avec des motifs contenant le préfixe de langue automatique.</p>\n</aside>\n</section>\n<section id=\"translating-url-patterns\">\n<span id=\"translating-urlpatterns\"></span><h3>Traduction de motifs d’URL<a class=\"heading-anchor\" href=\"#translating-url-patterns\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les motifs d’URL peuvent aussi être signalés comme traduisibles en utilisant la fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code></a>. Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">i18n_patterns</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">include</span><span class=\"p\">,</span> <span class=\"n\">path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">about</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">about_views</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">news</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">news_views</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">sitemaps.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">sitemap</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;sitemap.xml&quot;</span><span class=\"p\">,</span> <span class=\"n\">sitemap</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;sitemap-xml&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\n<span class=\"n\">news_patterns</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;category/&lt;slug:slug&gt;/&quot;</span><span class=\"p\">),</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">category</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;category&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">details</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n    <span class=\"s2\">&quot;news&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">+=</span> <span class=\"n\">i18n_patterns</span><span class=\"p\">(</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">),</span> <span class=\"n\">about_views</span><span class=\"o\">.</span><span class=\"n\">main</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;about&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;news/&quot;</span><span class=\"p\">),</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"n\">news_patterns</span><span class=\"p\">,</span> <span class=\"n\">namespace</span><span class=\"o\">=</span><span class=\"s2\">&quot;news&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Après avoir effectué les traductions, la fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/urlresolvers/#django.urls.reverse\" title=\"django.urls.reverse\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">reverse()</span></code></a> renverra l’URL dans la langue active. Exemple :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">activate</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:category&quot;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;recent&quot;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;/en/news/category/recent/&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:category&quot;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;recent&quot;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;/nl/nieuws/categorie/recent/&#39;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Dans la plupart des cas, il est recommandé de n’utiliser des URL traduites que dans des blocs de motifs avec préfixe de code de langue (utilisant <a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code></a>), pour éviter l’éventualité qu’une URL mal traduite entre en conflit avec un motif d’URL non traduit.</p>\n</aside>\n</section>\n<section id=\"reversing-in-templates\">\n<span id=\"id2\"></span><h3>Résolution inverse dans les gabarits<a class=\"heading-anchor\" href=\"#reversing-in-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lors de la résolution d’URL régionalisées dans les gabarits, c’est toujours la langue active qui sera utilisée. Pour créer un lien vers une URL dans une autre langue, utilisez la balise de gabarit <a class=\"reference internal\" href=\"#std-templatetag-language\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">language</span></code></a>. Elle active la langue indiquée à l’intérieur de la section de gabarit concernée :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">get_available_languages</span> <span class=\"k\">as</span> <span class=\"nv\">languages</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;View this category in:&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">lang_code</span><span class=\"o\">,</span> <span class=\"nv\">lang_name</span> <span class=\"k\">in</span> <span class=\"nv\">languages</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">language</span> <span class=\"nv\">lang_code</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;category&#39;</span> <span class=\"nv\">slug</span><span class=\"o\">=</span><span class=\"nv\">category.slug</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">lang_name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endlanguage</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>La balise <a class=\"reference internal\" href=\"#std-templatetag-language\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">language</span></code></a> n’accepte que le code de langue comme paramètre.</p>\n</section>\n</section>\n<section id=\"localization-how-to-create-language-files\">\n<span id=\"how-to-create-language-files\"></span><h2>Régionalisation : comment créer les fichiers de langues<a class=\"heading-anchor\" href=\"#localization-how-to-create-language-files\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Après avoir marqué les chaînes à traduire dans le code d’une application, il s’agit d’effectuer les traductions elles-mêmes. Voici comment ça fonctionne.</p>\n<section id=\"message-files\">\n<h3>Fichiers de messages<a class=\"heading-anchor\" href=\"#message-files\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La première étape est de créer un <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">fichier de messages</span></a> pour la nouvelle langue. Il s’agit d’un simple fichier texte correspondant à une seule langue et contenant toutes les chaînes à traduire disponibles ainsi que leur traduction dans la langue cible. Les fichiers de messages possèdent l’extension de fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>.</p>\n<p>Django est livré avec un outil, <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a>, qui automatise la création et la maintenance de ces fichiers.</p>\n<aside class=\"admonition-gettext-utilities admonition\">\n<p class=\"admonition-title\">Utilitaires gettext</p>\n<p>La commande <code class=\"docutils literal notranslate\"><span class=\"pre\">makemessages</span></code> (ainsi que <code class=\"docutils literal notranslate\"><span class=\"pre\">compilemessages</span></code> présentée plus bas) utilise des commandes de la suite d’outils GNU gettext : <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">msgfmt</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">msgmerge</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">msguniq</span></code>.</p>\n<p>La version minimale prise en charge des utilitaires  <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> est la version 0.15.</p>\n</aside>\n<p>Pour créer ou mettre à jour un fichier de messages, exécutez cette commande :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-l<span class=\"w\"> </span>de\n</code></pre></div>\n<p>…où <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code> est le <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">nom de locale</span></a> du fichier de messages que vous souhaitez créer. Par exemple, le portugais du Brésil est représenté par <code class=\"docutils literal notranslate\"><span class=\"pre\">pt_BR</span></code>, l’allemand d’Autriche par <code class=\"docutils literal notranslate\"><span class=\"pre\">de_AT</span></code> ou encore <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> pour l’indonésien.</p>\n<p>Le script doit être lancé depuis l’un des deux endroits suivants :</p>\n<ul class=\"simple\">\n<li><p>Le répertoire racine de votre projet Django (celui qui contient <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>).</p></li>\n<li><p>Le répertoire racine de l’une de vos applications Django.</p></li>\n</ul>\n<p>Le script parcourt l’arborescence des sources de votre projet ou de votre application et extrait toutes les chaînes marquées pour la traduction (consultez <a class=\"reference internal\" href=\"#how-django-discovers-translations\"><span class=\"std std-ref\">Processus de découverte des traductions par Django</span></a> et assurez-vous que <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> est correctement configuré). Il crée (ou met à jour) un fichier de messages dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">locale/LANG/LC_MESSAGES</span></code>. Dans l’exemple avec <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code>, le fichier équivaudra à <code class=\"docutils literal notranslate\"><span class=\"pre\">locale/de/LC_MESSAGES/django.po</span></code>.</p>\n<p>Lorsque vous exécutez <code class=\"docutils literal notranslate\"><span class=\"pre\">makemessages</span></code> à partir du dossier racine de votre projet, les chaînes extraites sont automatiquement distribuées dans les fichiers de messages appropriés. C’est-à-dire qu’une chaîne extraite d’un fichier d’une application contenant un répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> sera placée dans un fichier de messages sous ce répertoire. Une chaîne extraite d’un fichier d’une application sans répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> sera placée dans un fichier de messages sous le répertoire apparaissant en premier dans <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> ou générera une erreur si le réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> est vide.</p>\n<p>Par défaut, <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> examine chaque fichier ayant une extension <code class=\"docutils literal notranslate\"><span class=\"pre\">.html</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">.txt</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">.py</span></code>. Dans le cas où vous souhaitez modifier cela, utilisez l’option <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#cmdoption-makemessages-extension\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--extension</span></code></a> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span></code> pour indiquer les extensions de fichiers à examiner :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-l<span class=\"w\"> </span>de<span class=\"w\"> </span>-e<span class=\"w\"> </span>txt\n</code></pre></div>\n<p>Séparez plusieurs extensions par une virgule ou utilisez plusieurs occurrences de <code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">--extension</span></code>:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-l<span class=\"w\"> </span>de<span class=\"w\"> </span>-e<span class=\"w\"> </span>html,txt<span class=\"w\"> </span>-e<span class=\"w\"> </span>xml\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Lors de la <a class=\"reference internal\" href=\"#creating-message-files-from-js-code\"><span class=\"std std-ref\">création de fichiers de messages à partir de code JavaScript</span></a>, vous devez utiliser le domaine particulier <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code>, et <strong>non pas</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span> <span class=\"pre\">js</span></code>.</p>\n</aside>\n<aside class=\"admonition-using-jinja2-templates admonition\">\n<p class=\"admonition-title\">Utilisation de gabarits Jinja2</p>\n<p><a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> ne comprend pas la syntaxe des gabarits Jinja2. Pour extraire les chaînes d’un projet contenant des gabarits Jinja2, utilisez plutôt l”<a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/messages.html#message-extraction\">extraction de messages</a> de <a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/\">Babel</a>.</p>\n<p>Voici un exemple de fichier de configuration <code class=\"docutils literal notranslate\"><span class=\"pre\">babel.cfg</span></code>:</p>\n<div class=\"code-block\" data-language=\"ini\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Ini code\"><code><span class=\"c1\"># Extraction from Python source files</span>\n<span class=\"k\">[python: **.py]</span>\n\n<span class=\"c1\"># Extraction from Jinja2 templates</span>\n<span class=\"k\">[jinja2: **.jinja]</span>\n<span class=\"na\">extensions</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">jinja2.ext.with_</span>\n</code></pre></div>\n<p>Prenez soin de bien mentionner toutes les extensions que vous utilisez ! Sinon, Babel ne reconnaîtra pas les balises définies par ces extensions et ignorera complètement les gabarits Jinja2 contenant de telles balises.</p>\n<p>Babel fournit des fonctionnalités similaires à <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> et peut généralement le remplacer. Il ne dépend pas de <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>. Pour plus d’informations, lisez sa documentation au sujet de <a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/messages.html\">sa gestion des catalogues de messages</a>.</p>\n</aside>\n<aside class=\"admonition-no-gettext admonition\">\n<p class=\"admonition-title\">Pas de gettext ?</p>\n<p>Si les utilitaires <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> ne sont pas installés, <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> crée des fichiers vides. Dans ce cas, installez les utilitaires <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> ou copiez le fichier de messages anglais (<code class=\"docutils literal notranslate\"><span class=\"pre\">locale/en/LC_MESSAGES/django.po</span></code>) s’il y en a un et utilisez-le comme point de départ, celui-ci étant un fichier de traductions vides.</p>\n</aside>\n<aside class=\"admonition-working-on-windows admonition\">\n<p class=\"admonition-title\">Vous utilisez Windows ?</p>\n<p>Si vous utilisez Windows et que vous avez besoin d’installer les utilitaires GNU gettext pour le fonctionnement de <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a>, consultez <a class=\"reference internal\" href=\"#gettext-on-windows\"><span class=\"std std-ref\">gettext et Windows</span></a> pour plus d’informations.</p>\n</aside>\n<p>Chaque fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> contient quelques métadonnées telles que les informations de contact du mainteneur de la traduction, mais la partie principale du fichier est composée d’une liste de <strong>messages</strong>, des correspondances entre les chaînes à traduire et les textes de la traduction dans la langue cible.</p>\n<p>Par exemple, si votre application Django contient une chaîne à traduire pour le texte <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Welcome</span> <span class=\"pre\">to</span> <span class=\"pre\">my</span> <span class=\"pre\">site.&quot;</span></code>, comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…alors <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> créera un fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> contenant l’extrait (message) suivant :</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"kd\">#: path/to/python/module.py:23</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Welcome to my site.&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n<p>Une rapide explication :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">msgid</span></code> est la chaîne à traduire apparaissant dans la source. N’y touchez pas.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">msgstr</span></code> est l’emplacement devant recevoir la traduction dans la langue cible. Il est vide au début, il est donc de votre responsabilité d’y ajouter le contenu traduit. Prenez soin de ne pas enlever les guillemets autour de la traduction.</p></li>\n<li><p>Chaque message contient des indications utiles sous la forme d’une ligne de commentaire préfixée par <code class=\"docutils literal notranslate\"><span class=\"pre\">#</span></code> et située au-dessus de la ligne <code class=\"docutils literal notranslate\"><span class=\"pre\">msgid</span></code>; ce commentaire contient le nom de fichier et le numéro de ligne correspondant au fichier duquel cette chaîne à traduire a été extraite.</p></li>\n</ul>\n<p>Les longs messages sont des cas spéciaux. La première expression juste après <code class=\"docutils literal notranslate\"><span class=\"pre\">msgstr</span></code> (ou <code class=\"docutils literal notranslate\"><span class=\"pre\">msgid</span></code>) est une chaîne vide. Le contenu lui-même est écrit dans les lignes suivantes sur plusieurs lignes qui seront concaténées au moment de la récupération de la traduction. N’oubliez donc pas les espaces en fin de ligne à l’intérieur du texte, sinon les lignes seront mises bout à bout sans espace !</p>\n<aside class=\"admonition-mind-your-charset admonition\">\n<p class=\"admonition-title\">Attention au codage des caractères</p>\n<p>En raison du fonctionnement interne des outils <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> et de la volonté du cœur de Django d’accepter dans les chaînes source des caractères hors de l’ensemble ASCII, vous <strong>devez</strong> utiliser UTF-8 comme codage pour vos fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> (valeur par défaut lorsque les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> sont créés). Cela signifie que tout le monde utilise le même codage de caractères, ce qui est important pour Django lorsqu’il traite les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>.</p>\n</aside>\n<aside class=\"admonition-fuzzy-entries admonition\">\n<p class=\"admonition-title\">Lignes « fuzzy »</p>\n<p><a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> génère parfois des éléments de traduction marqués comme « fuzzy » (approximatif), par exemple lorsque des traductions sont partiellement tirées d’autres chaînes précédemment traduites. Par défaut, ces chaînes approximatives ne sont <strong>pas</strong> incluses dans le résultat de <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">compilemessages</span></code></a>.</p>\n</aside>\n<p>Pour réexaminer tout le code source et les gabarits à la recherche de nouvelles chaînes à traduire et pour mettre à jour tous les fichiers de messages pour <strong>toutes</strong> les langues, exécutez ceci :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-a\n</code></pre></div>\n</section>\n<section id=\"compiling-message-files\">\n<h3>Compilation des fichiers de messages<a class=\"heading-anchor\" href=\"#compiling-message-files\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Après avoir créé un fichier de messages et lors de chaque modification à ce fichier, il est nécessaire de le compiler dans un format plus efficace utilisable par <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>. Ceci se fait à l’aide de la commande <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a>.</p>\n<p>Cet outil parcourt tous les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> disponibles et crée des fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code> qui sont des fichiers binaires optimisés pour <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>. Dans le même répertoire à partir duquel vous avez lancé <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a>, exécutez <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a> comme ceci :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin<span class=\"w\"> </span>compilemessages\n</code></pre></div>\n<p>C’est tout. Vos traductions sont prêtes à l’emploi.</p>\n<aside class=\"admonition-working-on-windows admonition\">\n<p class=\"admonition-title\">Vous utilisez Windows ?</p>\n<p>Si vous utilisez Windows et que vous avez besoin d’installer les utilitaires GNU gettext pour le fonctionnement de <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a>, consultez <a class=\"reference internal\" href=\"#gettext-on-windows\"><span class=\"std std-ref\">gettext et Windows</span></a> pour plus d’informations.</p>\n</aside>\n<aside class=\"admonition-po-files-encoding-and-bom-usage admonition\">\n<p class=\"admonition-title\">Fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>: codage et présence du BOM</p>\n<p>Django ne gère que les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> codés en UTF-8 et sans BOM (Byte Order Mark) ; si votre éditeur de texte ajoute par défaut de telles marques au début des fichiers, il vous faudra le reconfigurer.</p>\n</aside>\n</section>\n<section id=\"troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs\">\n<h3>Dépannage : <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> détecte <code class=\"docutils literal notranslate\"><span class=\"pre\">python-format</span></code> de façon erronée dans des chaînes contenant des caractères pourcent<a class=\"heading-anchor\" href=\"#troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Dans certains cas, tels que des chaînes avec un caractère pourcent suivi d’un espace et d’un <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#old-string-formatting\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">marqueur de conversion de chaîne</span></a> (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">_(&quot;10%</span> <span class=\"pre\">interest&quot;)</span></code>), <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a> marque faussement la chaîne avec <code class=\"docutils literal notranslate\"><span class=\"pre\">python-format</span></code>.</p>\n<p>Si vous essayez de compiler des fichiers de messages contenant des chaînes faussement marquées, vous obtiendrez un message d’erreur du style <code class=\"docutils literal notranslate\"><span class=\"pre\">le</span> <span class=\"pre\">nombre</span> <span class=\"pre\">de</span> <span class=\"pre\">spécifications</span> <span class=\"pre\">de</span> <span class=\"pre\">format</span> <span class=\"pre\">dans</span> <span class=\"pre\">'msgid'</span> <span class=\"pre\">et</span> <span class=\"pre\">'msgstr'</span> <span class=\"pre\">ne</span> <span class=\"pre\">correspondent</span> <span class=\"pre\">pas</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">'msgstr'</span> <span class=\"pre\">n'est</span> <span class=\"pre\">pas</span> <span class=\"pre\">une</span> <span class=\"pre\">chaîne</span> <span class=\"pre\">de</span> <span class=\"pre\">format</span> <span class=\"pre\">Python</span> <span class=\"pre\">valide,</span> <span class=\"pre\">au</span> <span class=\"pre\">contraire</span> <span class=\"pre\">de</span> <span class=\"pre\">'msgid'</span></code>.</p>\n<p>Pour contourner ce problème, vous pouvez échapper les caractères pourcent en ajoutant un second signe pourcent :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;10</span><span class=\"si\">%%</span><span class=\"s2\"> interest&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ou il est aussi possible d’ajouter le marqueur <code class=\"docutils literal notranslate\"><span class=\"pre\">no-python-format</span></code> afin que tous les caractères pourcent soient considérés comme contenu littéral :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># xgettext:no-python-format</span>\n<span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;10</span><span class=\"si\">% i</span><span class=\"s2\">nterest&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"creating-message-files-from-javascript-source-code\">\n<span id=\"creating-message-files-from-js-code\"></span><h3>Création de fichiers de messages à partir de code JavaScript<a class=\"heading-anchor\" href=\"#creating-message-files-from-javascript-source-code\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La création et la mise à jour des fichiers de messages se fait de la même manière que les autres fichiers de messages de Django, à l’aide de l’outil <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a>. La seule différence est que vous devez explicitement définir ce que le jargon <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> appelle un domaine, dans ce cas le domaine <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code>, en indiquant le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">-d</span> <span class=\"pre\">djangojs</span></code> comme ceci :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-d<span class=\"w\"> </span>djangojs<span class=\"w\"> </span>-l<span class=\"w\"> </span>de\n</code></pre></div>\n<p>Ceci va créer ou mettre à jour le fichier de messages JavaScript en allemand. Après la mise à jour des fichiers de messages, lancez <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a> sur le même principe que pour les autres fichiers de messages de Django.</p>\n</section>\n<section id=\"gettext-on-windows\">\n<span id=\"id3\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> et Windows<a class=\"heading-anchor\" href=\"#gettext-on-windows\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ceci n’est nécessaire que pour les personnes qui doivent extraire des messages à traduire ou compiler des fichiers de messages (<code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>). Le travail de traduction en soi requiert de modifier des fichiers de ce type, mais si vous souhaitez créer vos propres fichiers de messages ou que vous vouliez tester ou compiler un fichier de messages modifié, téléchargez un <a class=\"reference external\" href=\"https://mlocati.github.io/articles/gettext-iconv-windows.html\">installeur binaire précompilé</a>.</p>\n<p>Il est aussi possible d’utiliser des binaires <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> obtenus par une autre source, tant que la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span> <span class=\"pre\">--version</span></code> fonctionne correctement. N’essayez pas d’utiliser les utilitaires de traduction de Django avec un paquet <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> si la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span> <span class=\"pre\">--version</span></code> saisie dans une invite de commande Windows produit une fenêtre contenant un message du genre «<code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext.exe</span></code> a produit des erreurs et sera fermé par Windows».</p>\n</section>\n<section id=\"customizing-the-makemessages-command\">\n<span id=\"customizing-makemessages\"></span><h3>Personnalisation de la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">makemessages</span></code><a class=\"heading-anchor\" href=\"#customizing-the-makemessages-command\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous souhaitez passer des paramètres supplémentaires à <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code>, vous devez créer une commande <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> personnaliséeet surcharger son attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext_options</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.management.commands</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">makemessages</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Command</span><span class=\"p\">(</span><span class=\"n\">makemessages</span><span class=\"o\">.</span><span class=\"n\">Command</span><span class=\"p\">):</span>\n    <span class=\"n\">xgettext_options</span> <span class=\"o\">=</span> <span class=\"n\">makemessages</span><span class=\"o\">.</span><span class=\"n\">Command</span><span class=\"o\">.</span><span class=\"n\">xgettext_options</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"s2\">&quot;--keyword=mytrans&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Si vous avez besoin de plus de souplesse, vous pouvez aussi ajouter un nouveau paramètre à votre commande <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> personnalisée :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.management.commands</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">makemessages</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Command</span><span class=\"p\">(</span><span class=\"n\">makemessages</span><span class=\"o\">.</span><span class=\"n\">Command</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">add_arguments</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">parser</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">add_arguments</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">)</span>\n        <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_argument</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;--extra-keyword&quot;</span><span class=\"p\">,</span>\n            <span class=\"n\">dest</span><span class=\"o\">=</span><span class=\"s2\">&quot;xgettext_keywords&quot;</span><span class=\"p\">,</span>\n            <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s2\">&quot;append&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">handle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">):</span>\n        <span class=\"n\">xgettext_keywords</span> <span class=\"o\">=</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">(</span><span class=\"s2\">&quot;xgettext_keywords&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">xgettext_keywords</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">xgettext_options</span> <span class=\"o\">=</span> <span class=\"n\">makemessages</span><span class=\"o\">.</span><span class=\"n\">Command</span><span class=\"o\">.</span><span class=\"n\">xgettext_options</span><span class=\"p\">[:]</span> <span class=\"o\">+</span> <span class=\"p\">[</span>\n                <span class=\"s2\">&quot;--keyword=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">kwd</span> <span class=\"k\">for</span> <span class=\"n\">kwd</span> <span class=\"ow\">in</span> <span class=\"n\">xgettext_keywords</span>\n            <span class=\"p\">]</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">handle</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"miscellaneous\">\n<h2>Divers<a class=\"heading-anchor\" href=\"#miscellaneous\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"the-set-language-redirect-view\">\n<span id=\"set-language-redirect-view\"></span><h3>La vue de redirection <code class=\"docutils literal notranslate\"><span class=\"pre\">set_language</span></code><a class=\"heading-anchor\" href=\"#the-set-language-redirect-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.set_language\">\n<span class=\"sig-name descname\"><span class=\"pre\">set_language</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.i18n.set_language\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Par commodité, Django fournit une vue, <a class=\"reference internal\" href=\"#django.views.i18n.set_language\" title=\"django.views.i18n.set_language\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.i18n.set_language()</span></code></a>, qui définit la préférence de langue d’un utilisateur et redirige vers une URL donnée ou, par défaut, revient à la page précédente.</p>\n<p>Activez la vue en ajoutant la ligne suivante dans votre configuration d’URL :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;i18n/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django.conf.urls.i18n&quot;</span><span class=\"p\">)),</span>\n</code></pre></div>\n<p>(Notez que cet exemple rend la vue disponible par <code class=\"docutils literal notranslate\"><span class=\"pre\">/i18n/setlang/</span></code>.)</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Vérifiez que l’URL ci-dessus ne soit pas ajoutée au moyen de <a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code></a>, car elle doit être elle-même indépendante de la langue pour fonctionner correctement.</p>\n</aside>\n<p>La vue s’attend à être appelée par la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>, avec un paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">language</span></code> défini dans la requête. Si la prise en charge des sessions est active, la vue enregistre le choix de langue dans la session de l’utilisateur. Elle enregistre aussi le choix de langue dans un cookie nommé par défaut <code class=\"docutils literal notranslate\"><span class=\"pre\">django_language</span></code> (le nom peut être modifié par le réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_NAME</span></code></a>).</p>\n<p>Après avoir défini le choix de langue, Django cherche un paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code> dans les données <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>. S’il y en a un et que Django le juge comme URL sûr (c.-à-d. qu’il ne pointe pas vers un hôte différent et qu’il utilise un protocole sûr), il redirige la requête vers cette URL. Sinon, Django se rabat sur la redirection vers l’URL de l’en-tête <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> ou, s’il n’est pas présent, vers <code class=\"docutils literal notranslate\"><span class=\"pre\">/</span></code>, en fonction de la nature de la requête :</p>\n<ul class=\"simple\">\n<li><p>Si la requête accepte le contenu HTML (basé sur son en-tête <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept</span></code>), la redirection est toujours effectuée.</p></li>\n<li><p>Si la requête n’accepte pas le HTML, la redirection ne s’effectue que si le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code> a été défini. Sinon, un code de statut 204 (Pas de contenu) est renvoyé.</p></li>\n</ul>\n<p>Voici un exemple de code de gabarit HTML :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">action</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;set_language&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">csrf_token</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;next&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;hidden&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">redirect_to</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">select</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;language&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">get_current_language</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">get_available_languages</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGES</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">get_language_info_list</span> <span class=\"nv\">for</span> <span class=\"nv\">LANGUAGES</span> <span class=\"k\">as</span> <span class=\"nv\">languages</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">language</span> <span class=\"k\">in</span> <span class=\"nv\">languages</span> <span class=\"cp\">%}</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">language.code</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">language.code</span> <span class=\"o\">==</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span> <span class=\"na\">selected</span><span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span><span class=\"p\">&gt;</span>\n                <span class=\"cp\">{{</span> <span class=\"nv\">language.name_local</span> <span class=\"cp\">}}</span> (<span class=\"cp\">{{</span> <span class=\"nv\">language.code</span> <span class=\"cp\">}}</span>)\n            <span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">select</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;Go&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Dans cet exemple, Django cherche l’URL de la page vers laquelle l’utilisateur sera redirigé dans la variable de contexte <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_to</span></code>.</p>\n</section>\n<section id=\"explicitly-setting-the-active-language\">\n<span id=\"id4\"></span><h3>Définition explicite de la langue active<a class=\"heading-anchor\" href=\"#explicitly-setting-the-active-language\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Il peut être souhaitable de définir la langue active de la session en cours de manière explicite. On peut par exemple imaginer que la préférence de langue d’une utilisatrice est récupérée à partir d’un autre système. La fonction <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.activate()</span></code></a> vous a déjà été présentée. Celle-ci s’applique seulement au fil d’exécution en cours. Si l’on veut modifier plus durablement la langue pour toute la session dans un cookie, il faut définir le cookie <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_NAME</span></code></a> dans la réponse :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">translation</span>\n\n<span class=\"n\">user_language</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;fr&quot;</span>\n<span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">user_language</span><span class=\"p\">)</span>\n<span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">set_cookie</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">LANGUAGE_COOKIE_NAME</span><span class=\"p\">,</span> <span class=\"n\">user_language</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Il est généralement utile d’utiliser les deux : <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.activate()</span></code></a> modifie la langue pour le fil d’exécution en cours et la définition du cookie valide cette préférence en vue des requêtes suivantes.</p>\n</section>\n<section id=\"using-translations-outside-views-and-templates\">\n<h3>Traductions en dehors des vues et des gabarits<a class=\"heading-anchor\" href=\"#using-translations-outside-views-and-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django contient un ensemble d’outils d’internationalisation bien fourni pour être utilisé dans les vues et les gabarits, mais leur usage n’est pas limité au code spécifique à Django. Les mécanismes de traduction de Django peuvent être utilisés pour traduire n’importe quel texte vers toutes les langues prises en charge par Django (pour autant qu’un catalogue de traductions correspondant existe, bien sûr). Vous pouvez charger un catalogue de traductions, l’activer et traduire du texte dans la langue de votre choix, mais n’oubliez pas de restaurer la langue initiale, car l’activation d’un catalogue de traductions est valable pour tout un fil d’exécution (thread) et une telle modification affecte le code s’exécutant dans le même fil.</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">translation</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">welcome_translated</span><span class=\"p\">(</span><span class=\"n\">language</span><span class=\"p\">):</span>\n    <span class=\"n\">cur_language</span> <span class=\"o\">=</span> <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">get_language</span><span class=\"p\">()</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">language</span><span class=\"p\">)</span>\n        <span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">gettext</span><span class=\"p\">(</span><span class=\"s2\">&quot;welcome&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">finally</span><span class=\"p\">:</span>\n        <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">cur_language</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">text</span>\n</code></pre></div>\n<p>L’appel de cette fonction avec la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">'de'</span></code> produira <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Willkommen&quot;</span></code>, quelle que soit la valeur de <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> ou la langue définie par un intergiciel.</p>\n<p>Quelques fonctions dignes d’intérêt sont <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.get_language\" title=\"django.utils.translation.get_language\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.get_language()</span></code></a> qui renvoie la langue utilisée dans le fil d’exécution actuel, <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.activate()</span></code></a> qui active un catalogue de traductions pour le fil d’exécution en cours et <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.check_for_language\" title=\"django.utils.translation.check_for_language\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.check_for_language()</span></code></a> qui vérifie si la langue indiquée est prise en charge par Django.</p>\n<p>Pour aider à écrire du code plus concis, il existe également un gestionnaire de contexte <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.override\" title=\"django.utils.translation.override\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.override()</span></code></a> qui stocke la langue en cours en entrée et la restaure en sortie. Avec ceci, l’exemple ci-dessus devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">translation</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">welcome_translated</span><span class=\"p\">(</span><span class=\"n\">language</span><span class=\"p\">):</span>\n    <span class=\"k\">with</span> <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">override</span><span class=\"p\">(</span><span class=\"n\">language</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">gettext</span><span class=\"p\">(</span><span class=\"s2\">&quot;welcome&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"language-cookie\">\n<h3>Cookie de langue<a class=\"heading-anchor\" href=\"#language-cookie\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Plusieurs réglages permettent d’ajuster les options du cookie de langue :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_NAME</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_AGE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_DOMAIN\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_DOMAIN</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_HTTPONLY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_HTTPONLY</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_PATH</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_SAMESITE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_SAMESITE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_SECURE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_SECURE</span></code></a></p></li>\n</ul>\n</section>\n</section>\n<section id=\"implementation-notes\">\n<h2>Notes d’implémentation<a class=\"heading-anchor\" href=\"#implementation-notes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"specialties-of-django-translation\">\n<span id=\"specialties-of-django-i18n\"></span><h3>Spécialités des traductions Django<a class=\"heading-anchor\" href=\"#specialties-of-django-translation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le mécanisme de traduction de Django utilise le module standard <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> livré avec Python. Si vous connaissez <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>, vous allez peut-être constater ces particularités dans la manière dont Django gère les traductions :</p>\n<ul class=\"simple\">\n<li><p>Le texte du domaine est <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code>. Ce texte sert à distinguer les divers programmes qui stockent leurs données dans un endroit commun aux fichiers de messages (normalement <code class=\"docutils literal notranslate\"><span class=\"pre\">/usr/share/locale/</span></code>). Le domaine <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> est utilisé  pour les chaînes de traduction du code Python et des gabarits et est chargé dans les catalogues de traductions globaux. Le domaine <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code> n’est utilisé que pour les catalogues de traductions JavaScript afin qu’ils restent aussi petits que possible.</p></li>\n<li><p>Django n’utilise pas directement <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code>, mais des adaptateurs Python autour de <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">msgfmt</span></code>. Ceci essentiellement pour des raisons pratiques.</p></li>\n</ul>\n</section>\n<section id=\"how-django-discovers-language-preference\">\n<span id=\"id5\"></span><h3>Processus de découverte de la préférence de langue par Django<a class=\"heading-anchor\" href=\"#how-django-discovers-language-preference\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Après avoir préparé les traductions, ou si vous voulez utiliser les traductions qui proviennent de Django, activez les traductions pour votre application.</p>\n<p>En arrière-plan, Django utilise un modèle très souple pour décider de la langue à activer, de manière globale, pour un utilisateur particulier ou les deux.</p>\n<p>Pour configurer une préférence de langue générale du projet, définissez <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a>. Django utilise cette langue comme traduction par défaut, c’est-à-dire le choix final si aucune autre traduction correspondante n’est découverte par l’une des méthodes employées par l’intergiciel de langue (voir ci-dessous).</p>\n<p>Si vous souhaitez simplement faire fonctionner Django dans votre langue maternelle, la seule chose est faire est de définir <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> et de vérifier que les <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">fichiers de messages</span></a> correspondants ainsi que leur version compilée (<code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>) existent.</p>\n<p>Si vous voulez que chaque utilisateur puisse indiquer sa langue préférée, il est alors nécessaire d’utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code>. Cet intergiciel active le choix de la langue en fonction des données de la requête. Il personnalise le contenu pour chaque utilisateur.</p>\n<p>Pour utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code>, ajoutez <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.locale.LocaleMiddleware'</span></code> à votre réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>. Comme les intergiciels sont sensibles à leur ordre d’apparition, suivez ces directives :</p>\n<ul class=\"simple\">\n<li><p>Assurez vous que c’est un des premiers intergiciels installés.</p></li>\n<li><p>Il devrait figurer après <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code>, parce que <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> emploie des données de session. Et il devrait figurer avant <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code>, parce que <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code> a besoin d’une langue active pour la résolution de l’URL demandée.</p></li>\n<li><p>Si vous utilisez <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheMiddleware</span></code>, placez-le avant <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code>.</p></li>\n</ul>\n<p>Par exemple, voici à quoi pourrait ressembler votre réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django.contrib.sessions.middleware.SessionMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.locale.LocaleMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.common.CommonMiddleware&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>(Pour plus d’informations sur les intergiciels, consultez la <a class=\"reference internal\" href=\"/fr/4.2/topics/http/middleware/\"><span class=\"doc\">documentation sur les intergiciels</span></a>.)</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> essaie de déterminer la préférence de langue de l’utilisateur en suivant cet algorithme :</p>\n<ul>\n<li><p>Premièrement, il cherche un préfixe de langue dans l’URL demandée. Ceci n’est valable que lorsque vous utilisez la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns</span></code> dans votre configuration d’URL racine. Voir <a class=\"reference internal\" href=\"#url-internationalization\"><span class=\"std std-ref\">Internationalisation : dans les motifs d’URL</span></a> pour plus d’informations sur les préfixes de langue et sur la manière d’internationaliser les motifs d’URL.</p></li>\n<li><p>S’il ne trouve rien, il cherche un cookie.</p>\n<p>Le nom de ce cookie est défini par le réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_NAME</span></code></a> (la valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">django_language</span></code>).</p>\n</li>\n<li><p>S’il ne trouve rien, il examine l’en-tête HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept-Language</span></code>. Cet en-tête est envoyé par le navigateur et indique au serveur les langues préférées de l’utilisateur, triées par ordre de préférence. Django prend en compte chaque langue de cet en-tête jusqu’à ce qu’il en trouve une dont les traductions sont disponibles.</p></li>\n<li><p>S’il ne trouve rien, il utilise le réglage global <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a>.</p></li>\n</ul>\n<p id=\"locale-middleware-notes\">Notes :</p>\n<ul>\n<li><p>À chacun de ces endroits, la préférence de langue est supposée être dans le <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">format de langue</span></a> standard, sous forme textuelle. Par exemple, le portugais brésilien est représenté par <code class=\"docutils literal notranslate\"><span class=\"pre\">pt-br</span></code>.</p></li>\n<li><p>Si une langue de base est disponible mais que la variante indiquée ne l’est pas, Django utilise la langue de base. Par exemple, si un utilisateur indique <code class=\"docutils literal notranslate\"><span class=\"pre\">fr-be</span></code> (français de Belgique) mais que Django ne connaît que <code class=\"docutils literal notranslate\"><span class=\"pre\">fr</span></code>, il utilisera <code class=\"docutils literal notranslate\"><span class=\"pre\">fr</span></code>.</p></li>\n<li><p>Seules les langues présentes dans le réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> peuvent être choisies. Si vous souhaitez restreindre le choix possible des langues à un sous-ensemble des langues disponibles (parce que votre application ne fournit pas toutes ces langues), définissez <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> à une liste de langues. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">LANGUAGES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;de&quot;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;German&quot;</span><span class=\"p\">)),</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;English&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Cet exemple limite les langues disponibles lors de la sélection automatique à l’allemand et à l’anglais (et à toute variante, du genre <code class=\"docutils literal notranslate\"><span class=\"pre\">de-ch</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">en-us</span></code>).</p>\n</li>\n<li><p>Si vous définissez un réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> personnalisé comme expliqué au point ci-dessus, il est possible de marquer les noms de langues comme chaînes à traduire, mais utilisez alors <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code></a> au lieu de <a class=\"reference internal\" href=\"/fr/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a> pour éviter une importation circulaire.</p>\n<p>Voici un exemple de fichier de réglages :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"n\">LANGUAGES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;de&quot;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;German&quot;</span><span class=\"p\">)),</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;English&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> a déterminé la préférence de langue de l’utilisateur, il rend disponible cette préférence dans la variable <code class=\"docutils literal notranslate\"><span class=\"pre\">request.LANGUAGE_CODE</span></code> de chaque <a class=\"reference internal\" href=\"/fr/4.2/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>. Cette valeur est à votre disposition dans le code de vos vues. Voici un exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">hello_world</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">count</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">LANGUAGE_CODE</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;de-at&quot;</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;You prefer to read Austrian German.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;You prefer to read another language.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Remarquez qu’avec la traduction statique (sans intergiciel), la langue se trouve dans <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.LANGUAGE_CODE</span></code> alors qu’avec la traduction dynamique (avec intergiciel), elle se trouve dans <code class=\"docutils literal notranslate\"><span class=\"pre\">request.LANGUAGE_CODE</span></code>.</p>\n</section>\n<section id=\"how-django-discovers-translations\">\n<span id=\"id6\"></span><h3>Processus de découverte des traductions par Django<a class=\"heading-anchor\" href=\"#how-django-discovers-translations\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Au moment de l’exécution, Django construit un catalogue consolidé en mémoire des chaînes de traduction. Pour faire cela, il cherche des traductions selon l’algorithme suivant concernant l’ordre dans lequel il examine les différents chemins de fichiers en vue du chargement des <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">fichiers de messages</span></a> compilés (<code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>) et de la priorité d’éventuelles traductions différentes de la même chaîne :</p>\n<ol class=\"arabic simple\">\n<li><p>Les répertoires énumérés dans <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> ont la plus haute priorité, ceux apparaissant en premier ayant priorité sur les suivants.</p></li>\n<li><p>Puis, il recherche et utilise le cas échéant un répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> dans chacune des applications installées figurant dans <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>. Celles apparaissant en premier ayant priorité sur les suivantes.</p></li>\n<li><p>Et finalement, la traduction de base fournie par Django dans <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/4.2.x/django/conf/locale\">django/conf/locale</a> est utilisée en dernier recours.</p></li>\n</ol>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>Les traductions de chaînes contenues dans des fichiers JavaScript sont parcourues par un algorithme semblable mais pas identique. Voir  <a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code></a> pour plus de détails.</p>\n<p>Vous pouvez également placer des <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/formatting/#custom-format-files\"><span class=\"std std-ref\">fichiers de formats personnalisés</span></a> dans les répertoires <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> si vous définissez aussi <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-FORMAT_MODULE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FORMAT_MODULE_PATH</span></code></a>.</p>\n</aside>\n<p>Dans tous les cas, le nom du répertoire contenant une traduction doit respecter le format de nommage avec la notation de <a class=\"reference internal\" href=\"/fr/4.2/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">nom de locale</span></a>. Par ex. : <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">pt_BR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">es_AR</span></code>, etc. Les chaînes non traduites des variantes territoriales de langues utilisent les traductions de la langue générique. Par exemple, les chaînes <code class=\"docutils literal notranslate\"><span class=\"pre\">pt_BR</span></code> non traduites utilisent les traductions <code class=\"docutils literal notranslate\"><span class=\"pre\">pt</span></code>.</p>\n<p>De cette façon, vous pouvez écrire des applications incluant leurs propres traductions et il est possible de surcharger les traductions de base par celles de votre projet. Ou, vous pouvez construire un gros projet composé de plusieurs applications et placer toutes les traductions dans un seul gros fichier de messages commun spécifique au projet que vous mettez en place. C’est à vous de choisir.</p>\n<p>Tous les dépôts de fichiers de messages sont structurés de la même façon. C’est-à-dire :</p>\n<ul class=\"simple\">\n<li><p>Django parcourt tous les chemins mentionnés dans <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> de votre fichier de réglages à la recherche de <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;code_de_langue&gt;/LC_MESSAGES/django.(po|mo)</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">$CHEMIN_APP/locale/&lt;code_de_langue&gt;/LC_MESSAGES/django.(po|mo)</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">$PYTHONPATH/django/conf/locale/&lt;code_de_langue&gt;/LC_MESSAGES/django.(po|mo)</span></code></p></li>\n</ul>\n<p>Pour créer des fichiers de messages, il faut utiliser l’outil <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a>. Et pour produire les fichiers binaires <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code> utilisés par <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>, il faut utiliser <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a>.</p>\n<p>Vous pouvez aussi exécuter <a class=\"reference internal\" href=\"/fr/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span> <span class=\"pre\">--settings=chemin.vers.settings</span></code></a> pour que le compilateur s’occupe de tous les répertoires énumérés dans le réglage <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a>.</p>\n</section>\n<section id=\"using-a-non-english-base-language\">\n<h3>Utilisation d’une langue de base autre que l’anglais<a class=\"heading-anchor\" href=\"#using-a-non-english-base-language\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django part du principe général que les chaînes originales d’un projet traduisible sont écrites en anglais. Il est possible de choisir une autre langue, mais il faut garder à l’esprit un certain nombre de limites :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> ne fournit que deux formes plurielles pour les messages originaux, ce qui signifie que vous devrez aussi fournir une traduction pour la langue de base afin d’inclure toutes les formes plurielles si les règles de pluriel de la langue de base diffèrent de l’anglais.</p></li>\n<li><p>Lorsqu’une variante d’anglais est activée et que les chaînes anglaises sont manquantes, la langue de repli ne sera pas la langue <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> du projet, mais dans la langue des chaînes originales. Par exemple, un utilisateur anglais visitant un site dont <a class=\"reference internal\" href=\"/fr/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> est l’espagnol et dont les chaînes originales sont écrites en russe obtiendra du russe et non de l’espagnol.</p></li>\n</ul>\n</section>\n</section>","rootId":"translation","toc":[{"title":"Aperçu","anchor":"overview","children":[]},{"title":"Internationalisation : dans le code Python","anchor":"internationalization-in-python-code","children":[{"title":"Traduction standard","anchor":"standard-translation","children":[]},{"title":"Commentaires pour les traducteurs","anchor":"comments-for-translators","children":[]},{"title":"Marquage des chaînes « en blanc »","anchor":"marking-strings-as-no-op","children":[]},{"title":"Pluriels","anchor":"pluralization","children":[]},{"title":"Marqueurs contextuels","anchor":"contextual-markers","children":[]},{"title":"Traduction différée","anchor":"lazy-translation","children":[{"title":"Valeurs d’options verbose_name et help_text des champs et relations de modèle","anchor":"model-fields-and-relationships-verbose-name-and-help-text-option-values","children":[]},{"title":"Valeurs de noms verbeux de modèle","anchor":"model-verbose-names-values","children":[]},{"title":"L’argument description des méthodes de modèles passé au décorateur @display","anchor":"model-methods-description-argument-to-the-display-decorator","children":[]}]},{"title":"Manipulation des objets de traduction différée","anchor":"working-with-lazy-translation-objects","children":[{"title":"Traductions différées et pluriels","anchor":"lazy-translations-and-plural","children":[]},{"title":"Mise en forme de chaînes : format_lazy()","anchor":"formatting-strings-format-lazy","children":[]},{"title":"Autres usages de traductions différées avec lazy","anchor":"other-uses-of-lazy-in-delayed-translations","children":[]}]},{"title":"Noms de langues régionalisés","anchor":"localized-names-of-languages","children":[]}]},{"title":"Internationalisation : dans le code des gabarits","anchor":"internationalization-in-template-code","children":[{"title":"Balise de gabarit translate","anchor":"translate-template-tag","children":[]},{"title":"Balise de gabarit blocktranslate","anchor":"blocktranslate-template-tag","children":[]},{"title":"Texte littéral transmis aux balises et aux filtres","anchor":"string-literals-passed-to-tags-and-filters","children":[]},{"title":"Commentaires pour les traducteurs dans les gabarits","anchor":"comments-for-translators-in-templates","children":[]},{"title":"Changement de langue dans les gabarits","anchor":"switching-language-in-templates","children":[]},{"title":"Autres balises","anchor":"other-tags","children":[{"title":"get_available_languages","anchor":"get-available-languages","children":[]},{"title":"get_current_language","anchor":"get-current-language","children":[]},{"title":"get_current_language_bidi","anchor":"get-current-language-bidi","children":[]},{"title":"Processeur de contexte i18n","anchor":"i18n-context-processor","children":[]},{"title":"get_language_info","anchor":"get-language-info","children":[]},{"title":"get_language_info_list","anchor":"get-language-info-list","children":[]},{"title":"Filtres de gabarit","anchor":"template-filters","children":[]}]}]},{"title":"Internationalisation : dans le code JavaScript","anchor":"internationalization-in-javascript-code","children":[{"title":"La vue JavaScriptCatalog","anchor":"module-django.views.i18n","children":[]},{"title":"Emploi du catalogue des traductions JavaScript","anchor":"using-the-javascript-translation-catalog","children":[{"title":"gettext","anchor":"gettext","children":[]},{"title":"ngettext","anchor":"ngettext","children":[]},{"title":"interpolate","anchor":"interpolate","children":[]},{"title":"get_format","anchor":"get-format","children":[]},{"title":"gettext_noop","anchor":"gettext-noop","children":[]},{"title":"pgettext","anchor":"pgettext","children":[]},{"title":"npgettext","anchor":"npgettext","children":[]},{"title":"pluralidx","anchor":"pluralidx","children":[]}]},{"title":"La vue JSONCatalog","anchor":"the-jsoncatalog-view","children":[]},{"title":"Note sur les performances","anchor":"note-on-performance","children":[]}]},{"title":"Internationalisation : dans les motifs d’URL","anchor":"module-django.conf.urls.i18n","children":[{"title":"Préfixe de langue dans les motifs d’URL","anchor":"language-prefix-in-url-patterns","children":[]},{"title":"Traduction de motifs d’URL","anchor":"translating-url-patterns","children":[]},{"title":"Résolution inverse dans les gabarits","anchor":"reversing-in-templates","children":[]}]},{"title":"Régionalisation : comment créer les fichiers de langues","anchor":"localization-how-to-create-language-files","children":[{"title":"Fichiers de messages","anchor":"message-files","children":[]},{"title":"Compilation des fichiers de messages","anchor":"compiling-message-files","children":[]},{"title":"Dépannage : gettext() détecte python-format de façon erronée dans des chaînes contenant des caractères pourcent","anchor":"troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs","children":[]},{"title":"Création de fichiers de messages à partir de code JavaScript","anchor":"creating-message-files-from-javascript-source-code","children":[]},{"title":"gettext et Windows","anchor":"gettext-on-windows","children":[]},{"title":"Personnalisation de la commande makemessages","anchor":"customizing-the-makemessages-command","children":[]}]},{"title":"Divers","anchor":"miscellaneous","children":[{"title":"La vue de redirection set_language","anchor":"the-set-language-redirect-view","children":[]},{"title":"Définition explicite de la langue active","anchor":"explicitly-setting-the-active-language","children":[]},{"title":"Traductions en dehors des vues et des gabarits","anchor":"using-translations-outside-views-and-templates","children":[]},{"title":"Cookie de langue","anchor":"language-cookie","children":[]}]},{"title":"Notes d’implémentation","anchor":"implementation-notes","children":[{"title":"Spécialités des traductions Django","anchor":"specialties-of-django-translation","children":[]},{"title":"Processus de découverte de la préférence de langue par Django","anchor":"how-django-discovers-language-preference","children":[]},{"title":"Processus de découverte des traductions par Django","anchor":"how-django-discovers-translations","children":[]},{"title":"Utilisation d’une langue de base autre que l’anglais","anchor":"using-a-non-english-base-language","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/4.2/topics/"},{"docname":"topics/i18n/index","title":"Internationalisation et régionalisation","url":"/fr/4.2/topics/i18n/"}],"prev":{"docname":"topics/i18n/index","title":"Internationalisation et régionalisation","url":"/fr/4.2/topics/i18n/"},"next":{"docname":"topics/i18n/formatting","title":"Régionalisation des formats","url":"/fr/4.2/topics/i18n/formatting/"},"formats":{"html":"/fr/4.2/topics/i18n/translation/","markdown":"/fr/4.2/topics/i18n/translation.md","json":"/fr/4.2/topics/i18n/translation.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/topics/i18n/translation.txt","official":"https://docs.djangoproject.com/fr/4.2/topics/i18n/translation/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}