Public/Import-XliffWorkspace.ps1
|
function Import-XliffWorkspace { <# .SYNOPSIS Recursively imports every XLIFF file in a workspace folder. .DESCRIPTION Scans a translations or repository folder for `.xlf` files, loads all units, and returns an **XliffParser.Workspace** summary object containing: - Per-file statistics and unit collections - **ByLanguage** grouping (for example `fr-FR`, `de-DE`) - **ByApp** grouping based on the parent folder name - Aggregate statistics across the entire workspace Useful for dashboards, localization audits, and multi-app Business Central solutions with several extensions under one repository. .PARAMETER Path Root folder to scan recursively. .OUTPUTS [pscustomobject] **XliffParser.Workspace** .EXAMPLE Import-XliffWorkspace -Path .\Translations .EXAMPLE $workspace = Import-XliffWorkspace -Path .\Translations $workspace.ByLanguage | Format-Table Language, Count .NOTES Author: XliffParser Contributors #> [CmdletBinding()] param( [Parameter(Mandatory, Position = 0)] [ValidateScript({ Test-Path $_ -PathType Container })] [string]$Path ) $root = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path) $files = Get-ChildItem -Path $root -Filter '*.xlf' -File -Recurse $fileSummaries = [System.Collections.Generic.List[object]]::new() $allUnits = [System.Collections.Generic.List[XliffTranslationUnit]]::new() foreach ($file in $files) { Write-Verbose "Loading XLIFF workspace file '$($file.FullName)'." $units = @(Import-XliffFile -Path $file.FullName) foreach ($unit in $units) { $allUnits.Add($unit) } $first = $units | Select-Object -First 1 $statistics = if ($first) { New-XliffStatistics -Units $units -Path $file.FullName -SourceLanguage $first.SourceLanguage -TargetLanguage $first.TargetLanguage } else { New-XliffStatistics -Units @() -Path $file.FullName } $appName = Split-Path -Leaf (Split-Path -Parent $file.FullName) $fileSummaries.Add([pscustomobject]@{ Path = $file.FullName App = $appName SourceLanguage = $statistics.SourceLanguage TargetLanguage = $statistics.TargetLanguage Statistics = $statistics Units = $units }) } $byLanguage = $fileSummaries | Group-Object TargetLanguage | ForEach-Object { [pscustomobject]@{ Language = $_.Name Files = $_.Group Count = $_.Count } } $byApp = $fileSummaries | Group-Object App | ForEach-Object { [pscustomobject]@{ App = $_.Name Files = $_.Group Count = $_.Count } } $firstUnit = $allUnits | Select-Object -First 1 $aggregateStatistics = if ($firstUnit) { New-XliffStatistics -Units $allUnits.ToArray() -Path $root -SourceLanguage $firstUnit.SourceLanguage } else { New-XliffStatistics -Units @() -Path $root } [pscustomobject]@{ PSTypeName = 'XliffParser.Workspace' Path = $root Files = $fileSummaries ByLanguage = $byLanguage ByApp = $byApp Statistics = $aggregateStatistics } } |