Files
devolutions--unigetui/scripts/translation/Split-TranslationDiffBatches.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

127 lines
4.5 KiB
PowerShell

[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$SourcePatch,
[Parameter(Mandatory = $true)]
[string]$OutputDir,
[string]$TranslatedPatch,
[string]$ReferencePatch,
[ValidateRange(1, 100)]
[int]$BatchSize = 100,
[switch]$Clean
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
. (Join-Path $PSScriptRoot 'Languages\TranslationJsonTools.ps1')
function New-BatchFileName {
param(
[Parameter(Mandatory = $true)]
[int]$BatchNumber,
[Parameter(Mandatory = $true)]
[string]$Kind
)
return ('batch.{0:D2}.{1}.json' -f $BatchNumber, $Kind)
}
$sourcePatchPath = Get-FullPath -Path $SourcePatch
$outputRoot = Get-FullPath -Path $OutputDir
$translatedPatchPath = if ([string]::IsNullOrWhiteSpace($TranslatedPatch)) { $null } else { Get-FullPath -Path $TranslatedPatch }
$referencePatchPath = if ([string]::IsNullOrWhiteSpace($ReferencePatch)) { $null } else { Get-FullPath -Path $ReferencePatch }
if (-not (Test-Path -Path $sourcePatchPath -PathType Leaf)) {
throw "Source patch not found: $sourcePatchPath"
}
if ($null -ne $translatedPatchPath -and -not (Test-Path -Path $translatedPatchPath -PathType Leaf)) {
throw "Translated patch not found: $translatedPatchPath"
}
if ($null -ne $referencePatchPath -and -not (Test-Path -Path $referencePatchPath -PathType Leaf)) {
throw "Reference patch not found: $referencePatchPath"
}
if ($Clean -and (Test-Path -Path $outputRoot)) {
Remove-Item -Path $outputRoot -Recurse -Force
}
New-Item -Path $outputRoot -ItemType Directory -Force | Out-Null
$sourceMap = Read-OrderedJsonMap -Path $sourcePatchPath
$translatedMap = if ($null -eq $translatedPatchPath) { New-OrderedStringMap } else { Read-OrderedJsonMap -Path $translatedPatchPath }
$referenceMap = if ($null -eq $referencePatchPath) { New-OrderedStringMap } else { Read-OrderedJsonMap -Path $referencePatchPath }
$entries = @($sourceMap.GetEnumerator())
$batchCount = if ($entries.Count -eq 0) { 0 } else { [int][Math]::Ceiling($entries.Count / $BatchSize) }
$manifestBatches = New-Object System.Collections.Generic.List[object]
for ($batchIndex = 0; $batchIndex -lt $batchCount; $batchIndex += 1) {
$batchNumber = $batchIndex + 1
$startIndex = $batchIndex * $BatchSize
$endIndexExclusive = [Math]::Min($startIndex + $BatchSize, $entries.Count)
$batchSourceMap = New-OrderedStringMap
$batchTranslatedMap = New-OrderedStringMap
$batchReferenceMap = New-OrderedStringMap
$batchKeys = New-Object System.Collections.Generic.List[string]
for ($entryIndex = $startIndex; $entryIndex -lt $endIndexExclusive; $entryIndex += 1) {
$entry = $entries[$entryIndex]
$key = [string]$entry.Key
$value = [string]$entry.Value
$batchSourceMap[$key] = $value
$batchKeys.Add($key)
if ($translatedMap.Contains($key)) {
$batchTranslatedMap[$key] = [string]$translatedMap[$key]
}
if ($referenceMap.Contains($key)) {
$batchReferenceMap[$key] = [string]$referenceMap[$key]
}
}
$sourceFileName = New-BatchFileName -BatchNumber $batchNumber -Kind 'source'
$translatedFileName = New-BatchFileName -BatchNumber $batchNumber -Kind 'translated'
$referenceFileName = New-BatchFileName -BatchNumber $batchNumber -Kind 'reference'
Write-OrderedJsonMap -Path (Join-Path $outputRoot $sourceFileName) -Map $batchSourceMap
Write-OrderedJsonMap -Path (Join-Path $outputRoot $translatedFileName) -Map $batchTranslatedMap
Write-OrderedJsonMap -Path (Join-Path $outputRoot $referenceFileName) -Map $batchReferenceMap
$manifestBatches.Add([pscustomobject]@{
batchNumber = $batchNumber
keyCount = $batchSourceMap.Count
source = $sourceFileName
translated = $translatedFileName
reference = $referenceFileName
firstKey = if ($batchKeys.Count -gt 0) { $batchKeys[0] } else { $null }
lastKey = if ($batchKeys.Count -gt 0) { $batchKeys[$batchKeys.Count - 1] } else { $null }
}) | Out-Null
}
$manifest = [pscustomobject]@{
generatedAt = (Get-Date).ToString('o')
sourcePatch = $sourcePatchPath
translatedPatch = $translatedPatchPath
referencePatch = $referencePatchPath
batchSize = $BatchSize
totalKeys = $sourceMap.Count
batchCount = $batchCount
batches = $manifestBatches.ToArray()
}
New-Utf8File -Path (Join-Path $outputRoot 'manifest.json') -Content (($manifest | ConvertTo-Json -Depth 6) + "`r`n")
Write-Output "Created $batchCount translation batch(es) in $outputRoot"