Public/Get-XliffTranslationsDiff.ps1
<#
.Synopsis Compares XLIFF translation files and creates a new XLIFF translation files with the differences. .Description Compares an original version to a new version of an XLIFF file and adds the units that have been added or changed (in source text) to a new XLIFF translation file. .Parameter originalPath Specifies the path to the original version of the XLIFF file. .Parameter newPath Specifies the path to the new version of the XLIFF file. .Parameter diffPath Specifies the path where the XLIFF file with the differences will be saved. .Parameter newOnly Specifies whether the command should only include the new units. .Parameter reportProgress Specifies whether the command should report progress. #> function Get-XliffTranslationsDiff { Param ( [Parameter(Mandatory = $true)] [string] $originalPath, [Parameter(Mandatory = $true)] [string] $newPath, [Parameter(Mandatory = $true)] [string] $diffPath, [switch] $newOnly, [switch] $reportProgress ) Write-Host "Loading original document $originalPath"; [XlfDocument] $originalDocument = [XlfDocument]::LoadFromPath($originalPath); Write-Host "Loading new document $newPath"; [XlfDocument] $newDocument = [XlfDocument]::LoadFromPath($newPath); Write-Host "Creating new empty diff document"; [XlfDocument] $diffDocument = [XlfDocument]::CreateEmptyDocFrom($newDocument, $newDocument.GetTargetLanguage()); Write-Host "Creating Map in memory for original document's unit ids"; $idMap = @{} $originalDocument.TranslationUnitNodes() | ForEach-Object { $unit = $_ $idMap.Add($unit.'id', $originalDocument.GetUnitSourceText($unit)); } Write-Host "Retrieving translation units from new document"; [int] $unitCount = $newDocument.TranslationUnitNodes().Count; [int] $i = 0; [int] $onePercentCount = $unitCount / 100; Write-Host "Processing unit nodes... (Please be patient)"; [string] $progressMessage = "Extracting new or changed units." if ($reportProgress) { Write-Progress -Activity $progressMessage -PercentComplete 0; } $newDocument.TranslationUnitNodes() | ForEach-Object { [System.Xml.XmlNode] $unit = $_; if ($reportProgress) { $i++; if ($i % $onePercentCount -eq 0) { $percentage = ($i / $unitCount) * 100; Write-Progress -Activity $progressMessage -PercentComplete $percentage; } } [bool] $foundInOriginal = $idMap.ContainsKey($unit.id); if (-not $foundInOriginal) { $diffDocument.ImportUnit($unit); } elseif (-not $newOnly) { $originalSourceText = $idMap[$unit.id]; $newSourceText = $newDocument.GetUnitSourceText($unit); if ($newSourceText -ne $originalSourceText) { $diffDocument.ImportUnit($unit); } } } Write-Host "Saving document to $diffPath" $diffDocument.SaveToFilePath($diffPath); } Export-ModuleMember -Function Get-XliffTranslationsDiff |