Si vous avez travaillé avec le framework d'internationalisation (i18n) intégré de Django, vous savez qu'il gère bien les chaînes statiques. Envelopper du texte dans gettext() ou utiliser la balise de template {% trans %} extrait les chaînes dans des fichiers .po, que les traducteurs remplissent. Le système est éprouvé et fonctionne très bien pour le code et les templates.
Mais qu'en est-il du contenu stocké dans votre base de données ?
Noms de produits, titres d'articles, descriptions de catégories, réponses FAQ, contenu généré par les utilisateurs. Rien de tout cela ne se trouve dans votre code source. La commande makemessages de Django ne le trouvera jamais, et les fichiers .po ne peuvent pas vous aider ici. Si votre application sert du contenu dynamique aux utilisateurs dans plusieurs langues, vous avez besoin d'une stratégie différente.
Voici comment faire : utilisez django-modeltranslation pour ajouter des champs traduisibles à vos modèles, puis automatisez la traduction avec l'IA en utilisant TranslateBot.
Packages de Traduction de Base de Données Django
Plusieurs packages tiers résolvent le problème de la traduction de base de données, chacun avec une architecture différente.
django-modeltranslation
Ajoute des colonnes spécifiques à chaque langue directement dans vos tables existantes. Un champ title devient title_en, title_de, title_fr, et ainsi de suite. Les requêtes restent rapides car tout est dans la même table. L'interface d'administration affiche toutes les langues côte à côte.
- Avantages : Pas de JOINs, requêtes rapides, accès transparent via les descripteurs de champs, écosystème mature
- Inconvénients : Modifications du schéma pour chaque nouvelle langue, tables plus larges
django-parler
Crée une table de traduction séparée pour chaque modèle. La table originale reste propre, et les traductions sont stockées dans une table liée par clé étrangère.
- Avantages : Schéma propre, facile d'ajouter des langues sans migrations
- Inconvénients : Nécessite des JOINs pour le contenu traduit, schémas de requêtes légèrement plus complexes
django-translations
Utilise une seule table de traductions avec une clé étrangère générique pointant vers n'importe quel modèle. Toutes les traductions de tous les modèles vont dans une seule table.
- Avantages : Modifications de schéma minimales, fonctionne avec n'importe quel modèle
- Inconvénients : Les requêtes avec clé étrangère générique peuvent être lentes, API moins transparente
Champ JSON Manuel
Vous pouvez stocker les traductions dans un JSONField :
class Product(models.Model):
name_translations = models.JSONField(default=dict)
# {"en": "Running Shoes", "de": "Laufschuhe", "fr": "Chaussures de course"}
- Avantages : Pas de dépendances supplémentaires, flexible
- Inconvénients : Pas d'intégration ORM, pas de support admin, tout est manuel
Lequel Devriez-Vous Utiliser ?
Pour la plupart des projets, django-modeltranslation est le meilleur choix. C'est le package le plus mature, il offre la meilleure intégration avec l'admin Django, et garde toutes les données dans la même table pour des requêtes rapides. Le compromis (tables plus larges et une migration par nouvelle langue) est gérable pour la grande majorité des applications. Le reste de ce guide utilise django-modeltranslation.
Configuration de django-modeltranslation Étape par Étape
Étape 1 : Installer le Package
TranslateBot inclut django-modeltranslation comme dépendance optionnelle. Installez les deux en une fois :
pip install translatebot-django[modeltranslation]
Ou si vous utilisez uv :
uv add --dev translatebot-django[modeltranslation]
Étape 2 : Configurer les Paramètres Django
Deux choses comptent dans settings.py : l'ordre des applications et la liste des langues.
# settings.py
INSTALLED_APPS = [
'modeltranslation', # Must be BEFORE django.contrib.admin
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Your apps
'shop',
'translatebot_django',
]
LANGUAGE_CODE = 'en'
LANGUAGES = [
('en', 'English'),
('de', 'German'),
('fr', 'French'),
('nl', 'Dutch'),
]
L'application modeltranslation doit venir avant django.contrib.admin pour qu'elle puisse patcher les classes admin afin d'afficher les champs de traduction.
Étape 3 : Enregistrer les Modèles pour la Traduction
Créez un fichier translation.py dans chaque application qui a des modèles traduisibles. Pour une application de boutique e-commerce :
# shop/translation.py
from modeltranslation.translator import register, TranslationOptions
from .models import Product, Category
@register(Product)
class ProductTranslationOptions(TranslationOptions):
fields = ('name', 'description', 'short_description')
@register(Category)
class CategoryTranslationOptions(TranslationOptions):
fields = ('name', 'description')
N'incluez que les champs contenant du texte lisible par l'humain. N'enregistrez pas les champs comme slug, price ou sku.
Étape 4 : Créer et Exécuter les Migrations
python manage.py makemigrations
python manage.py migrate
Après cela, votre table shop_product a de nouvelles colonnes :
| Colonne | Type |
|---|---|
name |
varchar(200) |
name_en |
varchar(200) |
name_de |
varchar(200) |
name_fr |
varchar(200) |
name_nl |
varchar(200) |
description |
text |
description_en |
text |
description_de |
text |
description_fr |
text |
description_nl |
text |
short_description |
text |
short_description_en |
text |
short_description_de |
text |
short_description_fr |
text |
short_description_nl |
text |
Chaque langue que vous avez définie dans LANGUAGES obtient sa propre colonne pour chaque champ enregistré.
Le Problème : Des Champs de Traduction Vides
Vous avez maintenant le schéma en place, mais chaque colonne _de, _fr et _nl est vide. Si vous avez 500 produits avec 3 champs traduisibles et 3 langues cibles, ce sont 4 500 champs vides en attente d'être remplis.
Traduire manuellement ce contenu n'est pas réaliste. Même avec un service de traduction professionnel, vous devriez exporter les données, les envoyer, attendre la livraison, et importer les résultats. Pour une petite équipe ou un développeur solo, cela signifie généralement que la fonctionnalité n'est jamais livrée.
C'est là qu'intervient TranslateBot.
Automatiser les Traductions avec TranslateBot
La commande de gestion translate de TranslateBot peut remplir tous ces champs vides en utilisant l'IA. Configurez d'abord votre clé API :
# settings.py
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini" # Fast and cost-effective
Puis traduisez tous les modèles enregistrés vers une langue cible :
python manage.py translate --target-lang de --models
Cette seule commande trouve chaque modèle enregistré avec django-modeltranslation, identifie les champs vides pour la langue cible, et les remplit avec des traductions générées par l'IA.
Traduire des Modèles Spécifiques
Si vous voulez traduire uniquement les produits et pas les catégories :
python manage.py translate --target-lang de --models Product
Ou plusieurs modèles spécifiques :
python manage.py translate --target-lang de --models Product Category
Prévisualiser avec Dry Run
Prévisualisez toujours avant d'écrire dans la base de données :
python manage.py translate --target-lang de --models --dry-run
Cela vous montre exactement ce qui sera traduit sans modifier aucun enregistrement.
Re-traduire du Contenu Existant
Par défaut, TranslateBot ignore les champs qui ont déjà une traduction. Pour écraser les traductions existantes (par exemple, après avoir amélioré votre modèle IA ou ajouté du contexte) :
python manage.py translate --target-lang de --models --overwrite
Traduire Toutes les Langues en Une Fois
Si vous omettez --target-lang et avez LANGUAGES défini dans vos paramètres, TranslateBot traduit vers toutes les langues configurées :
python manage.py translate --models
Comment Fonctionne le Pipeline de Traduction
Voici ce qui se passe lorsque vous exécutez la commande de traduction.
-
Découverte. TranslateBot interroge le registre de django-modeltranslation pour trouver tous les modèles enregistrés et leurs champs traduisibles.
-
Détection de la source. Pour chaque enregistrement, il lit le contenu source. Il vérifie d'abord le champ de base (par exemple,
name), puis se rabat sur le premier champ spécifique à une langue qui est rempli (par exemple,name_en). Les enregistrements sans contenu source sont ignorés. -
Mise en lots. Les enregistrements sont regroupés en lots et envoyés au fournisseur d'IA. Cela maintient les appels API efficaces et évite d'atteindre les limites de débit.
-
Traduction. Chaque lot est traduit en utilisant le modèle d'IA configuré. Vous pouvez utiliser n'importe quel fournisseur LLM supporté par LiteLLM (OpenAI, Anthropic, Google, Azure, et bien d'autres) ou DeepL.
-
Écritures atomiques. Toutes les mises à jour de base de données pour une exécution de traduction sont enveloppées dans une seule transaction. Si quelque chose se passe mal, comme une erreur API ou une violation de contrainte de base de données, aucune donnée partielle n'est sauvegardée. Tout ou rien.
Exemple de Flux de Travail Complet
Voici un exemple complet de la définition du modèle au contenu traduit, en utilisant un modèle Product e-commerce.
Définir le Modèle
# shop/models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
short_description = models.CharField(max_length=500, blank=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
sku = models.CharField(max_length=50, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
Enregistrer pour la Traduction
# shop/translation.py
from modeltranslation.translator import register, TranslationOptions
from .models import Product
@register(Product)
class ProductTranslationOptions(TranslationOptions):
fields = ('name', 'description', 'short_description')
Exécuter les Migrations
python manage.py makemigrations shop
python manage.py migrate
Ajouter un Contexte de Traduction (Optionnel)
Créez un fichier TRANSLATING.md à la racine de votre projet pour donner à l'IA du contexte sur le domaine de votre produit :
# Translation Context
## About This Project
E-commerce store for outdoor sports equipment.
## Terminology
- "trail runners" refers to trail running shoes, not people
- Keep brand names (Nike, Salomon, Arc'teryx) untranslated
- "Gore-Tex" is a brand name, do not translate
## Tone
- Use informal "du" form in German
- Product descriptions should sound enthusiastic but not exaggerated
Traduire
# Preview first
python manage.py translate --target-lang de --models Product --dry-run
# Apply translations
python manage.py translate --target-lang de --models Product
Sortie :
Translating Product model fields to German (de)...
Found 142 products with untranslated fields
Translating batch 1/15...
Translating batch 2/15...
...
Translating batch 15/15...
Successfully translated 142 products
Vérifier dans l'Admin
Ouvrez l'admin Django et allez sur n'importe quel produit. Vous verrez les champs de traduction remplis :
- Name [de]: Ultraleichte Trail-Laufschuhe
- Description [de]: Diese leichten Trail-Laufschuhe bieten hervorragenden Grip...
- Short description [de]: Leicht, schnell und griffig auf jedem Untergrund.
Répétez pour chaque langue cible :
python manage.py translate --target-lang fr --models Product
python manage.py translate --target-lang nl --models Product
Ou traduisez toutes les langues en une fois :
python manage.py translate --models Product
Bonnes Pratiques
Sauvegardez votre base de données avant d'exécuter des traductions en masse en production. TranslateBot utilise des transactions atomiques, donc une exécution échouée ne laissera pas de données partielles. Mais avoir une sauvegarde vous donne un moyen de revenir en arrière si la qualité de la traduction n'est pas celle attendue.
# PostgreSQL example
pg_dump mydb > backup_before_translation.sql
Utilisez d'abord le dry run. Exécutez toujours avec --dry-run avant d'appliquer des traductions à un nouveau modèle ou une nouvelle langue. Examinez la sortie pour vous assurer que le contenu source est détecté correctement et que les traductions semblent raisonnables.
Traduisez un modèle à la fois pour les grandes bases de données. Cela facilite la revue des résultats et la ré-exécution de modèles spécifiques si nécessaire.
python manage.py translate --target-lang de --models Product
python manage.py translate --target-lang de --models Category
python manage.py translate --target-lang de --models Article
Ajoutez un contexte de traduction. Un fichier TRANSLATING.md avec une terminologie spécifique au domaine et des directives de ton améliore significativement la qualité de la traduction. C'est particulièrement important pour les domaines spécialisés comme la médecine, le droit ou les produits techniques.
Gardez votre langue source remplie. TranslateBot lit depuis le champ de base ou le champ de la langue source. Assurez-vous que votre flux de travail de saisie de données remplit toujours la langue source. Des champs source vides signifient des traductions vides.
Combinez avec la traduction de fichiers PO pour une couverture complète. Traduisez à la fois les chaînes de votre code et le contenu de la base de données :
# Static strings in code and templates
python manage.py makemessages -l de -l fr -l nl
python manage.py translate
python manage.py compilemessages
# Dynamic content in the database
python manage.py translate --models
De cette façon, chaque chaîne que vos utilisateurs voient, qu'elle provienne d'un template ou de la base de données, est traduite.
Prochaines Étapes
- Lisez la référence complète des commandes pour toutes les options disponibles
- Mettez en place l'intégration CI pour vérifier automatiquement les traductions manquantes
- Explorez les modèles d'IA supportés pour trouver le meilleur équilibre entre qualité et coût pour votre projet