Help:Extensie:Translate/Translation memories

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

De Translate extensie translation memory ondersteunt ElasticSearch. Het doel van deze pagina is het helpen bij de installatie van ElasticSearch, en de specificaties gedetailleerd te beschrijven.

Anders dan andere hulpmiddelen voor vertalen, bijvoorbeeld externe machine vertaal services, wordt het vertaalgeheugen steeds bijgewerkt door nieuwe vertalingen in uw wiki. Geavanceerde zoeken in vertalingen is ook beschikbaar via Special:SearchTranslations als u er voor kiest om ElasticSearch te gebruiken.

Vergelijken

De database backend wordt standaard gebruikt: het heeft geen afhankelijkheden en heeft geen configuratie nodig. De database backend kan niet worden gedeeld door meerdere wiki's en het schaalt niet bij grote hoeveelheden vertaalde tekst. Vandaar dat wij ook ElasticSearch als backend ondersteunen. Het is ook mogelijk om ander vertaalgeheugens te gebruiken als hun web API open is. Anders dan ElasticSearch worden remote backends niet bijgewerkt met vertalingen in de huidige wiki.

Database API op afstand ElasticSearch
Standaard ingeschakeld Ja Nee Nee
Kan meerdere bronnen hebben Nee Ja Ja
Bijgewerkt met lokale vertalingen Ja Nee Ja
Heeft directe toegang tot de database Ja Nee Nee
Toegang tot bron Tekstverwerker Link Tekstverwerker indien lokaal of link
Kan gedeeld worden als een API-service Ja Ja Ja
Performance Schaalt niet erg goed Onbekend Redelijk

Vereisten

ElasticSearch backend

ElasticSearch is relatief gemakkelijk te configureren. Als het niet in uw distributie package zit, kunt u het downloaden van hun website. U moet dan ook de Elastica extensie downloaden. Lees eerst puppet/modules/elasticsearch/files/elasticsearch.yml voor de specifieke configuratie die nodig is voor Translate.

Het script bootstrap smaakt de benodigde schema's. Als u de ElasticSearch backend gebruikt met meerdere wiki's, zullen ze standaard het vertaalgeheugen delen, tenzij u de configuratie parameter index gebruikt.

Bij een upgrade naar een volgende hoofdversie van ElasticSearch (het eerste nummer wordt dan gewijzigd), bevelen wij aan om de notities bij de release te lezen en de documentatie over het upgraden.

Installatie

Na het zorgen dat aan de vereisten is voldaan, is het nodig om de configuratie van de installatie aan te passen en daarna de bootstrap uit te voeren.

Configuratie

Alle hulpmiddelen voor vertalen inclusief vertaalgeheugen worden ingesteld met de instelling $wgTranslateTranslationServices.

Het primaire vertaalgeheugen backend moet de key TTMServer gebruiken. De primaire backend ontvangt bijgewerkte vertalingen en wordt gebruikt door Special:SearchTranslations.

Voorbeeld van configuratie TTMServers:

Standaard configuratie
$wgTranslateTranslationServices['TTMServer'] = array(
        'database' => false, // Passed to wfGetDB
        'cutoff' => 0.75,
        'type' => 'ttmserver',
        'public' => false,
);
Remote API configuratie
$wgTranslateTranslationServices['example'] = array(
        'url' => 'http://example.com/w/api.php',
        'displayname' => 'example.com',
        'cutoff' => 0.75,
        'timeout' => 3,
        'type' => 'ttmserver',
        'class' => 'RemoteTTMServer',
);
ElasticSearch backend configuratie
In dit geval wordt de enkele back-end service zowel voor lezen als schrijven gebruikt.
$wgTranslateTranslationServices['TTMServer'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * See http://elastica.io/getting-started/installation.html
         * See https://github.com/ruflin/Elastica/blob/8.x/src/Client.php
        'config' => This will be passed to \Elastica\Client
         */
);
ElasticSearch meervoudige backends configuratie. Wordt sinds oktober 2023 niet meer ondersteunɖ.
// Definieert de standaard service voor lees-opdrachten
// Staat toe dat snel van backend wordt gewisseld
// De optie 'mirrors' wordt sinds MLEB 2023.10 niet meer ondersteund.
$wgTranslateTranslationDefaultService = 'cluster1';
$wgTranslateTranslationServices['cluster1'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * Definieert de lijst services waar de schrijfopdrachten ook aan worden doorgegeven.
         * Alleen "writable" services zijn hier toegestaan.
         */
        'mirrors' => [ 'cluster2' ],
        'config' => [ 'servers' => [ 'host' => 'elastic1001.cluster1.mynet' ] ]
);
$wgTranslateTranslationServices['cluster2'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * als "cluster2" is gedefinieerd als de standaardservice zal het beginnen met schrijfopdrachten ook door te geven aan "cluster1".
         */
        'mirrors' => [ 'cluster1' ],
        'config' => [ 'servers' => [ 'host' => 'elastic2001.cluster2.mynet' ] ]
);
ElasticSearch meerdere services met één leesbare service met behulp van writable-configuratie (ondersteund door MLEB 2023.04)
Bij configuratie writable worden de volgende regels afgedwongen:
  • Als writable is opgegeven, worden services die zijn gemarkeerd als writable beschouwd als alleen-schrijven en andere als alleen-lezen.
  • Als er geen service is opgegeven als writable, worden services als zowel leesbaar als beschrijfbaar beschouwd.
  • De standaardservice moet altijd leesbaar zijn.

Als een service is gemarkeerd als beschrijfbaar, is de mirrorconfiguratie niet toegestaan.

// Drie services geconfigureerd waarbij de ene leesbaar is en de andere beschrijfbaar.
$wgTranslateTranslationServices['dc0'] = [
	'type' => 'ttmserver',
	'class' => 'ElasticSearchTTMServer',
	'cutoff' => 0.75,
	// Standaardservice kan niet alleen-schrijven zijn
];

$wgTranslateTranslationServices['dc1'] = [
	'type' => 'ttmserver',
	'class' => 'ElasticSearchTTMServer',
	'cutoff' => 0.75,
	// Maak deze service alleen-schrijven 
	'writable' => true,
];

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

$wgTranslateTranslationDefaultService = 'dc0';

Mogelijke sleutels en waarden zijn:

Sleutel Van toepassing op Beschrijving
config ElasticSearch Configuratie doorgegeven aan Elastica.
cutoff Alle Minimumwaarde voor het van toepassing zijn van een suggestie. Alleen de beste suggesties worden weergegeven, zelfs als er meer boven de drempelwaarde zijn.
database Lokaal Als u het vertaalgeheugen op een andere plaats wilt opslaan, kunt u hier de databasenaam opgeven. Als u een loadbalancer gebruikt, moet u die ook aangeven met welke database verbinding moet worden gemaakt.
displayname Op afstand De tekst die wordt weergegeven in de tooltip als de muisaanwijzer bovenop de verwijzing staat (de "bullets").
index ElasticSearch De index die in ElasticSearch gebruikt moet worden. Standaard: ttmserver.
public Alle Of deze TTMServer geraadpleegd kan worden via api.php van deze wiki.
replicas ElasticSearch Als u een cluster uitvoert, dan kunt u het aantal replica's verhogen. Standaardwaarde is: 0.
shards ElasticSearch Hoe veel te gebruiken delen. Standaardwaarde: 5.
timeout Op afstand Hoeveel seconden wachten op een antwoord van een remote service.
type Alle Type TTMServer wat betreft resultaatopmaak.
url Op afstand URL naar api.php voor de TTMServer op afstand.
use_wikimedia_extra ElasticSearch Boolean, als de extra plugin is geïmplementeerd kunt u dynamische scripting op Elastic v1.x uitzetten. Deze plugin is nu verplicht bij Elastic 2.x clusters.
mirrors (DEPRECATED Since MLEB 2023.04) Schrijfbare services Array van strings, definieert de lijst services waar schrijfopdrachten naar toe moeten, het staat toe dat meerdere TTM services actueel gehouden kunnen worden. Bruikbaar voor het snel wisselen om de tijd van storingen te verkorten of om gepland onderhoud te kunnen doen (toegevoegd in MLEB 2017.04) Kan niet worden gebruikt samen met de nieuw toegevoegde configuratie writable.
writable (Added in MLEB 2023.04) Alleen-schrijven services Booleaanse waarde, gedefinieerd voor een service als die service alleen-schrijven is. De standaardservice kan niet alleen-schrijven zijn Als van alle geconfigureerde vertaalgeheugenservices er geen enkele is gemarkeerd als writable, worden alle services als leesbaar en beschrijfbaar beschouwd. Zie taak T322284
De sleutel TTMServer moet als array index worden gebruikt voor $wgTranslateTranslationServices als u het vertaalgeheugen wilt bijwerken met nieuwe vertalingen. Dit updaten is niet mogelijk bij remote TTMServers. Vanaf MLEB 2017.04 kan de sleutel TTMServer worden ingesteld met de configuratie variabele $wgTranslateTranslationDefaultService. Ondersteuning voor backend Solr is in MLEB-2019.10 (oktober 2019) vervallen.

Op dit moment wordt alleen MySQL als database backend ondersteund.

Bootstrap

Na het kiezen van ElasticSearch en het instellen van de vereisten en de configuratie, voer ttmserver-export.php uit om het vertaalgeheugen te 'bootstrappen'. Dit bootstrappen is ook nodig wanneer het vertaalgeheugen wordt gewijzigd. Als u het vertaalgeheugen met meerdere wiki's deelt, dan is de bootstrap voor elk van deze wiki's nodig.

Websites met veel vertalingen moeten overwegen meerdere threads hier voor te gebruiken met de parameter --thread om het proces te versnellen. De benodigde tijd hangt af van van hoe compleet de vertaling is (niet complete berichtengroepen worden bij de bootstrap bepaald). Nieuwe vertalingen worden automatisch met behulp van een hook toegevoegd. Nieuwe berichtdefinities worden toegevoegd nadat de eerste vertaling is aangemaakt.

Bij een bootstrap worden de volgende zaken gedaan, deze zouden anders niet gebeuren:

  • toevoegen en bijwerken van het vertaalgeheugenschema;
  • vullen van vertaalgeheugen met bestaande vertalingen;
  • opschonen van ongebruikte vertalingen door het legen en weer vullen van het vertaalgeheugen.

Bij het bijwerken van een vertaling wordt de vorige vertaling uit het vertaalgeheugen gewist. Als de vertaling bij een nieuwe definitie wordt bijgewerkt dan wordt de nieuwe vertaling toegevoegd in het vertaalgeheugen en blijft de oude bestaan tot de 'purge'. Als de definitie van het bericht zelf wordt gewijzigd of wordt verwijderd uit alle berichtengroepen, dan gebeurt er voorlopig niets. Het opslaan van een vertaling als 'fuzzy' voegt geen vertaling toe en verwijdert er ook geen in het vertaalgeheugen.

TTMServer API

Nu volgen de specificaties voor het geval u zelf een eigen TTMServer service wilt implementeren.

Query parameters:

Uw service dient de volgende parameters te accepteren:

Sleutel Waarde
format json
action ttmserver
service Optionele identifier als er meerdere gedeelde vertaalgeheugens zijn. Indien niet meegegeven wordt er aangenomen dat het de standaard service betreft.
sourcelanguage Taalcode zoals in MediaWiki wordt gebruikt, zie IETF language tags en ISO693?
targetlanguage Taalcode zoals in MediaWiki wordt gebruikt, zie IETF language tags en ISO693?
test Brontekst in brontaal

Uw service moet een JSON object meegeven dat de sleutel ttmserver bevat met een array objecten. Deze objecten bevatten de volgende gegevens:

Sleutel Waarde
source Oorspronkelijke brontekst.
target Vertaalsuggestie.
context Locale ID voor de bron (optioneel).
location URL naar de pagina waar de suggestie gebruikt wordt.
quality Decimaal getal in de reeks [0..1] die de kwaliteit van de suggestie beschrijft. 1 betekent een perfecte overeenkomst.

Voorbeeld:

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

Database backend

De backend bevat drie tabellen: translate_tms, translate_tmt en translate_tmf. Deze staan voor de bronnen, doelen en de 'fulltext'. De tabel definities staan in in sql/translate_tm.sql. De bronnen bevatten alle berichtdefinities. Ook al zijn ze altijd in dezelfde taal, meestal Engels, toch wordt de taal van de tekst toch opgeslagen, meestal is niet altijd.

Elke record heeft een uniek id en twee extra velden, 'length' en 'context'. De eerste wordt gebruikt als eerste uitvoerfilter, zodat er bij het zoeken er niet meer met de tekst die we zoeken hoeft te worden vergeleken. De context bevat de titel van de pagina waar de tekst op staat, bijvoorbeeld MediaWiki:Jan/en. Met deze informatie kunnen we de suggesties koppelen aan MediaWiki:Jan/de, hierdoor kunnen vertalers snel dingen aanpassen of bepalen welk soort vertaling is gebruikt.

Het tweede filter is het 'fulltext' zoeken. De definities zijn gemengd met een ad hoc algoritme. Eerst wordt de tekst opgedeeld in segmenten (woorden) met MediaWiki's Language::segmentByWord. Als er genoeg segmenten zijn dan wordt alles verwijderd dat geen letters zijn en wordt de tekst in hoofdletters genormaliseerd. Daarna worden de eerste tien unieke worden gepakt van minstens 5 bytes lang (in het Engels is dat 5 letters, in talen met multibytes kan dat nog korter zijn). Deze woorden worden gebruikt als 'fulltext index' voor het filteren op langere teksten.

Na het filteren van de kandidaten, worden de overeenkomende doelen opgehaald uit die tabel. Daarna wordt het Levenshteinafstand algoritme gebruikt om de laatste filtering en sortering te doen. Definiëren:

E
bewerkingsafstand
S
de tekst waar we suggesties voor zoeken
Tc
de suggestie
To
de originele tekst waarvan Tc dus een vertaling is

De kwaliteit van de suggestie Tc wordt bepaald met E/min(lengte(Tc),lengte(To)). Afhankelijk van de lengte van de teksten kunnen we of de interne PHP levenshtein functie gebruiken of als beide strings langer zijn dan 255 bytes, de PHP implementatie van het levenshtein algoritme.[1] Er is niet getest of de interne implementatie van levenshtein multibyte tekens goed afgehandeld. Dit kan een zwak punt zijn als de brontaal niet Engels is (de andere zijn het fulltext zoeken en de segmentatie).