Jump to content

Aide:Extension:Translate/Mémoires de traduction

From mediawiki.org
This page is a translated version of the page Help:Extension:Translate/Translation memories and the translation is 100% complete.

La mémoire de traduction de l'extension Translate prend en charge ElasticSearch. Cette page a pour objectif de vous guider dans l'installation de ElasticSearch, et d'explorer ses spécifications plus en détail.

A la différence des autres aides à la traduction, par exemple les services de traduction automatique externes, la mémoire de traduction est régulièrement mise à jour grâce aux nouvelles traductions dans votre wiki. La recherche avancée parmi les traductions est également possible sur Special:SearchTranslations si vous choisissez d'utiliser ElasticSearch.

Comparaison

Le serveur de base de données est utilisé par défaut : il ne possède aucune dépendance et ne nécessite pas d'être configuré. Il ne peut pas non plus être partagé entre plusieurs wikis et ne convient pas à de grandes quantités de contenus traduits. C'est pourquoi ElasticSearch est utilisé également en tant que serveur. Il est aussi possible d'utiliser la mémoire de traduction d'un autre wiki si l'API web est ouverte. A la différence de ElasticSearch, les serveurs distants ne sont pas mis à jour avec les traductions à partir du wiki courant.

Base de données API distante ElasticSearch
Permis par défaut oui non non
Peut avoir des sources multiples non oui oui
Mis à jour avec les traductions locales oui non oui
Accède directement à la base de données oui non non
Accéder à la source Éditeur Lien Editeur si le lien est local
Peut être partagé en tant que service API oui oui oui
Performances Ne redimensionne pas correctement Inconnu Raisonnable

Exigences

Serveur ElasticSearch

Il est très facile de configurer ElasticSearch. S'il ne figure pas dans les packages de votre distribution, vous pouvez l'obtenir à partir de leur site web. Il vous faudra aussi l'extension Elastica . Voir en dernier puppet/modules/elasticsearch/files/elasticsearch.yml pour configurer spécifiquement Translate.

Le script de démarrage créera les schémas nécessaires. Si vous utilisez le serveur ElasticSearch avec plusieurs wikis, ils partageront la mémoire de traduction par défaut, à moins que vous ne définissiez le paramètre index dans la configuration.

Lors de la mise à niveau vers la prochaine version majeure de ElasticSearch (par exemple, la mise à jour de la 2.x vers la 5.x), il est fortement recommandé de lire les notes de diffusion et la documentation concernant le processus de mise à niveau.

Installation

Après avoir mis en place les exigences, l'installation vous oblige à mettre à jour la configuration et ensuite à exécuter le bootstrap.

Configuration

Tous les aides à la traduction, y compris les mémoires de traduction, sont paramètrées à l'aide de la variable de configuration $wgTranslateTranslationServices.

Le serveur primaire de la mémoire de traduction doit utiliser la clé TTMServer. Le serveur primaire reçoit les mises à jour de trduction et il est utilisé par Special:SearchTranslations.

Exemple de configuration de TTMServers :

Configuration TTMServer par défaut
$wgTranslateTranslationServices['TTMServer'] = array(
        'database' => false, // passé à wfGetDB
        'cutoff' => 0.75,
        'type' => 'ttmserver',
        'public' => false,
);
Configuraion de l'API distante
$wgTranslateTranslationServices['example'] = array(
        'url' => 'http://example.com/w/api.php',
        'displayname' => 'example.com',
        'cutoff' => 0.75,
        'timeout' => 3,
        'type' => 'ttmserver',
        'class' => 'RemoteTTMServer',
);
Configuration du serveur ElasticSearch
Dans ce cas, le service unique du serveur sera utilisé à la fois pour lire et écrire.
$wgTranslateTranslationServices['TTMServer'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * voir http://elastica.io/getting-started/installation.html
         * voir https://github.com/ruflin/Elastica/blob/8.x/src/Client.php
        'config' => cela sera transmis à \Elastica\Client
         */
);
Configuration à plusieurs serveurs ElasticSearch (supporté dans MLEB 2017.04, abandonné dans MLEB 2023.10)
// définit le service par défaut utilisé pour les opérations de lecture
// permet de passer rapidement à un autre serveur
// l'option de configuration 'mirrors' n'est plus reconnue depuis MLEB 2023.10
$wgTranslateTranslationDefaultService = 'cluster1';
$wgTranslateTranslationServices['cluster1'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * définit la liste des services sur lesquels répliquer l'écriture.
         * seuls les services accessibles en écriture sont autorisés ici.
         */
        'mirrors' => [ 'cluster2' ],
        'config' => [ 'servers' => [ 'host' => 'elastic1001.cluster1.mynet' ] ]
);
$wgTranslateTranslationServices['cluster2'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * si 'cluster2' est défini comme service par défaut, il commencera à se répliquer les écritures sur 'cluster1'.
         */
        'mirrors' => [ 'cluster1' ],
        'config' => [ 'servers' => [ 'host' => 'elastic2001.cluster2.mynet' ] ]
);
Plusieurs services ElasticSearch avec un service unique de lecture utilisant la configuration writable (supporté par MLEB 2023.04)
Avec la configuration writable les règles suivantes sont renforcées :
  • Si writable est spécifié, les services marqués comme writable sont considérés en écriture uniquement et les autres sont considérés en lecture uniquement.
  • Si aucun service n'est spécifié par writable, les services sont considérés comme étant en lecture et en écriture.
  • Le service par défaut doit toujours être accessible en lecture.

Si un service est marqué en écriture, la configuration des sites miroir ne sera pas autorisée.

// trois services configurés, l'un étant en lecture et les autres en écriture.
$wgTranslateTranslationServices['dc0'] = [
	'type' => 'ttmserver',
	'class' => 'ElasticSearchTTMServer',
	'cutoff' => 0.75,
	// le service par défaut ne peut pas être marqué en écriture uniquement
];

$wgTranslateTranslationServices['dc1'] = [
	'type' => 'ttmserver',
	'class' => 'ElasticSearchTTMServer',
	'cutoff' => 0.75,
	// marque ce service en écriture seulement 
	'writable' => true,
];

$wgTranslateTranslationServices['dc2'] = [
	'type' => 'ttmserver',
	'class' => 'ElasticSearchTTMServer',
	'cutoff' => 0.75,
	'writable' => true
];

$wgTranslateTranslationDefaultService = 'dc0';

Clés et valeurs possibles :

Clé S'applique à Description
config ElasticSearch Configuration passée à Elastica.
cutoff tout Seuil minimum pour qu'une suggestion corresponde. Seules quelques meilleures suggestions sont présentées, même si elles dépassent ce seuil.
database Local Si vous souhaitez stocker la mémoire de traduction à un autre endroit, vous pouvez spécifier ici, le nom de la base de données. Vous devez également configurer le partage de charge de Mediawiki pour savoir comment vous connecter à cette base de données.
displayname Distant Texte affiché dans les infobulles lors du survol du lien source de suggestion (les puces) par la souris.
index ElasticSearch Index à utiliser dans ElasticSearch. Par défaut : ttmserver.
public tout Indique si ce TTMServer peut être interrogé via api.php de ce wiki.
replicas ElasticSearch Si vous exécutez une grappe, vous pouvez augmenter le nombre de réplicats. Par défaut : 0.
shards ElasticSearch Nombre de morceaux à utiliser. Par défaut : 5.
timeout Distant Temps d'attente maximum (en secondes) de la réponse du service distant.
type tout Type de TTMServer en termes de format de résultats.
url Distant URL de api.php du TTMServer distant.
use_wikimedia_extra ElasticSearch Booléen, lorsque le greffon supplémentaire est déployé, vous pouvez désactiver l'écriture dynamique sur Elastic v1.x. Ce greffon est désormais obligatoire avec les grappes Elastic 2.x.
mirrors (DEPRECATED Since MLEB 2023.04) Services en écriture Tableau de chaînes, définit la liste des services qui répliquent les écritures, il permet de garder plusieurs services TTM à jour. Utilisé pour les basculements rapides ou pour réduire les temps d'arrêt pendant les opérations de maintenance prévues (ajouté dans MLEB 2017.04). Ne peut pas être utilisé en même temps que le nouveau paramètre ajouté writable.
writable (Added in MLEB 2023.04) Services en écriture uniquement Valeur booléenne, définie pour un service si ce service est en écriture uniquement. Le service par défaut (wgTranslateTranslationDefaultService) ne peut pas être marqué en écriture uniquement. Si tous les services de mémoire de traduction sont configurés et qu'aucun n'est marqué comme writable, alors ils sont considérés comme étant en lecture et en écriture. Voir T322284
Vous devez utiliser la clé TTMServer comme index de tableau pour $wgTranslateTranslationServices si vous voulez que la mémoire de traduction soit mise à jour avec de nouvelles traductions. Les TTMServers distants ne peuvent pas être utilisés à cet effet, car ils ne peuvent pas être mis à jour. Depuis MLEB 2017.04 la clé TTMServer peut être configurée par la variable de configuration $wgTranslateTranslationDefaultService. Le support du serveur Solr a été abandonné dans MLEB-2019.10 en octobre 2019.

Actuellement seul MySQL est pris en charge comme serveur de base de données.

Bootstrap

Une fois que vous avez choisi ElasticSearch et que vous avez configuré les exigences et les paramètres, exécutez ttmserver-export.php pour démarrer la mémoire de traduction. Le redémarrage est aussi nécessaire si vous changez le serveur de mémoire de traduction. Si vous utilisez un serveur de mémoire de traduction partagée avec plusieurs wikis, vous devrez les démarrer chacun séparément.

Les sites avec beaucoup de traductions doivent envisager d'utiliser plusieurs threads avec le paramètre --thread pour accélérer le processus. Le temps dépend en grande partie de la taille complète des statistiques de finalisation des groupes de messages (les statistiques incomplètes seront calculées durant le démarrage). Les nouvellles traductions sont automatiquement ajoutées à l'aide d'une accroche. De nouvelles sources (définitions de messages) sont ajoutées lorsque la première traduction est créée.

Le bootstrap fait les choses suivantes, qui ne se produisent pas autrement:

  • il ajoute et met à jour le schéma de la mémoire de traduction
  • il remplit la mémoire de traduction avec les traductions existantes
  • il nettoie les entrées de traduction non utilisées en vidant et en repeuplant la mémoire de traduction.

Lorsque la traduction d'un message est mise à jour, la traduction précédente est supprimée de la mémoire de traduction. Toutefois, lorsque les traductions sont mises à jour par rapport à une nouvelle définition, une nouvelle entrée est ajoutée, mais l'ancienne définition et ses anciennes traductions restent dans la base de données jusqu'à ce qu'elles soient purgées. Lorsqu'un message change de définition ou est supprimé de tous les groupes de messages, rien ne se passe immédiatement. En enregistrant une traduction comme floue (fuzzy), on n'ajoute pas de nouvelle traduction ni n'effaçons l'ancienne traduction dans la mémoire de traduction.

API TTMServer

Si vous souhaitez implémenter votre propre service TTMServer , voici les spécifications.

Paramètres de la requête :

Votre service doit accepter les paramètres suivants :

Clé Valeur
format json
action ttmserver
service Identifiant du service facultatif quand il y a plusieurs mémoires de traductions partagées. S'il n'est pas fourni, le service par défaut est utilisé.
sourcelanguage Code de langue tel qu'il est utilisé dans MediaWiki, voir les balises de langue IETF et ISO693?
targetlanguage Code de langue tel qu'il est utilisé dans MediaWiki, voir les balises de langue IETF et ISO693?
test Texte source dans la langue source

Votre service doit fournir un objet JSON qui possède la clé ttmserver avec un tableau d'objets. Ces objets doivent contenir les données suivantes :

Clé Valeur
source Texte source original.
target Suggestion de la traduction.
context Identifiant local de la source, facultatif.
location URL de la page où la suggestion est utilisée.
quality Nombre décimal dans l'intervalle [0..1] décrivant la qualité de la suggestion. 1 signifie que la correspondance est parfaite.

Exemple :

{
        "ttmserver": [
                {
                        "source": "January",
                        "target": "tammikuu",
                        "context": "Wikimedia:Messages\\x5b'January'\\x5d\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/Wikimedia:Messages%5Cx5b%27January%27%5Cx5d\/fi",
                        "quality": 0.85714285714286
                },
                {
                        "source": "January",
                        "target": "tammikuu",
                        "context": "Mantis:S month january\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/Mantis:S_month_january\/fi",
                        "quality": 0.85714285714286
                },
                {
                        "source": "January",
                        "target": "Tammikuu",
                        "context": "FUDforum:Month 1\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/FUDforum:Month_1\/fi",
                        "quality": 0.85714285714286
                },
                {
                        "source": "January",
                        "target": "tammikuun",
                        "context": "MediaWiki:January-gen\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/MediaWiki:January-gen\/fi",
                        "quality": 0.85714285714286
                },
                {
                        "source": "January",
                        "target": "tammikuu",
                        "context": "MediaWiki:January\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/MediaWiki:January\/fi",
                        "quality": 0.85714285714286
                }
        ]
}

Base de données arrière

Le serveur comprend trois tables : translate_tms, translate_tmt et translate_tmf. Elles correspondent respectivement aux sources, aux cibles, et au texte complet. Vous trouverez les définitions du tableau dans sql/translate_tm.sql. Les sources contiennent toutes les définitions des messages. Même si, habituellement, elles sont toujours dans la même langue, par exemple l'anglais, la langue du texte est également stockée dans les rares cas où cela n'est pas à true.

Chaque entrée a un identifiant unique et deux champs supplémentaires, la longueur (length) et le contexte (context). La longueur est utilisée comme premier filtre de passage, afin que lors de la requête nous n'ayons pas besoin de comparer le texte que nous recherchons avec chaque entrée dans la base de données. Le contexte stocke le titre de la page d'où vient le texte, par exemple MediaWiki:Jan/en. À partir de ces informations, nous pouvons relier les suggestions à MediaWiki:Jan/de, ce qui permet aux traducteurs de corriger rapidement les choses, ou simplement de déterminer où ce type de traduction a été utilisé.

La seconde passe du filtrage vient de la recherche dans le texte complet. Les définitions sont mélées à l'aide d'un algorithme ad hoc. Le texte est d'abord découpé en segments (mots) par Language::segmentByWord de MediaWiki. Si il y a suffisamment de segments, nous supprimons essentiellement tout ce qui n'est pas une lettre de mot et normalisons la casse. Ensuite, nous prenons les dix premiers mots uniques, qui ont au moins 5 octets de long (5 lettres en anglais, mais des mots encore plus courts pour les langues ayant des points de code multi-octets). Ces mots sont ensuite stockés dans l'index du texte complet pour le filtrage ultérieur de chaînes plus longues.

Quand la liste des candidats est filtrée, nous récupérons les cibles correspondantes à partir de la table des cibles. Puis nous appliquons l'algorithme de la distance de Levenshtein pour réaliser le dernier filtrage et le classement. Déclarons par exemple :

E
modifier la distance
S
le texte pour lequel nous recherchons des suggestions
Tc
le texte suggéré
To
le texte original dont Tc est la traduction

La qualité de la suggestion Tc est calculée par E/min(length(Tc),length(To)) . Selon la longueur des chaînes, nous utilisons : soit la fonction native levenshtein de PHP, ou si l'une des chaînes est plus longue que 255 octets, l'implémentation PHP de l'algorithme levenshtein. Nous n'avons pas testé si la mise en œuvre native de levenshtein traite correctement les caractères multi-octets. Ce pourrait être un autre point faible lorsque la langue source n'est pas l'anglais (les autres étant la recherche du texte complet et la segmentation).