Translation Comparison

Compare OpenAI and DeepL translations side by side

Prompt OpenAI

Prompt de Relecture GPT

OpenAI GPT-4.1 Mini
Translation will appear here...
Cost will appear after translation
DeepL
Translation will appear here...
Cost will appear after translation
DeepL + GPT-4.1 Mini (sans TEXT TO TRANSLATE)
Translation will appear here...
Cost will appear after translation
DeepL + GPT-4.1 Mini (avec TEXT TO TRANSLATE)
Translation will appear here...
Cost will appear after translation

Preprocessing HTML pour DeepL (source FR)

Ces deux fonctions corrigent le HTML avant envoi à DeepL en mode tag_handling: "html". Elles traitent : les  , les espaces autour des balises fermantes inline, et l'expansion des élisions françaises (d', l', c', etc.) qui posent problème à DeepL quand elles sont collées à des balises HTML.

/**
 * normalizeSpacesAroundClosingTags(html)
 *
 * 1) Remplace tous les   par des espaces normaux
 * 2) Déplace les espaces de l'intérieur vers l'extérieur des balises fermantes inline
 *    Ex: "mot </b>suite" → "mot</b> suite"
 * 3) Assure un espace après une balise fermante collée au texte suivant
 *    Ex: "</font>sciatique" → "</font> sciatique"
 */
function normalizeSpacesAroundClosingTags(html) {
    const inlineTags = '(?:b|strong|em|i|u|s|font|span|a|mark|sub|sup|small|big|strike|del|ins)';

    // Étape 1 : remplacer tous les &nbsp; par des espaces normaux
    let result = html.replace(/&nbsp;/gi, ' ');

    // Étape 2 : espace(s) avant balise fermante inline → déplacer après
    result = result.replace(
        new RegExp(`(\\s+)(<\\/${inlineTags}>)`, 'gi'),
        '$2$1'
    );

    // Étape 3 : balise fermante inline collée à un caractère non-espace → insérer espace
    result = result.replace(
        new RegExp(`(<\\/${inlineTags}>)([^\\s<&])`, 'gi'),
        '$1 $2'
    );

    return result;
}

/**
 * expandFrenchElisions(html)
 *
 * Expanse les élisions françaises pour éviter les problèmes DeepL en mode HTML.
 * Ex: d'exécuter → de exécuter, l'épaule → le épaule
 * Ex: d'<b>exécuter → de <b>exécuter
 * Exception : aujourd'hui n'est PAS expansé.
 */
function expandFrenchElisions(html) {
    const elisionMap = {
        'aujourd': 'aujourd',  // aujourd'hui : ne PAS expanser
        'jusqu':   'jusque',
        'lorsqu':  'lorsque',
        'puisqu':  'puisque',
        'quelqu':  'quelque',
        'qu':      'que',
        'c':       'ce',
        'd':       'de',
        'j':       'je',
        'l':       'le',
        'm':       'me',
        'n':       'ne',
        's':       'se',
        't':       'te',
    };

    const keys = Object.keys(elisionMap).join('|');
    const regex = new RegExp(`(${keys})(['\u2019])`, 'gi');

    return html.replace(regex, (match, prefix, apostrophe) => {
        const lower = prefix.toLowerCase();
        const expansion = elisionMap[lower];
        if (!expansion || expansion === lower) {
            return match;
        }
        const isUpper = prefix[0] === prefix[0].toUpperCase();
        const expanded = isUpper
            ? expansion[0].toUpperCase() + expansion.slice(1)
            : expansion;
        return expanded + ' ';
    });
}

/**
 * Usage (server-side, uniquement si sourceLang === 'fr') :
 *
 * let deeplText = rawHtml;
 * deeplText = normalizeSpacesAroundClosingTags(deeplText);
 * deeplText = expandFrenchElisions(deeplText);
 * // Envoyer deeplText à DeepL avec tag_handling: "html"
 */