Update/Update-TranslationFiles.ps1
<#
.Synopsis Update-TranslationFiles is a function that updates translation files in a repository. .Description This function downloads translation files, extracts them, copies them to the appropriate locations in the repository, and creates a pull request in Azure DevOps. .Parameter authContext A hashtable containing authentication context, including the AccessToken. .Parameter pathToRepo The path to the repository where the translation files will be copied. Default is the build sources directory. .Parameter configPath The path to the configuration file (JSON) that contains repository and application information. Example: { "repositories": [ { "name": "SA Extensions", "applications": [ { "name": "SMART eReporting for Ukraine", "path": "SMART eReporting for Ukraine/app/Translations" } ] } ] } .Parameter branchName The name of the branch where changes will be made. .Parameter translationApps A string containing the names of the translation apps to be processed. .Example Update-TranslationFiles -authContext $authContext -configPath "./config.json" -branchName "update-translations" -translationApps "App1,App2" #> function Update-TranslationFiles { param ( [Parameter(Mandatory=$true)] [hashtable]$authContext, [Parameter(Mandatory=$false)] [string]$pathToRepo = "$env:BUILD_SOURCESDIRECTORY", [Parameter(Mandatory=$true)] [string]$configPath, [Parameter(Mandatory=$true)] [string]$branchName, [Parameter(Mandatory=$true)] [string]$translationApps ) $appPaths = @() $token = $authContext.AccessToken $headers = @{ "Content-Type" = "application/json" "Authorization" = "Bearer $token" } $body = @{ "projects" = $translationApps } | ConvertTo-Json $tempPath = [System.IO.Path]::GetTempPath() $filePath = [System.IO.Path]::Combine($tempPath, "file.zip") try { $response = Invoke-RestMethod -Uri 'https://navdev.smartcloud.com.ua:7148/translationtool/ODataV4/translationapi_getTranslationFiles' -Method Post -Headers $headers -Body $body [System.IO.File]::WriteAllBytes($filePath, [System.Convert]::FromBase64String($response.value)) } catch { Write-Error "Error downloading translation files: $_" return } $newTempDir = [System.IO.Path]::Combine($tempPath, [System.Guid]::NewGuid().ToString()) try { Add-Type -AssemblyName System.IO.Compression.FileSystem [System.IO.Directory]::CreateDirectory($newTempDir) | Out-Null [System.IO.Compression.ZipFile]::ExtractToDirectory($filePath, $newTempDir) Write-Host "Archive extracted to $newTempDir" } catch { Write-Error "Error during archive extraction: $_" return } $config = Get-Content -Raw -Path $configPath | ConvertFrom-Json Write-Host "##[group]Copying translation files" Get-ChildItem -Path $newTempDir -Filter *.xlf | ForEach-Object { $file = $_ $appName = ($file.Name -split '\.')[0] Write-Host "Processing app: $appName" $appPath = $config.repositories | ForEach-Object { $_.applications | Where-Object { $_.name -eq $appName } | ForEach-Object { Join-Path -Path $pathToRepo -ChildPath $_.path } } | Select-Object -First 1 if ($appPath) { $destinationPath = Join-Path -Path $appPath -ChildPath $file.Name try { Copy-Item -Path $file.FullName -Destination $destinationPath -Force if (Test-Path -Path $destinationPath) { $appPaths += $destinationPath Write-Host "Copied $file.Name to $destinationPath" } } catch { Write-Error "Error copying $file.Name to $destinationPath : $_" } } else { Write-Warning "No matching app found for $file.Name" } } Write-Host "##[endgroup]" Set-Location -Path $pathToRepo Write-Host "##[group]Updating translation files in Git" try { git config user.email "hosted.agent@dev.azure.com" git config user.name "Azure Pipeline" git fetch origin master git checkout master git checkout -b $branchName git add . git commit -m "Updated translation files for $branchName" git push origin $branchName $env:AZURE_DEVOPS_EXT_PAT = "$env:SystemAccessToken" az devops login --organization "$env:SYSTEM_COLLECTIONURI" az repos pr create --repository "$env:BUILD_REPOSITORY_NAME" --source-branch $branchName --target-branch master --title $branchName --description "Update translations for $branchName" } catch { Write-Error "Error updating Git repository: $_" } Write-Host "##[endgroup]" } |