#!/usr/bin/env pwsh <# .SYNOPSIS Ищет в mods/*.jar переводы en_us без ru_ru и копирует en_us в наш ресурспак как ru_ru. .DESCRIPTION Для каждого файла вида assets//lang/en_us.json: - если в этом же jar нет assets//lang/ru_ru.json - копируется en_us.json в: resourcepacks/PupaMLupa-Translations/assets//lang/ru_ru.json Это заготовка для ручного перевода (сохраняется английский текст в русское имя файла). #> param( [switch] $DryRun, [switch] $Force ) $ErrorActionPreference = "Stop" Add-Type -AssemblyName System.IO.Compression Add-Type -AssemblyName System.IO.Compression.FileSystem $instanceRoot = Split-Path $PSScriptRoot -Parent $modsDir = Join-Path $instanceRoot "mods" $resourcepackRoot = Join-Path $instanceRoot "resourcepacks/PupaMLupa-Translations" $resourcepackAssets = Join-Path $resourcepackRoot "assets" if (-not (Test-Path -LiteralPath $modsDir)) { Write-Error "Папка mods не найдена: $modsDir" } if (-not (Test-Path -LiteralPath $resourcepackRoot)) { if ($DryRun) { Write-Host "[dry-run] Создал бы ресурспак: $resourcepackRoot" } else { New-Item -ItemType Directory -Path $resourcepackRoot -Force | Out-Null } } if (-not (Test-Path -LiteralPath $resourcepackAssets)) { if ($DryRun) { Write-Host "[dry-run] Создал бы папку assets: $resourcepackAssets" } else { New-Item -ItemType Directory -Path $resourcepackAssets -Force | Out-Null } } $enRegex = '^assets/(?[^/]+)/lang/en_us\.json$' $ruTemplate = 'assets/{0}/lang/ru_ru.json' $totalJars = 0 $missingRuFound = 0 $createdFiles = 0 $skippedExisting = 0 $errors = 0 foreach ($jar in Get-ChildItem -LiteralPath $modsDir -File -Filter "*.jar") { $totalJars++ $zip = $null try { $zip = [System.IO.Compression.ZipFile]::OpenRead($jar.FullName) $entryMap = @{} foreach ($entry in $zip.Entries) { $entryMap[$entry.FullName] = $entry } foreach ($entry in $zip.Entries) { $match = [System.Text.RegularExpressions.Regex]::Match($entry.FullName, $enRegex) if (-not $match.Success) { continue } $modid = $match.Groups["modid"].Value $ruPathInJar = $ruTemplate -f $modid if ($entryMap.ContainsKey($ruPathInJar)) { continue } $missingRuFound++ $destFile = Join-Path $resourcepackRoot $ruPathInJar $destDir = Split-Path $destFile -Parent if ((Test-Path -LiteralPath $destFile) -and -not $Force) { $skippedExisting++ if ($DryRun) { Write-Host "[dry-run] уже есть, пропуск: $ruPathInJar" } continue } if ($DryRun) { Write-Host "[dry-run] $($jar.Name): $($entry.FullName) -> $destFile" $createdFiles++ continue } New-Item -ItemType Directory -Path $destDir -Force | Out-Null $srcStream = $null $dstStream = $null try { $srcStream = $entry.Open() $dstStream = [System.IO.File]::Create($destFile) $srcStream.CopyTo($dstStream) $createdFiles++ } finally { if ($null -ne $dstStream) { $dstStream.Dispose() } if ($null -ne $srcStream) { $srcStream.Dispose() } } } } catch { $errors++ Write-Warning ("Не удалось обработать jar: {0} ({1})" -f $jar.Name, $_.Exception.Message) } finally { if ($null -ne $zip) { $zip.Dispose() } } } Write-Host ("Проверено jar: {0}" -f $totalJars) Write-Host ("Найдено en_us без ru_ru: {0}" -f $missingRuFound) Write-Host ("Подготовлено файлов ru_ru: {0}" -f $createdFiles) if ($skippedExisting -gt 0) { Write-Host ("Пропущено (файл уже существует, без -Force): {0}" -f $skippedExisting) } if ($errors -gt 0) { Write-Host ("Ошибок чтения jar: {0}" -f $errors) }