Intermédiaire 11 minTraduction

Traduire des documents en local : l'alternative à DeepL qui ne fuit pas

Coller un contrat, un rapport financier ou un dossier RH dans DeepL ou ChatGPT, c'est envoyer ce document sur des serveurs que vous ne contrôlez pas. La traduction IA locale résout ce problème : un LLM multilingue tourne sur votre machine, aucune donnée ne sort. Ce guide montre quels modèles choisir, comment préserver la mise en forme des fichiers, et comment traduire des dizaines de documents par lots avec un simple script Ollama.

Par Marie L.·Màj 2026-07-26·Testé sur Windows, macOS, Linux

#Pourquoi ne pas envoyer vos documents à DeepL

DeepL et Google Translate sont excellents, mais leur modèle économique repose sur le cloud : votre texte transite par leurs serveurs et, selon l'offre, peut être conservé ou utilisé pour améliorer les modèles. Pour un email anodin, peu importe. Pour un contrat sous NDA, un brevet en cours de dépôt, un bilan comptable ou des données personnelles de salariés, c'est un risque juridique et concurrentiel concret.

La traduction IA locale change la donne : le modèle est téléchargé sur votre disque et s'exécute sur votre CPU ou GPU. Aucune requête réseau, aucun compte, aucune limite de volume. Vous pouvez traduire un dossier entier de documents confidentiels sans qu'un octet ne quitte votre poste — y compris hors-ligne, dans un avion ou sur un réseau isolé.

i
Le vrai argument : la conformité
Pour un cabinet d'avocats, un service RH ou une équipe santé, la traduction locale supprime toute question RGPD sur le transfert de données vers un sous-traitant. Le document ne quitte jamais le périmètre de l'entreprise.
Confidentialité
Contrats, brevets, données médicales ou RH restent sur votre machine.
Coût nul à l'usage
Pas d'abonnement ni de facturation au caractère : traduisez 10 ou 10 000 pages au même prix.
Hors-ligne
Fonctionne sans connexion, utile sur poste isolé ou en déplacement.
Volume illimité
Aucun quota mensuel ni throttling comme sur les API cloud.

#Quels modèles locaux traduisent vraiment bien

Tous les LLM ne se valent pas en traduction. Un bon traducteur local doit avoir été entraîné sur un large corpus multilingue et gérer finement le français. En 2026, quelques familles se détachent nettement pour un usage auto-hébergé.

Qwen3 14B / 32B
Excellent en multilingue, très bon en français, gère bien les nuances et le vocabulaire technique. 14B (≈9 Go VRAM en Q4) est le meilleur compromis qualité/ressources.
Gemma 2 27B
Traductions fluides et naturelles, ponctuation française soignée. ≈16 Go en Q4, idéal sur RTX 4080 16GB ou Mac à mémoire unifiée.
Aya 23 (8B / 35B)
Modèle de Cohere pensé pour le multilingue (23 langues). Le 8B tourne partout (≈5 Go) et traduit déjà remarquablement.
Mistral Small 3
Bon niveau en français langue native, rapide, ≈14 Go en Q4. Bon choix pour du volume.
Llama 3.3 70B
Qualité proche du cloud si vous avez le matériel (≈40 Go en Q4, RTX 4090 ou Mac 48 Go+). Réservé aux traductions exigeantes.
Par où commencer
Si vous hésitez, lancez Qwen3 14B en Q4_K_M. C'est le meilleur rapport qualité/VRAM pour la traduction FR ↔ EN/ES/DE/IT sur un GPU 12-16 Go. Passez au 32B seulement si la qualité ne vous suffit pas.

Les modèles spécialisés « traduction » type NLLB ou Opus-MT existent aussi et sont très légers, mais un LLM généraliste récent les dépasse souvent sur les textes longs et le respect du contexte (registre, terminologie métier, cohérence d'un document entier).


#Prérequis et installation

Le socle est classique : Ollama comme moteur d'inférence, un modèle multilingue, et Python pour les scripts de traitement de fichiers. Ollama écoute par défaut sur http://localhost:11434.

Ollama installé
Le daemon qui télécharge et exécute les modèles. Voir le guide d'installation si ce n'est pas déjà fait.
Un GPU confortable
RTX 3060 12GB minimum pour un 14B en Q4. Ça tourne aussi sur CPU, mais plus lentement.
Python 3.10+
Pour manipuler DOCX, PDF et Markdown et appeler l'API Ollama.
Terminal
# Récupérer un modèle multilingue adapté à la traduction
ollama pull qwen3:14b

# Vérifier qu'il répond
ollama run qwen3:14b "Traduis en anglais : Le contrat prend effet à sa signature."
Terminal
# Dépendances Python pour les formats de documents
pip install ollama python-docx pypdf markdown-it-py

#Premier test de traduction

Avant d'automatiser, validez la qualité sur un extrait représentatif. La clé d'une bonne traduction locale tient dans le prompt système : il fixe le rôle, la langue cible et surtout la consigne de ne rien ajouter.

traduire.py
import ollama

MODELE = "qwen3:14b"

SYSTEME = (
    "Tu es un traducteur professionnel. Traduis le texte fourni de "
    "{source} vers {cible}. Conserve le sens, le registre et la "
    "terminologie technique. Ne commente pas, n'ajoute rien : "
    "renvoie uniquement la traduction."
)

def traduire(texte, source="français", cible="anglais"):
    reponse = ollama.chat(
        model=MODELE,
        messages=[
            {"role": "system", "content": SYSTEME.format(source=source, cible=cible)},
            {"role": "user", "content": texte},
        ],
        options={"temperature": 0.2},
    )
    return reponse["message"]["content"].strip()

if __name__ == "__main__":
    extrait = "Le présent contrat prend effet à la date de sa signature par les deux parties."
    print(traduire(extrait))
Température basse
En traduction, une température de 0.1 à 0.3 donne des résultats plus fidèles et reproductibles. Une valeur élevée pousse le modèle à « broder » et à reformuler, ce qui n'est pas souhaitable.

#Préserver la mise en forme (DOCX, PDF, Markdown)

Traduire du texte brut est facile ; garder la mise en forme d'un document réel l'est moins. La bonne approche n'est pas de balancer le fichier entier au modèle, mais de traduire chaque segment de texte à sa place, en laissant la structure intacte.

#Fichiers Word (DOCX)

python-docx expose chaque paragraphe et chaque cellule de tableau. On traduit le texte de chaque « run » en conservant le style, puis on réécrit le fichier. La mise en page, les titres et les tableaux sont préservés.

traduire_docx.py
from docx import Document
from traduire import traduire

def traduire_docx(entree, sortie, cible="anglais"):
    doc = Document(entree)

    for para in doc.paragraphs:
        if para.text.strip():
            para.text = traduire(para.text, cible=cible)

    for table in doc.tables:
        for ligne in table.rows:
            for cellule in ligne.cells:
                if cellule.text.strip():
                    cellule.text = traduire(cellule.text, cible=cible)

    doc.save(sortie)
    print(f"Traduit : {sortie}")

if __name__ == "__main__":
    traduire_docx("contrat.docx", "contrat_en.docx")
!
Le style peut sauter sur les runs multiples
Réécrire para.text remplace les runs et peut aplatir un formatage fin (gras au milieu d'une phrase). Pour un rendu impeccable sur des documents très mis en forme, traduisez run par run plutôt que le paragraphe entier — au prix d'un découpage moins naturel pour le modèle.

#Markdown

Le Markdown est le format le plus simple à traduire proprement : il suffit d'indiquer au modèle de préserver la syntaxe. Les titres, listes, liens et blocs de code restent intacts si le prompt l'exige.

traduire_md.py
import ollama

SYSTEME_MD = (
    "Traduis ce document Markdown en {cible}. Conserve EXACTEMENT la "
    "syntaxe Markdown : titres (#), listes, liens, tableaux et blocs "
    "de code. Ne traduis PAS le contenu des blocs de code. Renvoie "
    "uniquement le Markdown traduit."
)

def traduire_markdown(chemin, sortie, cible="anglais"):
    texte = open(chemin, encoding="utf-8").read()
    reponse = ollama.chat(
        model="qwen3:14b",
        messages=[
            {"role": "system", "content": SYSTEME_MD.format(cible=cible)},
            {"role": "user", "content": texte},
        ],
        options={"temperature": 0.2},
    )
    open(sortie, "w", encoding="utf-8").write(reponse["message"]["content"])

traduire_markdown("README.md", "README_en.md")

#PDF

Le PDF est le cas le plus délicat : c'est un format de présentation, pas de contenu. On extrait le texte avec pypdf, on le traduit, puis on le réémet dans un nouveau document (souvent un DOCX ou un PDF généré). Reproduire la mise en page exacte d'un PDF est rarement rentable ; visez un document lisible plutôt qu'une copie pixel-perfect.

traduire_pdf.py
from pypdf import PdfReader
from docx import Document
from traduire import traduire

def pdf_vers_docx_traduit(entree, sortie, cible="anglais"):
    lecteur = PdfReader(entree)
    doc = Document()

    for page in lecteur.pages:
        texte = page.extract_text() or ""
        for paragraphe in texte.split("\n\n"):
            if paragraphe.strip():
                doc.add_paragraph(traduire(paragraphe, cible=cible))

    doc.save(sortie)

pdf_vers_docx_traduit("rapport.pdf", "rapport_en.docx")

#Traduction par lots avec Ollama

L'intérêt majeur du local, c'est le volume sans facture. Un script qui parcourt un dossier et traduit chaque fichier transforme votre poste en service de traduction par lots. Voici un script qui traite tous les .docx d'un répertoire.

batch_traduction.py
import sys
from pathlib import Path
from traduire_docx import traduire_docx

def traduire_dossier(dossier, cible="anglais", suffixe="_traduit"):
    dossier = Path(dossier)
    fichiers = list(dossier.glob("*.docx"))
    print(f"{len(fichiers)} fichier(s) à traduire\n")

    for i, fichier in enumerate(fichiers, 1):
        if suffixe in fichier.stem:
            continue  # éviter de retraduire une sortie
        sortie = fichier.with_name(f"{fichier.stem}{suffixe}.docx")
        print(f"[{i}/{len(fichiers)}] {fichier.name}")
        traduire_docx(fichier, sortie, cible=cible)

    print("\nTerminé.")

if __name__ == "__main__":
    dossier = sys.argv[1] if len(sys.argv) > 1 else "."
    traduire_dossier(dossier)
Terminal
# Traduire tous les .docx d'un dossier en anglais
python batch_traduction.py ./documents_a_traduire
Garder le modèle chargé
Sur un gros lot, réglez OLLAMA_KEEP_ALIVE (par ex. export OLLAMA_KEEP_ALIVE=30m) pour éviter qu'Ollama ne décharge le modèle entre deux fichiers. Le rechargement en VRAM coûte plusieurs secondes à chaque fois.

#Améliorer la qualité des traductions

Un LLM local traduit bien par défaut, mais quelques réglages font passer le résultat de « correct » à « publiable », surtout sur des textes métier.

  1. 01
    Fournir un glossaire
    Ajoutez au prompt système un lexique des termes métier et de leur traduction imposée (raison sociale, noms de produits, acronymes). Le modèle respectera votre terminologie plutôt que d'inventer.
  2. 02
    Découper intelligemment
    Traduisez par paragraphe ou par section, pas phrase par phrase : le modèle a besoin de contexte pour bien gérer les accords, les reprises pronominales et le registre.
  3. 03
    Donner le contexte du document
    Précisez la nature du texte (« contrat commercial », « notice technique », « email interne ») dans le prompt. Le registre et le vocabulaire s'ajustent en conséquence.
  4. 04
    Relire les passages critiques
    Pour un contrat ou un document légal, une relecture humaine des clauses sensibles reste indispensable — le local vous donne la confidentialité, pas l'infaillibilité.
  5. 05
    Monter en modèle si besoin
    Si la qualité plafonne, passez de 14B à 32B ou 70B. Le gain est net sur les phrases longues et la finesse terminologique.

#Dépannage

Le modèle ajoute des commentaires
Renforcez la consigne « renvoie UNIQUEMENT la traduction » et baissez la température. Certains modèles préfixent « Voici la traduction : » — retirez-le en post-traitement si besoin.
Il traduit dans la mauvaise langue
Nommez explicitement la langue cible dans le prompt et donnez un exemple. Sur un texte court, un modèle peut se tromper de langue.
La mise en forme DOCX saute
C'est le remplacement de para.text qui aplatit les runs. Traduisez run par run pour les documents fortement mis en forme.
Traduction lente sur gros volume
Vérifiez que le modèle tient en VRAM (sinon offload CPU = lenteur). Réduisez la taille du modèle ou utilisez OLLAMA_KEEP_ALIVE.
Blocs de code Markdown traduits
Insistez dans le prompt : « ne traduis pas le contenu des blocs de code ». Sinon, extrayez-les avant traduction et réinjectez-les après.
Contexte trop long tronqué
Un très gros document dépasse la fenêtre de contexte. Découpez-le en sections et traduisez chacune séparément.

#Pour aller plus loin

La traduction IA locale s'appuie sur un socle Ollama bien choisi. Ces guides du site complètent la mise en place :

Installer Ollama
Pour poser le moteur d'inférence si ce n'est pas déjà fait.
Q4, Q5, Q8 : quelle quantification choisir
Pour arbitrer entre qualité de traduction, vitesse et VRAM selon votre GPU.
n8n + Ollama : automatiser avec une IA locale
Pour brancher la traduction dans un workflow no-code (emails entrants, fichiers déposés, etc.).
Ce guide vous a aidé ?

Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.