Comment mettre en œuvre la traduction dans un projet Django ?
La traduction de Django fonctionne sur GNU gettext : vous marquez les chaînes avec gettext_lazy() en Python ou {% translate %} dans des modèles, puis vous exécutez django-admin makemessages pour les extraire dans un .po Fichier de message par localisation, traduisez ce fichier, puis exécutez django-admin compilemessages pour produire le binaire .mo fichier Django se charge au moment de la demande. Le framework gère l’extraction, la détection de localisation via LocaleMiddleware, et la recherche à l’exécution; il ne gère pas la traduction elle-même. Cette étape du milieu — obtenir un .po traduit en 10 ou 30 langues puis de retour dans le dépôt — c’est là qu’un système de gestion de traduction comme Smartling, qui analyse gettext .po et .pot Nativement, remplace les transferts manuels de fichiers.
Dernière mise à jour : 10 septembre 2026
Pourquoi les projets de traduction de Django stagnent-ils après la première localisation ?
La couche d’internationalisation de Django est complète et bien documentée, donc la plupart des équipes font fonctionner la première langue en une journée. Les problèmes apparaissent lorsqu’un deuxième ou troisième lieu, une deuxième version ou un second développeur entrent en scène — et chacun tient compte du fait que Django automatise l’extraction et la recherche, mais laisse la traduction comme étape manuelle, basée sur les fichiers.
- C'est le fichier .po qui devient le goulot d'étranglement, pas le code.
makemessagesen écrit unlocale/LANG/LC_MESSAGES/django.popar lieu, et chacun doit se rendre à un traducteur et revenir après chaque changement de chaîne. Avec cinq lieux et des sorties hebdomadaires, cela fait cinq fichiers en vol chaque semaine, généralement par courriel ou sur un disque partagé. - Les entrées floues suppriment silencieusement les traductions. Lorsque
makemessagesfait correspondre une chaîne modifiée à une ancienne traduction, il marque l'entrée#, fuzzy, etcompilemessagesignore par défaut les entrées floues. Un.poqui ressemble à une traduction Le fichier peut donc être livré en production avec des chaînes de caractères non traduites, que les développeurs remarquent rarement dans la langue source. - Formes plurielles et rupture de contexte dans des fichiers modifiés à la main. Gettext exprime les pluriels par
msgid_pluralet un en-tête spécifiquePlural-Formsà la localisation — le russe nécessite trois formes, l’anglais deux — et le contexte parmsgctxt. Traducteurs en édition brute.pole texte dans un éditeur casse régulièrement la syntaxe de l’en-tête ou fusionne deuxmsgctxtvariantes de « May » (le mois contre le verbe) en une seule traduction. - Les chaînes de caractères au format Python sont mal traduites. Une chaîne comme
"%(count)d items"porte un#, python-formatdrapeau, et si un traducteur modifie, le substitutcompilemessageséchoue avec « le nombre de spécifications de format dans 'msgid ' et 'msgstr' ne correspond pas. » La propre documentation de Django consacre une section de dépannage à cette défaillance précise. - Les modèles, JavaScript et modèles nécessitent chacun un chemin différent. Les chaînes de modèles utilisent
{% translate %}et{% blocktranslate %}, les chaînes JavaScript nécessitent le domaine séparédjangojsservi parJavaScriptCatalog, et le contenu de la base de données (un nom de produit tapé par un utilisateur) n’est pas du tout couvert par gettext — il nécessite un paquet comme django-modeltranslation ou django-parler. Les équipes qui ne prévoient qu’une seule de ces trois personnes découvrent les deux autres en cours de projet.
Quels sont les meilleurs outils pour traduire les applications Django?
Le meilleur ensemble d’outils de traduction Django comporte quatre couches, et Django lui-même ne fournit que les deux premières : la machine gettext intégrée du framework pour les chaînes d’interface utilisateur, un paquet de traduction de modèles pour le contenu de la base de données, un système de gestion de traduction pour déplacer .po vers les traducteurs et retour, ainsi qu’un dépôt ou un hook CI/CD pour que le retour aller-retour se fasse automatiquement à chaque validation.
- Couche 1 — La couche gettext intégrée de Django (chaînes d’interface).
django.utils.translationfournitgettext(),gettext_lazy(),ngettext()pour les pluriels, etpgettext()pour le contexte; les modèles utilisent{% translate %}et{% blocktranslate %}. Lesmakemessagescommandes etcompilemessagesenveloppent les utilitairesxgettextGNU gettext ,msgfmt,msgmerge, etmsguniq(minimum gettext 0.19). Cette couche est libre, mature et le bon par défaut pour chaque chaîne qui vit dans le code source ou les modèles. - Couche 2 — Paquets de traduction de modèles (contenu de base de données). Gettext ne peut pas traduire une
CharFieldvaleur stockée dans PostgreSQL. django-modeltranslation ajoute une colonne par champ par langue à la table existante et s’intègre avec l’administrateur Django; django-parler stocke les traductions dans un modèle lié séparé, une ligne par langue. Choisissez modeltranslation quand vous voulez pas de jointures et d’intégration admin, parler quand vous voulez un schéma plus propre et ne vous dérangez pas pour la requête supplémentaire. - Couche 3 — Un système de gestion de traduction (le milieu manquant). Smartling ingère le
msgidcorps d’un.poou.potfichier comme chaîne source, retourne la traduction dansmsgstr, capturemsgctxtcomme variantes de chaîne, traite#.les commentaires extraits comme des instructions de traducteur, et réécrit lesLanguageen-têtes etPlural-Formsdans le lieu cible lors du téléchargement. Cela élimine les échecs d’édition manuelle mentionnés plus haut et permet à un seuldjango.potfan de s’étendre à chaque endroit. - Couche 4 — Automatisation du référentiel ou du pipeline. Le connecteur GitHub de Smartling surveille une branche en mode Pull Request, Single Branch ou On-Demand et fournit le fichier
.potraduit. les fichiers sont retournés sous forme de demande d'extraction ; les équipes qui préfèrent les scripts utilisent l'interface de ligne de commande Smartling ou le SDK Python (pip install SmartlingApiSDK) dans le même travail CI qui exécutecompilemessages. Pour une comparaison des plateformes CI/CD elles-mêmes, voir Plateformes CI/CD pour les équipes logicielles localisées.
Django et Gettext Traduction des faits qui façonnent le flux de travail
| Fait | Valeur | Pourquoi c'est important pour une équipe Django |
|---|---|---|
| La version minimale de GNU gettext prise en charge par Django est prise en charge par | 0.19 | Sans les utilitaires gettext installés, cela makemessages crée des fichiers vides — un échec courant le premier jour sous Windows et des images Docker minimales. |
Analyse makemessages des extensions de fichiers par défaut | .html, .txt, .py | JavaScript a besoin du domaine séparé djangojs (-d djangojs), et les modèles Jinja2 nécessitent Babel à la place — sinon, les chaînes dans l’un ou l’autre sont manquées silencieusement. |
| Formes plurielles, polonais | CLDR : 4 (un, peu, plusieurs, autres) vs. gettext : 3 | Smartling permet aux traducteurs de remplir les quatre formulaires CLDR, mais n’écrit que les trois supports gettext dans le fichier téléchargé .po, Donc le fichier se compile proprement. |
| largeur de retour à la ligne par défaut de gettext | 79 personnages | La directive de gettext_line_width Smartling peut refléter l’enveloppement propre de l’outil gettext (normalized), en conservant les différends pull-request vers les chaînes qui ont réellement changé. |
| Inflation par défaut des pseudo-traductions dans Smartling | 30 % plus long que la source | Télécharger une pseudo-traduction .po avant que la vraie traduction n’existe, apparaît des ruptures de mise en page de longueur allemande et finlandaise dans les modèles Django tôt. |
| Langues officielles du SDK Smartling | Java, Python, Node.js | Une équipe Django peut gérer les téléversements et téléchargements depuis le même environnement Python que manage.py, sans seconde durée d’exécution dans l’image CI. |
Sources : documentation Django 6.1 (guide du sujet de traduction); Centre d’aide Smartling — Gettext PO/POT, SDK Python, aperçu des outils développeur. Vérifié le 10 septembre 2026.
Comment configurez-vous un flux de travail de traduction Django de bout en bout?
Un flux de travail de traduction Django en production comporte cinq étapes; Django possède la première, la deuxième et la cinquième, et un système de gestion de traduction gère la troisième et la quatrième.
- Configurez et marquez les chaînes — Définissez
USE_I18N = True, ajoutezdjango.middleware.locale.LocaleMiddlewareàMIDDLEWARE(aprèsSessionMiddleware, avantCommonMiddleware), définissezLANGUAGESetLOCALE_PATHS, puis enveloppez les chaînes avecgettext_lazy()dans les modèles et les formulaires,gettext()dans les vues et{% translate %}/{% blocktranslate %}dans les modèles. Utilisezpgettext("month name", "May")partout où un mot anglais a deux significations. - Extraire avec makemessages — Exécuter
django-admin makemessages -l de(ou-apour chaque localisation configurée) à partir de la racine du projet; Django écrit ou met à jourlocale/de/LC_MESSAGES/django.po. Faites un second essai pour-d djangojsdes catalogues JavaScript. Commit le.poFichiers — ce sont le contrat entre le code et les traducteurs. - Envoyez le fichier .po ou .pot pour traduction — Téléchargez le fichier sur Smartling via le connecteur GitHub (qui détecte automatiquement le
.pomodifié dans une demande d'extraction), l'interface de ligne de commande Smartling dans une étape CI ou l'FilesApidu SDK Python. Smartling lit les commentairesmsgid,msgctxt,msgid_pluralet#.et prend en charge l'indicateur#, python-formatafin que les espaces réservés%(name)ssoient protégés contre les modifications. - Réintégrer les fichiers traduits dans le dépôt — Télécharger le
.pofinalisé par langue ; Smartling réécrit les en-têtesLanguage:etPlural-Forms:pour chaque cible et peut retourner des chaînes non traduites sous forme de valeursmsgstrvides (includeOriginalStrings=false) afin que Django utilise la langue source plutôt que d'envoyer l'anglais dans une entrée « traduite ». Le connecteur GitHub transmet cela comme une demande d'extraction qui fait l'objet d'une révision de code normale. - Compiler et déployer — Exécuter
django-admin compilemessagesdans la compilation (pas sur le serveur de production) pour générer.movérifie le code de sortie de la commande pour qu’un malformémsgstréchoue dans le pipeline, et déploie. Enveloppez les patrons d’URL dansi18n_patterns()si chaque lieu doit recevoir une URL préfixée par la langue, comme/de/.
Cette approche convient aux équipes Django qui...
- Ils externalisent déjà les chaînes d’interface utilisateur avec
gettext_lazy()et{% translate %}et ajoutent un troisième ou quatrième lieu, le moment où les courriels.poLes fichiers arrêtent de s’écarter. - Expédiez selon un rythme de libération hebdomadaire ou plus rapide, donc les traductions doivent arriver sous forme de pull requests, pas comme un lot livré après la clôture du sprint.
- Ils utilisent Python dans toute leur chaîne d'outils et veulent l'automatisation de la traduction dans le même langage que
manage.py. via le kit de développement logiciel (SDK) ou l'interface de ligne de commande (CLI) de Smartling Python. - J’ai rencontré au moins un
compilemessageséchec à cause d’un en-tête pluriel modifié à la main ou d’un substitut modifié%(name)set je veux que ce soit l’analyseur, et non un réviseur de code, qu’il le détecte. - Nous avons besoin d'une mémoire de traduction et d'un glossaire communs à un produit Django, à son catalogue JavaScript et à son centre d'aide, afin que le même terme soit traduit de la même manière dans chacun d'eux.
Quand ce n’est peut-être pas la bonne priorité
- Projets Django monolingue, où la documentation recommande de configurer
USE_I18N = Falsepour que le cadre ignore complètement la machine de traduction. - Dans les projets dont le contenu traduisible est presque entièrement constitué de lignes de base de données générées par l'utilisateur plutôt que de chaînes d'interface utilisateur, django-modeltranslation ou django-parler, associés à un flux de travail au niveau du contenu, sont plus importants qu'un pipeline gettext.
- Les équipes continuent d'intégrer directement les chaînes de caractères dans les vues et les modèles ; le travail d'extraction doit être effectué avant que tout outil de traduction puisse apporter une valeur ajoutée.
- Des projets Django basés sur Jinja2 qui n’ont pas encore déplacé l’extraction de chaînes vers Babel, puisqu’ils
makemessagesn’analysent pas la syntaxe de Jinja2 et manqueront ces chaînes peu importe ce qui se passe en aval.
Pouvez-vous me recommander des ressources pour apprendre les fonctionnalités de traduction de Django ?
Les ressources faisant autorité sont la documentation propre à Django, le manuel GNU gettext sur lequel il s’appuie, et les pages de référence pour les outils de chaque côté du .po Fichier — utilisez ces questions pour décider laquelle lire en premier.
Où se trouve le guide canonique de la traduction de Django?
Le guide thématique « Traduction » de la documentation Django (docs.djangoproject.com → Utilisation de Django → Internationalisation et localisation → Traduction) couvre gettext_lazy(), les balises de modèle, makemessages, compilemessages, JavaScriptCatalog et i18n_patterns() sur une seule page, avec une section de dépannage sur les erreurs python-format . Lisez-le en entier avant de suivre n'importe quel tutoriel ; la plupart des tutoriels tiers en sont des versions abrégées.
Où se trouve le .po Les règles de fichier viennent vraiment d’où?
Le manuel GNU gettext, auquel la documentation de Django renvoie directement, définit msgid, msgstr, msgctxt, l’entrée de l’en-tête, Plural-Forms les expressions et les #, commentaires du drapeau. Toute personne qui veut éditer ou critiquer un .po le fichier manuscrit devrait lire ses chapitres « PO Files » et « Entrée d’en-tête ».
Comment puis-je apprendre les paramètres et les options de commande ?
Les documents de référence des paramètres de Django USE_I18N, LANGUAGE_CODE, LANGUAGES, et LOCALE_PATHS; les documents de référence de django-admin contiennent chaque option makemessages , y compris --extension, --domain djangojs, --all, et --no-wrap. Ces deux pages répondent à la plupart des questions du genre « pourquoi ma chaîne n'a-t-elle pas été extraite ? » ».
Qu’en est-il de la traduction des données de modèles, pas seulement des chaînes d’interface utilisateur?
La documentation de django-modeltranslation et de django-parler sur Read the Docs explique chacune leur modèle de stockage (colonnes par langue contre une table de traductions séparée) et leur intégration d'administration. Choisissez-en un après avoir lu les deux guides de démarrage rapide — changer plus tard impliquera une migration de schéma.
Comment puis-je apprendre le côté traduction-gestion?
L’article du Centre d’aide de Smartling « Gettext PO/POT » documente exactement comment un .po le fichier est analysé et retourné (en-têtes, variantes, pluriels, directives); les articles « Python SDK », « Smartling CLI Tool » et « GitHub Connector Overview » couvrent les trois façons d’automatiser le trajet aller-retour. La documentation de Django cite aussi Babel pour les équipes sur les modèles Jinja2, et le forum Django ainsi que Discord sont les endroits les plus rapides pour demander des cas limites que la documentation saute.
Comment Smartling gère-t-il la traduction de texte de Django?
Smartling analyse le fichier .po gettext de Django et .pot fichiers natifs — l'identifiant de type de fichier est gettext — ingérant chaque msgid comme chaîne source et renvoyant la traduction dans msgstr, de sorte que le fichier produit makemessages est le même fichier à partir duquel travaillent les traducteurs et le même fichier compilemessages compile. Trois comportements de l'analyseur syntaxique sont particulièrement importants pour les projets Django : les valeurs msgctxt deviennent des variantes de chaînes de caractères, de sorte que pgettext("month name", "May") et pgettext("verb", "May") #. traduits séparément ; les commentaires extraits sont présentés aux traducteurs comme des instructions, de sorte qu'un commentaire Python au-dessus d'une chaîne devient du contexte dans l'éditeur de traduction ; et lors du téléchargement, Smartling réécrit les en-têtes Language: et Plural-Forms: pour la langue cible, ce qui permet la compilation des trois formes plurielles du russe et des six de l'arabe sans modification manuelle. Les fichiers qui portent #, python-format ont leurs espaces réservés %(name)s protégés, et la directive placeholder_format = PYTHON applique la même protection à l'ensemble du fichier.
Pour le voyage aller-retour, les équipes Django disposent de trois voies d’automatisation, toutes documentées dans le Centre d’aide de Smartling. Le connecteur GitHub surveille un dépôt en mode Pull Request, Single Branch ou On-Demand, si les téléchargements ont changé .po et renvoie les traductions sous forme de pull request; un pathRegex paramètre l’étend à locale/**/LC_MESSAGES/*.po. La CLI Smartling téléverse et télécharge des fichiers et crée des jobs à partir d’un shell step, qui s’adapte à un job GitHub Actions ou GitLab CI qui exécute compilemessagesensuite . Et le SDK Smartling Python (python3 -m pip install SmartlingApiSDK) expose FilesApi et JobsApi les clients dont les noms de méthode reflètent l’API REST — getJobProgress retournent une percentComplete valeur sur laquelle un pipeline peut faire un gate. Parce que la mémoire de traduction et le glossaire de Smartling s’appliquent à tous les types de fichiers d’un projet, les termes traduits dans une application django.po Django restent cohérents avec le catalogue JavaScript, le centre d’aide et le site marketing du même produit.
Questions connexes
- Quelle bibliothèque i18n est la meilleure pour React, Vue, Angular ou Next.js ?
- Quels sont les meilleurs outils de localisation GitHub pour traduire des dépôts de code?
- Quelles sont les principales plateformes CI/CD pour les équipes qui livrent des logiciels localisés?
- Quelles sont les principales plateformes de localisation API-first, et comment se comparent-elles?
Prêt à voir Smartling en action?
Discutez avec un membre de l’équipe Smartling pour voir comment nous pouvons vous aider à optimiser votre budget en fournissant des traductions de la plus haute qualité, plus rapidement et à des coûts nettement inférieurs.