PowerShell: XLIFF-Datei erstellen (.xlf)

31. März 2015 17:55

Mit diesen Funktionen kann man aus zwei vorhandenen UTF-8-Dateien (Link) eine XLIFF-Datei erzeugen (Dateiendung .xlf, z.B. für den Translator Hub bzw. DTS, im Beispiel ENU und FRA. Wenn die Feldinhalte Abkürzungspunkte enthalten, ist diese Methode unbedingt vorzuziehen, da diese in Monolingual Documents als Satzende interpretiert werden und die Synchronisation dann falsch auf die nächste Zeile verschieben.

2 Varianten bei der Erstellung sind dabei möglich:

Mit Escapezeichen
XLIFFescape.png

Folgende Zeichen werden in den Feldern durch Escapezeichen (Entity-Referenzen) ersetzt (dieses ist bei XML immer erforderlich, wenn man nicht die untere Variante 2 verwendet).
Code:
"   "
'   '
<   &lt;
>   &gt;
&   &amp;


Code:
    function CreateXLF
     {
     
     function WriteToFile
     {
     out-file C:\Temp\ENU_FRA_V4.xlf -inputobject $args -force -append -Width 500 -Encoding utf8
     }
     
     $lines = Get-Content C:\Temp\File1.txt | Measure-Object –Line
     $Nooflines = $lines.Lines
     write-host "File 1 has $Nooflines lines"

     if (Test-Path C:\Temp\File2.txt) {Write-Host File 2 exists}
     if (Test-Path C:\Temp\ENU_FRA_V4.xlf) {Remove-Item C:\Temp\ENU_FRA_V4.xlf}

     $CurrLine = "<xliff version='1.2' xmlns='urn:oasis:names:tc:xliff:document:1.2'>"
     # out-file C:\Temp\Translations.xlf -inputobject $Currline -force -append -Width 500 -Encoding utf8
     writetoFile $CurrLine
   
     
     $CurrLine = "    <file original='File1.txt' source-language='en' target-language='fr' datatype='plaintext'>"
     writetoFile $CurrLine
     $CurrLine = "        <body>"
     writetoFile $CurrLine
     
     
     for ($i = 0; $i -lt $lines.Lines; $i++)
     {
      $SourceCaption = (Get-Content C:\Temp\File1.txt)[$i]
      $TargetCaption = (Get-Content C:\Temp\File2.txt)[$i]
      $SourceCaption = $SourceCaption -replace '&','&amp;'
      $TargetCaption = $TargetCaption -replace '&','&amp;'
      $SourceCaption = $SourceCaption -replace '<','&lt;'
      $TargetCaption = $TargetCaption -replace '<','&lt;'
      $SourceCaption = $SourceCaption -replace '>','&gt;'
      $TargetCaption = $TargetCaption -replace '>','&gt;'
      $SourceCaption = $SourceCaption -replace '"','&quot;'
      $TargetCaption = $TargetCaption -replace '"','&quot;'
      $SourceCaption = $SourceCaption -replace $([char]39),'&apos;'
      $TargetCaption = $TargetCaption -replace $([char]39),'&apos;'
     
     
      #<trans-unit id="1">
      $j = $i + 1
      $CurrLine = "            <trans-unit id=$([char]34)$j$([char]34)>"
      writetoFile $CurrLine
      $CurrLine = "                <source xml:lang=$([char]34)en$([char]34)>$SourceCaption</source>"
      writetoFile $CurrLine
      $CurrLine = "                <target xml:lang=$([char]34)fr$([char]34)>$TargetCaption</target>"
      #<source xml:lang="en">Cannot find the file.</source>
      writetoFile $CurrLine
      #<target xml:lang="fr">Fichier non trouvé.</target>
      $CurrLine = '            </trans-unit>'
      writetoFile $CurrLine
     
      if ($i%10 -eq 0) {Write-Host "Writing $i of $Nooflines"}
       

     }
    $CurrLine = '        </body>'
    writetoFile $CurrLine
    $CurrLine = '    </file>'
    writetoFile $CurrLine
    $CurrLine = '</xliff>'
    writetoFile $CurrLine
    }

Ohne Escapezeichen
Alternativ kann man dem Parser auch mitteilen, dass die Feldinhalte direkt verarbeitet werden sollen, dann kann auf Escapezeichen verzichtet werden.
Hier werden durch die Verwendung von <![CDATA[…]] (Character Data) die Feldinhalte ohne Escapezeichen geschrieben.
XLIFFCDATA.png

Code:
    function CreateXLFCDATA
     {
     
     function WriteToFile
     {
     out-file C:\Temp\ENU_FRA_V3.xlf -inputobject $args -force -append -Width 500 -Encoding utf8
     }
     
     $lines = Get-Content C:\Temp\File1.txt | Measure-Object –Line
     $Nooflines = $lines.Lines
     write-host "File 1 has $Nooflines lines"

     if (Test-Path C:\Temp\File2.txt) {Write-Host File 2 exists}
     if (Test-Path C:\Temp\ENU_FRA_V3.xlf) {Remove-Item C:\Temp\ENU_FRA_V3.xlf}

     # $CurrLine = '<?xml version=$'([char]34)+'1.0'+$([char]34)?>'
     
     $CurrLine = "<xliff version='1.2' xmlns='urn:oasis:names:tc:xliff:document:1.2'>"
     # out-file C:\Temp\Translations.xlf -inputobject $Currline -force -append -Width 500 -Encoding utf8
     writetoFile $CurrLine
   
     
     $CurrLine = "    <file original='File1.txt' source-language='en' target-language='fr' datatype='plaintext'>"
     WriteTofile $Currline
     $CurrLine = "        <body>"
     writetoFile $CurrLine
     
     
     for ($i = 0; $i -lt $lines.Lines; $i++)
     {
      $SourceCaption = (Get-Content C:\Temp\File1.txt)[$i]
      $TargetCaption = (Get-Content C:\Temp\File2.txt)[$i]

      #<trans-unit id="1">
      $j = $i + 1
      $CurrLine = "            <trans-unit id=$([char]34)$j$([char]34)>"
      writetoFile $CurrLine
      $CurrLine = "                <source xml:lang=$([char]34)en$([char]34)><![CDATA[$SourceCaption]]></source>"
      writetoFile $CurrLine
      $CurrLine = "                <target xml:lang=$([char]34)fr$([char]34)><![CDATA[$TargetCaption]]></target>"
      #<source xml:lang="en">Cannot find the file.</source>
      writetoFile $CurrLine
      #<target xml:lang="fr">Fichier non trouvé.</target>
      $CurrLine = '            </trans-unit>'
      writetoFile $CurrLine
     
      if ($i%10 -eq 0) {Write-Host "Writing $i of $Nooflines"}
       

     }
    $CurrLine = '         </body>'
    writetoFile $CurrLine
    $CurrLine = '     </file>'
    writetoFile $CurrLine
    $CurrLine = '</xliff>'
    writetoFile $CurrLine
    }
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: PowerShell: XLF-Datei erstellen (XLIFF)

1. April 2015 16:05

Wenn die Felder "größer als" > Zeichen enthalten (bzw. kleiner als <), sollte auf die Variante mit CDATA verzichtet werden. Die werden zwar vom Translation Hub im ersten Schritt ohne Fehler extrahiert, aber beim anschließenden Alignment funktioniert nur noch die Variante mit Escapezeichen korrekt. Bei Verwendung von CDATA geht der Hub hier offensichtlich von einem Feldende aus, was den Abgleich völlig ruiniert.
XLIFFgt.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.