Retour au blog

Comment traduire le contenu de la base de données Django avec l'IA

2026-02-18 9 min de lecture
Comment traduire le contenu de la base de données Django avec l'IA

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.

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.

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.

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"}

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.

  1. Découverte. TranslateBot interroge le registre de django-modeltranslation pour trouver tous les modèles enregistrés et leurs champs traduisibles.

  2. 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.

  3. 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.

  4. 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.

  5. É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 :

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

Arrêtez d'éditer les fichiers .po manuellement

TranslateBot automatise les traductions Django avec l'IA. Une commande, toutes vos langues, des centimes par traduction.