chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
[CmdletBinding(DefaultParameterSetName = 'Selected')]
|
||||
param(
|
||||
[Parameter(ParameterSetName = 'Selected', Mandatory = $true)]
|
||||
[string[]]$LanguageCodes,
|
||||
|
||||
[Parameter(ParameterSetName = 'All')]
|
||||
[switch]$AllLanguages,
|
||||
|
||||
[switch]$UpdateTranslationDoc,
|
||||
|
||||
[switch]$UpdateReadme,
|
||||
|
||||
[string]$ReadmePath = (Join-Path $PSScriptRoot '..\..\README.md'),
|
||||
|
||||
[string]$TranslationDocPath = (Join-Path $PSScriptRoot '..\..\TRANSLATION.md'),
|
||||
|
||||
[string]$TranslatedPercentagesPath = (Join-Path $PSScriptRoot '..\..\src\Languages\Data\TranslatedPercentages.json')
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
Import-Module (Join-Path $PSScriptRoot 'Languages\LanguageData.psm1') -Force
|
||||
|
||||
function Read-JsonObject {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Path
|
||||
)
|
||||
|
||||
if (-not (Test-Path -Path $Path -PathType Leaf)) {
|
||||
return [ordered]@{}
|
||||
}
|
||||
|
||||
$content = [System.IO.File]::ReadAllText($Path)
|
||||
if ([string]::IsNullOrWhiteSpace($content)) {
|
||||
return [ordered]@{}
|
||||
}
|
||||
|
||||
$parsed = $content | ConvertFrom-Json -AsHashtable
|
||||
if ($null -eq $parsed) {
|
||||
return [ordered]@{}
|
||||
}
|
||||
|
||||
if (-not ($parsed -is [System.Collections.IDictionary])) {
|
||||
throw "JSON root must be an object: $Path"
|
||||
}
|
||||
|
||||
return $parsed
|
||||
}
|
||||
|
||||
function Write-Utf8File {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Path,
|
||||
|
||||
[Parameter(Mandatory = $true)]
|
||||
[AllowEmptyString()]
|
||||
[string]$Content
|
||||
)
|
||||
|
||||
$encoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[System.IO.File]::WriteAllText($Path, $Content, $encoding)
|
||||
}
|
||||
|
||||
function Write-TranslationDocumentation {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Path
|
||||
)
|
||||
|
||||
$encoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[System.IO.File]::WriteAllText($Path, (Get-TranslationDocumentationMarkdown), $encoding)
|
||||
}
|
||||
|
||||
$shouldUpdateTranslationDoc = $UpdateTranslationDoc.IsPresent
|
||||
if ($UpdateReadme.IsPresent) {
|
||||
Write-Warning 'The -UpdateReadme switch is deprecated. Updating TRANSLATION.md instead.'
|
||||
$shouldUpdateTranslationDoc = $true
|
||||
}
|
||||
|
||||
$statusJson = & (Join-Path $PSScriptRoot 'Get-TranslationStatus.ps1') -OutputFormat Json
|
||||
$statusRows = $statusJson | ConvertFrom-Json -AsHashtable
|
||||
if ($null -eq $statusRows) {
|
||||
throw 'Could not load translation status data.'
|
||||
}
|
||||
|
||||
$statusByCode = @{}
|
||||
foreach ($row in $statusRows) {
|
||||
$statusByCode[[string]$row.Code] = $row
|
||||
}
|
||||
|
||||
$codesToUpdate = @()
|
||||
if ($AllLanguages.IsPresent) {
|
||||
$codesToUpdate = @($statusByCode.Keys | Sort-Object)
|
||||
}
|
||||
else {
|
||||
$codesToUpdate = @($LanguageCodes | ForEach-Object { $_.Trim() } | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Sort-Object -Unique)
|
||||
}
|
||||
|
||||
if ($codesToUpdate.Count -eq 0) {
|
||||
throw 'No language codes were provided.'
|
||||
}
|
||||
|
||||
$storedPercentages = Read-JsonObject -Path $TranslatedPercentagesPath
|
||||
$updatedPercentages = [ordered]@{}
|
||||
foreach ($entry in $storedPercentages.GetEnumerator()) {
|
||||
$updatedPercentages[[string]$entry.Key] = [string]$entry.Value
|
||||
}
|
||||
|
||||
foreach ($code in $codesToUpdate) {
|
||||
if (-not $statusByCode.ContainsKey($code)) {
|
||||
throw "Language code '$code' was not found in the computed translation status."
|
||||
}
|
||||
|
||||
$updatedPercentages[$code] = [string]$statusByCode[$code].Completion
|
||||
}
|
||||
|
||||
$percentagesJson = ($updatedPercentages | ConvertTo-Json -Depth 5)
|
||||
Write-Utf8File -Path $TranslatedPercentagesPath -Content $percentagesJson
|
||||
|
||||
if ($shouldUpdateTranslationDoc) {
|
||||
Write-TranslationDocumentation -Path $TranslationDocPath
|
||||
}
|
||||
|
||||
Write-Output ('Updated translation status metadata for: ' + ($codesToUpdate -join ', '))
|
||||
Reference in New Issue
Block a user