# Structurer une mémoire de traduction interne dans une table de segments

> Une architecture de table dédiée aux segments de texte déjà traduits, pensée pour être réutilisée entre plusieurs contenus d'un site maison sans extension de traduction.

- Auteur : WordPress Développement
- Publié le : 2022-12-04
- Mis à jour le : 2022-12-04
- Catégorie : Multilingue
- URL : https://www.wpmoderne.fr/multilingue/structurer-memoire-traduction-table-segments/

## L’essentiel

- Une table de segments évite de retraduire deux fois la même phrase
- Un hash du texte source sert de clé de recherche rapide
- La réutilisation ne doit jamais être automatique sans relecture

Quatre-vingts pour cent d'un catalogue de fiches techniques partage les mêmes tournures : mentions de garantie, consignes de sécurité, formules de livraison. Sans mémoire de traduction, chacune de ces phrases identiques ou quasi identiques se retraduit indépendamment, article après article, au prix d'un temps et d'une cohérence terminologique qui se dégradent avec le volume.

Cette architecture décrit une table dédiée aux segments de texte déjà traduits, pensée pour un site qui gère sa traduction en interne, sans extension comme WPML ou Polylang, et qui souhaite réutiliser le travail déjà fait plutôt que de payer plusieurs fois pour la même phrase.

## Le principe : séparer les segments du contenu qui les utilise

Une mémoire de traduction ne stocke pas des articles entiers, mais des segments : des unités de texte de taille variable, de la phrase courte au paragraphe, associées à leur traduction validée dans une ou plusieurs langues cibles. Un même segment peut apparaître dans des dizaines de fiches produit différentes ; il n'est traduit qu'une seule fois, puis réutilisé partout où il réapparaît à l'identique ou à une variante proche.

## Le schéma de la table

La table est créée via `dbDelta()`, la fonction WordPress recommandée pour créer ou modifier des tables personnalisées de façon idempotente lors de l'activation d'une extension maison.

> L'essentiel à retenir : Une table de segments évite de retraduire deux fois la même phrase ; Un hash du texte source sert de clé de recherche rapide ; La réutilisation ne doit jamais être automatique sans relecture

```
global $wpdb;
$table_name      = $wpdb->prefix . 'memoire_traduction';
$charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE {$table_name} (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    texte_source LONGTEXT NOT NULL,
    hash_source CHAR(32) NOT NULL,
    langue_cible VARCHAR(10) NOT NULL,
    texte_traduit LONGTEXT NOT NULL,
    statut VARCHAR(20) NOT NULL DEFAULT 'valide',
    date_maj DATETIME NOT NULL,
    PRIMARY KEY  (id),
    KEY hash_langue (hash_source, langue_cible)
) {$charset_collate};";

require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta( $sql );
```

Le champ `hash_source`, un condensé MD5 du texte source normalisé (espaces superflus supprimés, casse harmonisée), sert de clé de recherche rapide : plutôt que de comparer des chaînes de caractères potentiellement longues directement dans une clause `WHERE`, la recherche s'effectue sur un index de trente-deux caractères fixes, nettement plus performant à grande échelle.

## La fonction de recherche d'un segment existant

```
function chercher_segment_traduit( $texte_source, $langue_cible ) {
    global $wpdb;
    $table = $wpdb->prefix . 'memoire_traduction';
    $hash  = md5( trim( preg_replace( '/\s+/', ' ', $texte_source ) ) );

    return $wpdb->get_var( $wpdb->prepare(
        "SELECT texte_traduit FROM {$table}
         WHERE hash_source = %s AND langue_cible = %s AND statut = 'valide'
         LIMIT 1",
        $hash,
        $langue_cible
    ) );
}
```

Cette fonction est appelée avant d'envoyer un segment à la traduction humaine ou automatique : si un segment identique existe déjà en mémoire pour la langue cible, sa traduction est proposée directement au traducteur pour validation, plutôt que redemandée depuis zéro.

## Pourquoi la réutilisation ne doit jamais être totalement automatique

Un segment identique au niveau du texte source ne signifie pas toujours un contexte identique : une même phrase peut avoir un sens différent selon la fiche produit qui l'entoure, en particulier pour des termes courts ou ambigus. La conception retenue affiche systématiquement la traduction mémorisée comme suggestion préremplie, jamais comme validation automatique, avec un statut distinct entre `propose` et `valide` dans la colonne `statut`.

> Une mémoire de traduction accélère le travail humain, elle ne le remplace pas : chaque réutilisation reste un point de vigilance, pas un acquis définitif.

## Gérer les variantes proches, pas seulement les doublons exacts

Le hash exact ne capture que les doublons stricts. Pour repérer des segments proches mais non identiques (une variation de nombre ou de nom de produit dans une phrase par ailleurs commune), une approche complémentaire consiste à découper le texte source en un gabarit avec des espaces réservés avant de calculer le hash, sur le modèle de ce que ferait un moteur de gabarits :

```
$gabarit = preg_replace( '/\d+/', '{n}', $texte_source );
$hash_gabarit = md5( trim( $gabarit ) );
```

Une seconde colonne `hash_gabarit`, indexée séparément, permet alors de retrouver des segments structurellement identiques malgré des valeurs numériques différentes, sans confondre pour autant deux phrases dont seul le sens diffère.

## En résumé

Une table de segments, même simple, change la donne dès qu'un catalogue dépasse quelques dizaines de fiches partageant du vocabulaire commun : elle transforme un travail de traduction répétitif en un travail de validation, plus rapide et plus cohérent. L'essentiel tient dans deux garde-fous : indexer par condensé pour la performance, et ne jamais transformer une suggestion mémorisée en traduction validée sans un regard humain.
