# Gestion multilingue dans Django : éviter le drame où "Polish" devient "polonais" (marqueurs contextuels) Lorsque l’on prend la peine de bien supporter le multilingue (i18n), on fait parfois face à des situations embarrassantes. * Un bouton affiche **"Polish"** (verb « polir ») mais la traduction devient **"polonais"**. * Le composant de sélection de date traduit **"May"** comme un prénom dans certaines langues. * Le libellé **"Book"** ne se traduit qu’en « livre » et pas en « réserver ». La cause est simple. > L’ordinateur ne connaît pas le *contexte*. > Si deux chaînes sont identiques, il les considère comme la même. Dans cet article, nous allons voir comment utiliser les **marqueurs contextuels** de Django pour garder le code source inchangé tout en attachant des traductions différentes à la même chaîne. --- ## Pourquoi ces problèmes surviennent ? Le fonctionnement de base de gettext {#sec-aff43a618865} Le système de traduction de Django repose sur **GNU gettext**. Celui‑ci fonctionne selon des règles très simples : * La chaîne source → `msgid` * La traduction → `msgstr` * Si `msgid` est identique, on utilise toujours le même `msgstr`. ```po # django.po msgid "Polish" msgstr "polonais" ``` Une fois qu’une correspondance est créée dans le fichier `.po`, toute utilisation de "Polish" dans le projet utilisera la même traduction. Ainsi, deux usages différents de "Polish" (verbe et nom de langue) ne peuvent pas être distingués. Pour éviter cela, on pourrait modifier le code source : ```html