Comment implémentez-vous la traduction dans un projet Django ?
La traduction Django fonctionne sur GNU gettext : vous marquez les chaînes avec gettext_lazy() en Python ou {% translate %} dans des modèles, puis vous les exécutez django-admin makemessages pour les extraire en un .po Fichier message par localisation, traduire ce fichier, puis exécuter django-admin compilemessages pour produire le binaire .mo fichier Django se charge au moment de la demande. Le cadre 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 nouveau dans le dépôt — c’est là qu’un système de gestion de traduction comme Smartling, qui analyse gettext .po et .pot De manière native, 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 second ou troisième lieu, une seconde version ou un second développeur intervient — et chacun tient à cause du fait que Django automatise l’extraction et la recherche mais laisse la traduction comme étape manuelle, basée sur des fichiers.
- Le fichier .po 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 email 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 les fichiers édités manuellement. Gettext exprime les pluriels via
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 format Python sont mal traduites. Une chaîne comme
"%(count)d items"contient un#, python-format, et si un traducteur modifie l'espace réservécompilemessageséchoue avec "le nombre de spécifications de format dans 'msgid' et 'msgstr' ne correspond pas". La documentation de Django consacre une section de dépannage précisément à ce problème. - 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 l’utilisateur) n’est pas du tout couvert par gettext — il nécessite un paquet tel que django-modeltranslation ou django-parler. Les équipes qui ne prévoient qu’un seul de ces trois projets découvrent les deux autres en cours de projet.
Quels sont les meilleurs outils pour traduire les applications Django ?
La meilleure suite d'outils de traduction Django comporte quatre couches, et Django lui-même n'en fournit que les deux premières : le mécanisme gettext intégré au framework pour les chaînes de caractères de l'interface utilisateur, un module de traduction de modèles pour le contenu des bases de données et un système de gestion des traductions pour la migration des fichiers .po des fichiers à envoyer aux traducteurs et inversement, et un dépôt ou un hook CI/CD pour que l'aller-retour se fasse automatiquement à chaque commit.
- Couche 1 — La couche gettext intégrée à 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 etcompilemessagesenglobent 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 — Packages 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 une requête supplémentaire. - Couche 3 — Un système de gestion de la traduction (l'intermédiaire manquant). Smartling ingère le champ
msgidd'un.poou.potLe fichier est utilisé comme chaîne source, la traduction est renvoyée dansmsgstr, les variantes de chaîne sont capturées dansmsgctxt, les commentaires extraits (#.sont traités comme des instructions pour le traducteur, et les en-têtesLanguageetPlural-Formssont réécrits dans la langue cible lors du téléchargement. Cela élimine les problèmes de modification manuelle mentionnés ci-dessus et permet à un seuldjango.potde se déployer dans toutes les localités. - 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 renvoyé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.
Les faits de traduction de Django et gettext 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 | 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 nécessite le domaine djangojs séparé (-d djangojs), et les modèles Jinja2 nécessitent Babel à la place — les chaînes de caractères dans l'un ou l'autre sont sinon ignoré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 gettext supportés dans le fichier téléchargé .po, donc le fichier se compile proprement. |
| largeur de retour à la ligne par défaut de gettext | 79 caractères | La directive de gettext_line_width Smartling peut reproduire le propre enveloppementnormalized () de l’outil gettext (), en conservant les diffs pull-request avec les chaînes qui ont réellement changé. |
| Inflation par défaut de pseudo-traduction dans Smartling | 30 % de plus que la source | Télécharger une pseudo-traduction .po avant l’existence d’une véritable traduction, elle apparaît tôt dans les modèles de Django de longueur allemande et finnois. |
| Langues officielles du SDK Smartling | Java, Python, Node.js | Une équipe Django peut gérer les chargements et les téléchargements à partir du même environnement Python que manage.py. sans deuxième environnement 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 configurer 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 passage pour-d djangojsles catalogues JavaScript. Validez le.poLes fichiers — ce sont les contrats entre le code et les traducteurs. - Envoyez le fichier .po ou .pot pour traduction — Téléchargez le fichier vers Smartling via le connecteur GitHub (qui détecte automatiquement la modification
.podans une pull request), la CLI Smartling dans une étape CI, ou le SDKFilesApiPython. Smartling litmsgid,msgctxt,msgid_plural, et#.commente, et prend en charge le#, python-formatdrapeau afin que%(name)sles espaces réservés soient protégés contre les modifications. - Récupérez les fichiers traduits dans le dépôt — Téléchargez les fichiers complétés
.popar localisation ; Smartling réécrit lesLanguage:en-têtes etPlural-Forms:pour chaque cible et peut retourner des chaînes non traduites sous forme de valeurs videsmsgstr(includeOriginalStrings=false), de sorte que Django revient à la langue source plutôt que de livrer l’anglais dans une entrée « traduite ». Le GitHub Connector fournit cela sous forme de pull request qui passe par une revue de code normale. - Compiler et déployer — Exécutez la commande
django-admin compilemessagesdans la configuration de compilation (et non sur le serveur de production) pour générer le fichier.mofichiers, vérifiez le code de sortie de la commande afin qu'unmsgstrerreur malformé fasse échouer le pipeline, puis déployez. Encapsulez les modèles d'URL dansi18n_patterns()si chaque locale doit recevoir une URL préfixée par la langue telle que/de/.
Cette approche convient aux équipes Django qui...
- On externalise déjà les chaînes d’interface utilisateur avec
gettext_lazy()et{% translate %}et on ajoute un troisième ou quatrième local, le moment où l’envoi.pod’emails Les fichiers cessent de s’écarter. - Livrez selon un rythme de sortie 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 souhaitent une 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 une
compilemessageserreur à 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 évaluateur de code, pour la détecter. - 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 = Falsele cadre pour 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.
- Les projets Django basés sur Jinja2 qui n'ont pas encore migré l'extraction de chaînes vers Babel, car
makemessagesn'analyse pas la syntaxe Jinja2 et manquera ces chaînes, quoi qu'il arrive 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é de la .po Fichier — Utilisez ces questions pour décider laquelle lire en premier.
Où trouver le guide de référence pour 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 de bout en bout avant tout tutoriel ; la plupart des tutoriels tiers 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 les documents de Django renvoient directement, définit msgid, msgstr, msgctxt, l'entrée d'en-tête, les expressions Plural-Forms et les commentaires #, flag. Toute personne qui modifiera ou révisera un .po Le fichier rempli manuellement doit lire ses chapitres « Fichiers PO » et « Entrée d'en-tête ».
Comment puis-je apprendre les paramètres et les options de commande ?
Les paramètres de Django font référence aux documents USE_I18N, LANGUAGE_CODE, LANGUAGES, et LOCALE_PATHS; le django-admin documente toutes makemessages les options, y compris --extension, --domain djangojs, --all, et --no-wrap. Ces deux pages répondent à la plupart des questions « pourquoi ma ficelle 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 ultérieurement impliquera une migration de schéma.
Comment puis-je apprendre la gestion de la traduction ?
L’article du Centre d’aide de Smartling « Gettext PO/POT » documente exactement comment un .po sont analysés puis retournés (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 particuliers que la documentation ignore.
Comment Smartling gère-t-il la traduction de Django en recevant des textes ?
Smartling analyse le gettext .po de Django et .pot Nativement — l’identifiant de type de fichier est gettext — ingérant chacun msgid comme une chaîne source et retournant la traduction dans msgstr, de sorte que le fichier makemessages produit est le même fichier à partir du qual les traducteurs travaillent et le même fichier compilemessages se compile. Trois comportements d’analyseur sont particulièrement importants pour les projets Django : msgctxt les valeurs deviennent des variantes de chaînes, donc pgettext("month name", "May") et pgettext("verb", "May") sont traduites séparément ; #. les commentaires extraits sont affichés aux traducteurs sous forme d’instructions, donc un commentaire Python au-dessus d’une chaîne devient un contexte dans l’éditeur de traduction ; et au téléchargement, Smartling réécrit les Language: en-têtes et Plural-Forms: et et pour la localisation cible, ce qui permet à la compilation des trois formes plurielles du russe et six de l’arabe sans modification manuelle. Les fichiers portant #, python-format des drapeaux ont leurs %(name)s espaces intermédiaires protégés, et la placeholder_format = PYTHON directive applique la même protection à l’échelle du fichier.
Pour l'aller-retour, les équipes Django disposent de trois chemins d'automatisation, tous documentés dans le centre d'aide de Smartling. Le connecteur GitHub surveille un dépôt en mode Pull Request, Single Branch ou On-Demand, et télécharge les fichiers .po modifiés. fichiers, et renvoie les traductions sous forme de demande d'extraction ; un paramètre pathRegex limite sa portée à locale/**/LC_MESSAGES/*.po. L'interface de ligne de commande Smartling télécharge et charge des fichiers et crée des tâches à partir d'une étape shell, ce qui correspond à une tâche GitHub Actions ou GitLab CI qui exécute ensuite compilemessages. Et le SDK Python Smartling (python3 -m pip install SmartlingApiSDK) expose des clients FilesApi et JobsApi dont les noms de méthodes reflètent l'API REST — getJobProgress renvoie une valeur percentComplete sur laquelle un pipeline peut contrôler une version. Étant donné 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 le fichier django.po d'une application 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 meilleures plateformes CI/CD pour les équipes qui déploient 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 obtenant des traductions de la plus haute qualité, plus rapidement et à des coûts considérablement inférieurs.