PowerShell: Captionvergleich von Sprachvarietäten

7. Dezember 2014 22:43

Mit dieser Funktion kann man aus den Sprachdateien die jeweiligen Zeilen der verschiedenen Sprachen extrahieren und alle den direkten Vergleich störenden Unterschiede eliminieren.
Im ersten Schritt werden also aus der über Extras>Translate>Export erzeugten
  • CH-Sprachdatei mit ENU,DES,FRS und ITS-Zeilen die DES-Zeilen herausgelöst
  • DE-Sprachdatei mit ENU und DEU die DEU-Zeilen herausgelöst
und jeweils in eine neue Datei geschrieben (im Beispiel C:\ps\p1\CH.txt -> C:\ps\p1\CH_DES.txt bzw. C:\ps\p1\DE.txt -> C:\ps\p1\DE_DEU.txt)
In diesen Dateien werden dann -A1031- in der DE-Datei bzw. -A2055- in der CH-Datei jeweils durch -DE- ersetzt und in eine neue Datei geschrieben (CH_DES_DE.txt bzw. DE_DEU_DE.txt).

Damit bleiben in diesen Dateien im anschließenden Dateivergleich nur noch die relevanten Unterschiede zurück.
Diff_DEU_DES.jpg

Im Vergleich dazu der gleiche Bereich (Felder 59-64 in Tabelle 17) in den Ausgangsdateien, dort sind die Unterschiede nicht direkt erkennbar.
Diff_DEU_DES_Ausgangsdatei.jpg



Code:
function Create_DEU_DES_diff
{
 function EditCHfile
  {
   Write-Host 'Extracting DES lines from ENU-DES-FRS-ITS language file'
   get-content c:\ps\p1\CH.txt | select-string -pattern '-A2055-' -simplematch | Out-File c:\ps\p1\CH_DES.txt -width 1024
  }

 function RemoveLangCodeinCHfile
  {
   Write-Host 'Replacing -A2055- with -DE-'
   $a = get-content c:\ps\p1\CH_DES.txt
   $a = $a -replace '-A2055-','-DE-'
   Out-File -filepath c:\ps\p1\CH_DES_DE.txt -inputobject $a -width 1024
  }

 function EditDEfile
  {
   Write-Host 'Extracting DEU lines from ENU-DEU language file'
   get-content c:\ps\p1\DE.txt | select-string -pattern '-A1031-' -simplematch | Out-File c:\ps\p1\DE_DEU.txt -width 1024
  }
 
 function RemoveLangCodeinDEfile
  {
   Write-host 'Replacing -A1031- with -DE-'
   $a = get-content c:\ps\p1\DE_DEU.txt
   $a = $a -replace '-A1031-', '-DE-' 
   Out-File -filepath c:\ps\p1\DE_DEU_DE.txt -inputobject $a -width 1024
  }

 EditCHfile
 RemoveLangCodeinCHfile
 EditDEfile
 RemoveLangCodeinDEfile
}


Auch innerhalb eines Sprachcodes kann das genutzt werden, die nordamerikanischen ENU-Captions der NA-Version verglichen zur W1 bzw. DE haben etliche Unterschiede, die man durch Anpassung dieser Funktion direkt erkennen kann, wenn aus der NA-Sprachdatei die Captions für Kanada (ENC,FRC) und Mexico (ESM) entfernt werden.
Da natürlich beide ENU-Varietäten den Code A1033 haben, kann der zweite Schritt bei diesem Szenario entfallen.
Diff_ENU.jpg

Code:
function Create_ENU_NA_ENU_DE_diff
{
 function ExtractENUfromNAfile
  {
   Write-Host 'Extracting ENU lines from NA language file'
   get-content c:\ps\p3\NA.txt | select-string -pattern '-A1033-' -simplematch | Out-File c:\ps\p3\NA_ENU.txt -width 1024
  }

 
 function ExtractENUfromDEfile
  {
   Write-Host 'Extracting ENU lines from DE language file'
   get-content c:\ps\p3\DE.txt | select-string -pattern '-A1033-' -simplematch | Out-File c:\ps\p3\DE_ENU.txt -width 1024
  }
 
 
 ExtractENUfromNAfile
 ExtractENUfromDEfile
 }
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Captionvergleich ENU-ENG

10. Dezember 2014 01:53

Beim Vergleich ENU gegen ENG in der GB-Version kommt man mit einem Export der Sprachdatei aus der GB-Datenbank aus, die dann in zwei Dateien zerlegt wird.
Code:
function Create_ENU_ENG_diff
{
 function EditGBfile1
  {
   Write-Host 'Extracting ENU lines from GB language file'
   get-content c:\ps\p4\GB.txt | select-string -pattern '-A2057-' -simplematch | Out-File c:\ps\p4\GB_ENG.txt -width 1024
  }

 function RemoveLangCodeinGBfile1
  {
   Write-Host 'Replacing -A2057- with -EN-'
   $a = get-content c:\ps\p4\GB_ENG.txt
   $a = $a -replace '-A2057-','-EN-'
   Out-File -filepath c:\ps\p4\GB_ENG_EN.txt -inputobject $a -width 1024
  }

 function EditGBfile2
  {
   Write-Host 'Extracting ENU lines from GB language file'
   get-content c:\ps\p4\GB.txt | select-string -pattern '-A1033-' | Out-File c:\ps\p4\GB_ENU.txt -width 1024
  }
 
 function RemoveLangCodeinGBfile2
  {
   Write-host 'Replacing -A1033- with -EN-'
   $a = get-content c:\ps\p4\GB_ENU.txt
   $a = $a -replace '-A1033-', '-EN-' 
   Out-File -filepath c:\ps\p4\GB_ENU_EN.txt -inputobject $a -width 1024
  }

 EditGBfile1
 RemoveLangCodeinGBfile1
 EditGBfile2
 RemoveLangCodeinGBfile2
}

ENG_ENUdiff.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Width Parameter bei Out-File

15. Dezember 2014 15:57

Der Vorgabewert von 80 Zeichen bei Out-File reicht zwar für die Feldbezeichnungen, aber nicht für lange (Fehler)meldungen und Optionswerte.
Ich habe die Out-File-Anweisungen oben deshalb um einen Width-Schalter ergänzt, damit auch die langen Zeilen komplett erhalten bleiben.
-width 1024

Diff_DEU_DES_3.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Unicodekonvertierung

19. Dezember 2014 01:56

Da auch die Textexporte aus NAV heraus aus Kompatibiltätsgründen weiterhin im "antiken" Codepageformat OEM 850 erfolgen, ist die Weiterverarbeitung im Bezug auf die Sonderzeichen eher unschön.
Alternativ kann man die Dateien vorab konvertieren, diese Unicodedateien dürfen dann natürlich nicht mehr mit dem Client oder Cmdlets importiert bzw. müssen vorher wieder in OEM 850 zurückkonvertiert werden. Edit 18.04.17: Alternativ können ab NAV 2013 R2 Unicodedateien auch direkt auf dem Server abgelegt werden. Bei Codepagekonflikten ist das dann sogar die einzige Methode, die alle Captions korrekt anzeigt, wie hier beschrieben.

In dieser erweiterten Funktion werden die OEM 850 Exportdateien in Unicode umgewandelt (hier als platzsparendes UTF8, je nach Anzahl der Sonderzeichen mit nur leicht erhöhtem Platzbedarf; UTF16 funktionert analog, verdoppelt aber die Größe der Textdateien).

Die Konvertierung wird via .NET-Framework durchgeführt:
Encoding.GetEncoding Method (String)
File.ReadAllText Method (String, Encoding)
File::WriteAllText Method (String, String, Encoding)
Code Page Identifiers

ConvertFiles850UTF8.jpg


In den geänderten Funktionen werden dann die Unicodeversionen verwendet (außerdem sind hier jetzt für die Textdateien ".\"-Pfadangaben für das aktuelle Verzeichnis) und bei Out-File mit
Code:
-encoding UTF8
weiterverarbeitet.

Code:
    function Create_UTF8_DEU_DES_diff
    {
     function ConvertFilesOEM850ToUTF8
      {
        $OEM850filename1 = Resolve-Path '.\CH.txt'
        $OEM850filename2 = Resolve-Path '.\DE.txt'
        if (Test-path '.\CHunicode.txt') {Remove-Item -path '.\CHunicode.txt'}
        if (Test-path '.\DEunicode.txt') {Remove-Item -path '.\DEunicode.txt'}
        $unicodefilename1 = New-Item -path '.\CHunicode.txt' -type file
        $unicodefilename2 = New-Item -path '.\DEunicode.txt' -type file
        # European codepage 850
        $encodingOEM850 = [System.Text.Encoding]::GetEncoding(850)
        $encodingUTF8 = [System.Text.Encoding]::GetEncoding(65001)
        Write-host "Converting $OEM850filename1 to $unicodefilename1"
        $textfile1 = [System.IO.File]::ReadAllText($OEM850filename1, $encodingOEM850)
        [System.IO.File]::WriteAllText($unicodefilename1, $textfile1, $encodingUTF8)
        Write-host "Converting $OEM850filename2 to $unicodefilename2"
        $textfile2 = [System.IO.File]::ReadAllText($OEM850filename2, $encodingOEM850)
        [System.IO.File]::WriteAllText($unicodefilename2, $textfile2, $encodingUTF8)
      }
     
     
     function EditCHfile
      {
       Write-Host 'Extracting DES lines from ENU-DES-FRS-ITS language file'
       get-content .\CHunicode.txt | select-string -pattern '-A2055-' -simplematch | Out-File .\CH_DES.txt -width 1024 -encoding UTF8
      }

     function RemoveLangCodeinCHfile
      {
       Write-Host 'Replacing -A2055- with -DE-'
       $a = get-content .\CH_DES.txt
       $a = $a -replace '-A2055-','-DE-'
       Out-File -filepath .\CH_DES_DE.txt -inputobject $a -width 1024 -encoding UTF8
      }

     function EditDEfile
      {
       Write-Host 'Extracting DEU lines from ENU-DEU language file'
       get-content .\DEunicode.txt | select-string -pattern '-A1031-' -simplematch | Out-File .\DE_DEU.txt -width 1024 -encoding UTF8
      }
     
     function RemoveLangCodeinDEfile
      {
       Write-host 'Replacing -A1031- with -DE-'
       $a = get-content .\DE_DEU.txt
       $a = $a -replace '-A1031-', '-DE-'
       Out-File -filepath .\DE_DEU_DE.txt -inputobject $a -width 1024 -encoding UTF8
      }

     ConvertFilesOEM850ToUTF8
     EditCHfile
     RemoveLangCodeinCHfile
     EditDEfile
     RemoveLangCodeinDEfile
    }

Mit dieser Variante werden dann Unicode-Vergleichsdateien erzeugt, in denen alle Sonderzeichen korrekt dargestellt werden.
DEU_DES_UTF8.jpg


Falls man nur die Sonderzeichen einer Datei ohne Konvertierung in der Ansicht korrekt anzeigen möchte, genügt der Wechsel auf die Codepage 850 in einem leistungsfähigen Editor wie z.B. Notepad++.
AuswahlCodepage850.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Captionunterschiede in neuer Datei zusammenfassen

20. Dezember 2014 01:00

Aufbauend auf den Dateien, die für den Vergleich verwendet werden (z.B. im DEU-DES-Szenario DE_DEU_DE.txt und CH_DES_DE.txt), können mit dieser Funktion die Captions, die unterschiedlich sind, in eine Datei mit Tabulatortrennzeichen geschrieben werden (CH_DE_CaptionDiff.txt).
In der Beispielfunktion wird die o.a. UTF8-Konvertierung für die Ausgangsdateien vorausgesetzt.
Zur Laufzeit werden die verglichenen Codes einzeln ausgegeben, bei Unterschieden werden die Captions ausgegeben und gleichzeitig mitsamt dem Code in die Datei geschrieben.
LaufzeitDiffToFile.jpg

Dateiansicht der erzeugten Datei
AusgabeDiffToFile.jpg

Funktion

CreateDiffFileDEUDES.jpg

Code:
function  CreateDiffFile_DEU_DES
{
   if (test-path '.\CH_DE_CaptionDiff.txt') {Remove-Item -path '.\CH_DE_CaptionDiff.txt'}
   $filename3 = New-Item -path '.\CH_DE_CaptionDiff.txt' -type file
   $DEUcode = 'DEU'
   $DEScode = 'DES'
   out-file -FilePath $filename3 -inputobject "Code`t$DEUcode`t$DESCode" -width 1024 -Encoding UTF8

   foreach ($line in get-content DE_DEU_DE.txt)
     {   
      $PosColon = $line.indexof(":")
      
      if ($PosColon -gt 0)
      {
      $SearchPattern = $line.substring(0,$PosColon)
      $CaptionFile1 = $line.substring($PosColon + 1)
      $CaptionFile1 = $CaptionFile1 -replace "`t|`n|`r",""
      write-host "Seaching for:" $SearchPattern
      $lineFile2 = get-content CH_DES_DE.txt | select-string -pattern $SearchPattern -simplematch  | Out-String
      
      $PosColon2 = $lineFile2.indexof(":")
      $ResultCodeString = $line.substring(0,$SearchPattern.length)
      
      if ($ResultCodeString -eq $SearchPattern)
      {
      $CaptionFile2 = $lineFile2.substring($PosColon2 + 1)
      $CaptionFile2 = $CaptionFile2 -replace "`t|`n|`r",""
      
      $CaptionFile1 = $CaptionFile1.trim()
      $CaptionFile2 = $CaptionFile2.trim()
      
      if ($CaptionFile1 -ne $CaptionFile2)
        {
         out-file -FilePath $filename3 -inputobject "$SearchPattern`t$CaptionFile1`t$CaptionFile2" -width 2148 -append -Encoding UTF8
         write-host "DEU:" $CaptionFile1.trim()  -foregroundcolor "green"
         write-host "DES:" $CaptionFile2.trim()  -foregroundcolor "yellow"

        }
      }
      }
     }
 }
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

DEU - DEA Dateivergleich

21. Februar 2015 23:25

Auch zwischen DEU und DEA gibt es etliche Unterschiede, DE und AT sind ja zwei Länder, die durch eine gemeinsame Sprache getrennt sind :wink: .
Kleiner Ausschnitt davon:
DEU_DEA_UTF8.jpg


Anzeige zur Laufzeit
DEU_DEA_laufzeit.jpg


Code:
        function Create_UTF8_DEU_DEA_diff
        {
         function ConvertFilesOEM850ToUTF8
          {
            $OEM850filename1 = Resolve-Path '.\AT.txt'
            $OEM850filename2 = Resolve-Path '.\DE.txt'
            if (Test-path '.\ATunicode.txt') {Remove-Item -path '.\ATunicode.txt'}
            if (Test-path '.\DEunicode.txt') {Remove-Item -path '.\DEunicode.txt'}
            $unicodefilename1 = New-Item -path '.\ATunicode.txt' -type file
            $unicodefilename2 = New-Item -path '.\DEunicode.txt' -type file
            # European codepage 850
            $encodingOEM850 = [System.Text.Encoding]::GetEncoding(850)
            $encodingUTF8 = [System.Text.Encoding]::GetEncoding(65001)
            Write-host "Converting $OEM850filename1 to $unicodefilename1"
            $textfile1 = [System.IO.File]::ReadAllText($OEM850filename1, $encodingOEM850)
            [System.IO.File]::WriteAllText($unicodefilename1, $textfile1, $encodingUTF8)
            Write-host "Converting $OEM850filename2 to $unicodefilename2"
            $textfile2 = [System.IO.File]::ReadAllText($OEM850filename2, $encodingOEM850)
            [System.IO.File]::WriteAllText($unicodefilename2, $textfile2, $encodingUTF8)
          }
         
         
         function EditATfile
          {
           Write-Host 'Extracting DEA lines from ENU-DEA language file'
           get-content .\ATunicode.txt | select-string -pattern '-A3079-' -simplematch | Out-File .\AT_DEA.txt -width 1024 -encoding UTF8
          }

         function RemoveLangCodeinATfile
          {
           Write-Host 'Replacing -A3079- with -DE-'
           $a = get-content .\AT_DEA.txt
           $a = $a -replace '-A3079-','-DE-'
           Out-File -filepath .\AT_DEA_DE.txt -inputobject $a -width 1024 -encoding UTF8
          }

         function EditDEfile
          {
           Write-Host 'Extracting DEU lines from ENU-DEU language file'
           get-content .\DEunicode.txt | select-string -pattern '-A1031-' -simplematch | Out-File .\DE_DEU.txt -width 1024 -encoding UTF8
          }
         
         function RemoveLangCodeinDEfile
          {
           Write-host 'Replacing -A1031- with -DE-'
           $a = get-content .\DE_DEU.txt
           $a = $a -replace '-A1031-', '-DE-'
           Out-File -filepath .\DE_DEU_DE.txt -inputobject $a -width 1024 -encoding UTF8
          }

         ConvertFilesOEM850ToUTF8
         EditATfile
         RemoveLangCodeinATfile
         EditDEfile
         RemoveLangCodeinDEfile
        }
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

DEU - DEA Diff-Datei erzeugen

22. Februar 2015 01:32

Beim Umarbeiten der Diffdateierzeugung ergab sich noch eine notwendige Skriptanpassung.
Da sich Teile der Codestrings aus den Tabellen (hier Tabelle 3 und 4) teilweise auch an ganz anderen Stellen wie hier im Report 19 bzw. 10 auftauchen, ist auch der Abgleich des Suchstrings und dem Codestrings der gefundenen Zeile erforderlich.

Beispiel:
T3-P8629-A3079-L999:Zahlungsbedingungen
R19-T3-P8629-A3079-L999:STEUER

T4-P8629-A3079-L999:Währung
R10-T4-P8629-A3079-L999:Seite

Es muss also noch eine weitere Prüfung dazu, ob der Codestring (bis zum Doppelpunkt) in der gefunden Zeile komplett und nicht nur teilweise übereinstimmt, sofern man alle Objekte in der Translatedatei exportiert hat. Aus Performancegründen empfiehlt sich hier aber ohnehin, sich jeweils auf den gleichen Objekttyp zu beschränken, um die Suche zu beschleunigen. Die Prüfung habe ich auch bei Funktion für die DES-Diffdatei ergänzt.

Code:
function  CreateDiffFile_DEU_DEA
{
if (test-path '.\AT_DE_CaptionDiff.txt') {Remove-Item -path '.\AT_DE_CaptionDiff.txt'}
$filename3 = New-Item -path '.\AT_DE_CaptionDiff.txt' -type file
$DEUcode = 'DEU'
$DEAcode = 'DEA'
out-file -FilePath $filename3 -inputobject "Code`t$DEUcode`t$DEACode" -width 1024 -Encoding UTF8

foreach ($line in get-content DE_DEU_DE.txt)
  {   
   $PosColon = $line.indexof(":")
   
   if ($PosColon -gt 0)
   {
   $SearchPattern = $line.substring(0,$PosColon)
   $CaptionFile1 = $line.substring($PosColon + 1)
   $CaptionFile1 = $CaptionFile1 -replace "`t|`n|`r",""
   write-host "Seaching for:" $SearchPattern
   $lineFile2 = get-content AT_DEA_DE.txt | select-string -pattern $SearchPattern -simplematch  | Out-String
   
   $PosColon2 = $lineFile2.indexof(":")
   $ResultCodeString = $line.substring(0,$SearchPattern.length)
   
   if ($ResultCodeString -eq $SearchPattern)
    {
    $CaptionFile2 = $lineFile2.substring($PosColon2 + 1)
    $CaptionFile2 = $CaptionFile2 -replace "`t|`n|`r",""
   
    $CaptionFile1 = $CaptionFile1.trim()
    $CaptionFile2 = $CaptionFile2.trim()
   
    if ($CaptionFile1 -ne $CaptionFile2)
      {
      out-file -FilePath $filename3 -inputobject "$SearchPattern`t$CaptionFile1`t$CaptionFile2" -width 2148 -append -Encoding UTF8
      write-host "DEU:" $CaptionFile1.trim()  -foregroundcolor "green"
      write-host "DEA:" $CaptionFile2.trim()  -foregroundcolor "yellow"

     }
   }
   }
  }
}

DEU_DEA_diffdatei.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

HTML-Diffdateien DE-CH und DE-AT

23. April 2015 13:13

In den Zipdateien sind HTML-Diffdateien aller Unterschiede für NAV 2013 Cumulative Update 25 für DE <-> CH und DE <-> AT
Ausschnitt DEU-DES
DEU_DESdiff.png

Ausschnitt DEU-DEA
DEU_DEAdiff.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.