Aller au contenu

XLIFF

phil/translation-memory

Les segments partent vers un outil de traduction dans un fichier XLIFF et en reviennent.

Exportation : XLIFF 2.1

$file = XliffFile::fromSegments('page:42', LanguageTag::of('en'), LanguageTag::of('fr'), $segments);
$xml = new XliffWriter()->write($file);
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.1" srcLang="en" trgLang="fr">
  <file id="f1" original="page:42">
    <unit id="u1" name="b1/text">
      <originalData><data id="d1">&lt;b&gt;</data><data id="d2">&lt;/b&gt;</data></originalData>
      <segment state="translated">
        <source>A <ph id="1" dataRef="d1"/>bold<ph id="2" dataRef="d2"/> word</source>
        <target>Un mot <ph id="1" dataRef="d1"/>gras<ph id="2" dataRef="d2"/></target>
      </segment>
    </unit>
  </file>
</xliff>

(Le rédacteur ne met aucune espace entre les éléments ; elles sont ajoutées ici pour la lecture.)

  • Une unité par segment, identifiée u1, u2… (les identifiants XLIFF sont des jetons, les clés n'en sont pas) et nommée d'après la clé.
  • Les balises deviennent des codes <ph> dont le HTML se trouve dans le <originalData> de l'unité : un outil de traduction les affiche comme des codes à placer. Une balise de la cible que la source contient prend le même code.
  • Le texte est écrit comme du texte : &amp; dans la source est & dans le fichier, échappé par le XML.
SegmentstatesubState
non traduitinitial—
proposéinitialphil:suggested
traduittranslated—
réviséreviewed—
périméinitialphil:stale, et la source antérieure dans <note category="phil:previous-source">

Importation : XLIFF 2.x et 1.2

$file = new XliffReader()->read($xml);
$result = XliffMerge::merge($segments, $file, LanguageTag::of('en'), LanguageTag::of('fr'));

XliffReader lit le XLIFF 2.0, 2.1 et 2.2 (espace de noms urn:oasis:names:tc:xliff:document:2.0) et le XLIFF 1.2 (espace de noms urn:oasis:names:tc:xliff:document:1.2). Un fichier qui déclare un type de document est refusé avant d'être analysé ; rien n'est récupéré sur le réseau.

XLIFF 2.xXLIFF 1.2
Cléname, sinon id de l'unitéresname, sinon id du trans-unit
LanguessrcLang, trgLang de la racinesource-language, target-language du premier <file>
Codes reconvertis en HTML<ph>, <sc>, <ec> par dataRef ; <pc> par dataRefStart et dataRefEnd ; <cp> comme son caractèreLe code natif à l'intérieur de <ph>, <bpt>, <ept>, <it>
Codes réduits à leurs mots<mrk>, <pc> sans données<g>, <mrk>
Plusieurs segmentsJoints, avec les <ignorable> entre eux ; l'état le moins avancé—
État dans le fichierSegment
pas de cible, ou une cible sans motsnon traduit
2.x initial ; 1.2 new, needs-* ou un état personnaliséproposé
2.x translated ; 1.2 translated ou aucun étattraduit
2.x reviewed ou final ; 1.2 final, signed-off ou approved="yes"révisé

Fusionner

XliffMerge::merge() compare les langues données à celles du fichier, puis applique chaque unité au segment de sa clé :

Ignorée commeQuand
unknown-keyAucun segment n'a la clé
source-changedLa source du segment n'a plus les mots à partir desquels le fichier a été fait
no-targetL'unité n'a pas de cible avec des mots
unchangedLa cible et l'état sont ceux du segment, ou la même cible seulement proposée

Les autres unités sont appliquées comme proposées, traduites ou révisées, selon ce que dit le fichier. Les balises que la source ne contient pas sont retirées de la cible, leurs mots conservés : un fichier ne peut pas apporter un balisage que le document n'a jamais eu. Le MergeResult contient chaque segment dans son ordre, les clés appliquées et les unités ignorées.