PowerShell: XLIFF-Datei erstellen (.xlf)

Bild Tipps & Tricks zu den Dynamics NAV Versionen
Hier bitte keine Fragen stellen, sondern nur bereits vorhandene Tricks veröffentlichen.
Forumsregeln
Impressum • Community-Knigge • Nutzungsbedingungen • Datenschutzrichtlinie
Hier bitte keine Fragen stellen, sondern nur bereits vorhandene Tricks veröffentlichen.

PowerShell: XLIFF-Datei erstellen (.xlf)

Beitragvon Kowa » 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: Alles auswählen
"   "
'   '
<   &lt;
>   &gt;
&   &amp;


Code: Alles auswählen
    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: Alles auswählen
    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
    }
GruĂź, Kai

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, Messenger oder Telefon! DafĂĽr ist dieses Forum da.

Download: Dynamics NAV Object Text Explorer (Alternativlink). MVP Alumni
Benutzeravatar
Kowa
Moderator
Moderator
 
Beiträge: 7835
Registriert: 17. Juni 2005 17:32
Wohnort: Bremen
Realer Name: Kai Kowalewski
Arbeitsort: Osterholz-Scharmbeck
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics 365
Microsoft Dynamics Version: BC, NAV 2018 bis Navision 2.01

Re: PowerShell: XLF-Datei erstellen (XLIFF)

Beitragvon Kowa » 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
GruĂź, Kai

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, Messenger oder Telefon! DafĂĽr ist dieses Forum da.

Download: Dynamics NAV Object Text Explorer (Alternativlink). MVP Alumni
Benutzeravatar
Kowa
Moderator
Moderator
 
Beiträge: 7835
Registriert: 17. Juni 2005 17:32
Wohnort: Bremen
Realer Name: Kai Kowalewski
Arbeitsort: Osterholz-Scharmbeck
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics 365
Microsoft Dynamics Version: BC, NAV 2018 bis Navision 2.01


ZurĂĽck zu NAV Tipps & Tricks

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast