Files
devolutions--unigetui/scripts/translation/Set-TranslationBoundaryOrder.ps1
wehub-resource-sync 643e9f9fcb
.NET Tests / test-codebase (push) Waiting to run
Translation Validation / validate-translations (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:01:52 +08:00

138 lines
5.4 KiB
PowerShell

[CmdletBinding(SupportsShouldProcess = $true)]
param(
[string]$RepositoryRoot,
[string]$EnglishFilePath,
[string]$LanguagesDirectory,
[string]$InventoryOutputPath,
[switch]$IncludeEnglish,
[switch]$CheckOnly
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
. (Join-Path $PSScriptRoot 'Languages\TranslationJsonTools.ps1')
. (Join-Path $PSScriptRoot 'Languages\TranslationSourceTools.ps1')
$resolvedRepositoryRoot = Resolve-TranslationSyncRepositoryRoot -RepositoryRoot $RepositoryRoot
$resolvedEnglishFilePath = Resolve-EnglishLanguageFilePath -ResolvedRepositoryRoot $resolvedRepositoryRoot -EnglishFilePath $EnglishFilePath
$resolvedLanguagesDirectory = if ([string]::IsNullOrWhiteSpace($LanguagesDirectory)) {
Split-Path -Path $resolvedEnglishFilePath -Parent
}
else {
Get-FullPath -Path $LanguagesDirectory
}
if (-not (Test-Path -Path $resolvedLanguagesDirectory -PathType Container)) {
throw "Languages directory not found: $resolvedLanguagesDirectory"
}
$englishMap = Read-OrderedJsonMap -Path $resolvedEnglishFilePath
$englishSections = Split-TranslationMapAtBoundary -Map $englishMap
if (-not $englishSections.HasBoundary) {
Write-Output 'The English translation file does not contain a legacy boundary marker. No reordering needed.'
return
}
$englishActiveOrder = @($englishSections.ActiveMap.Keys)
$englishLegacyOrder = @($englishSections.LegacyMap.Keys)
$englishKeySet = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::Ordinal)
foreach ($key in $englishActiveOrder) {
[void]$englishKeySet.Add([string]$key)
}
foreach ($key in $englishLegacyOrder) {
[void]$englishKeySet.Add([string]$key)
}
$filesToProcess = Get-ChildItem -Path $resolvedLanguagesDirectory -Filter 'lang_*.json' | Sort-Object Name
if (-not $IncludeEnglish) {
$filesToProcess = @($filesToProcess | Where-Object { $_.FullName -ine $resolvedEnglishFilePath })
}
$changedFiles = New-Object System.Collections.Generic.List[string]
$reports = New-Object System.Collections.Generic.List[object]
foreach ($languageFile in $filesToProcess) {
$languageMap = Read-OrderedJsonMapPermissive -Path $languageFile.FullName
$activeOutput = New-OrderedStringMap
foreach ($key in $englishActiveOrder) {
if ($languageMap.Contains($key)) {
$activeOutput[$key] = [string]$languageMap[$key]
}
}
$legacyOutput = New-OrderedStringMap
foreach ($key in $englishLegacyOrder) {
if ($languageMap.Contains($key)) {
$legacyOutput[$key] = [string]$languageMap[$key]
}
}
$unmappedKeys = New-Object System.Collections.Generic.List[string]
foreach ($entry in $languageMap.GetEnumerator()) {
$key = [string]$entry.Key
if ($key -ceq (Get-TranslationLegacyBoundaryKey)) {
continue
}
if (-not $englishKeySet.Contains($key)) {
$legacyOutput[$key] = [string]$entry.Value
$unmappedKeys.Add($key)
}
}
$updatedMap = Join-TranslationMapWithBoundary -ActiveMap $activeOutput -LegacyMap $legacyOutput -IncludeBoundary
$hasChanges = -not (Test-OrderedStringMapsEqual -Left $languageMap -Right $updatedMap)
if ($hasChanges) {
$changedFiles.Add((Get-RepoRelativePath -RepositoryRoot $resolvedRepositoryRoot -FilePath $languageFile.FullName))
if (-not $CheckOnly -and $PSCmdlet.ShouldProcess($languageFile.FullName, 'Reorder translation file to the English legacy boundary layout')) {
Write-OrderedJsonMap -Path $languageFile.FullName -Map $updatedMap
}
}
$reports.Add([pscustomobject]@{
languageFile = (Get-RepoRelativePath -RepositoryRoot $resolvedRepositoryRoot -FilePath $languageFile.FullName)
changed = $hasChanges
activeKeyCount = $activeOutput.Count
legacyKeyCount = $legacyOutput.Count
unmappedKeyCount = $unmappedKeys.Count
unmappedKeys = $unmappedKeys.ToArray()
})
}
if (-not [string]::IsNullOrWhiteSpace($InventoryOutputPath)) {
$resolvedInventoryOutputPath = Get-FullPath -Path $InventoryOutputPath
$report = [pscustomobject]@{
generatedAt = (Get-Date).ToString('o')
repositoryRoot = $resolvedRepositoryRoot
englishFile = (Get-RepoRelativePath -RepositoryRoot $resolvedRepositoryRoot -FilePath $resolvedEnglishFilePath)
languagesDirectory = (Get-RepoRelativePath -RepositoryRoot $resolvedRepositoryRoot -FilePath $resolvedLanguagesDirectory)
includeEnglish = [bool]$IncludeEnglish
changedFileCount = $changedFiles.Count
changedFiles = $changedFiles.ToArray()
files = $reports.ToArray()
}
New-Utf8File -Path $resolvedInventoryOutputPath -Content ($report | ConvertTo-Json -Depth 6)
}
Write-Output 'Translation boundary reorder summary'
Write-Output "Repository root: $resolvedRepositoryRoot"
Write-Output "Languages directory: $resolvedLanguagesDirectory"
Write-Output "Include English: $([bool]$IncludeEnglish)"
Write-Output "Files processed: $(@($filesToProcess).Count)"
Write-Output "Files changed: $($changedFiles.Count)"
if ($changedFiles.Count -gt 0) {
Write-Output ''
Write-Output 'Changed files:'
foreach ($path in $changedFiles) {
Write-Output (" * {0}" -f $path)
}
}
if ($CheckOnly -and $changedFiles.Count -gt 0) {
throw 'One or more translation files are not aligned to the English legacy boundary layout.'
}