# read in the xib, original encoding is utf8 $lines = Get-Content .\MainMenu.xib -Encoding UTF8 # set new variable for output # this is where we make our translation edits $output = $lines # pull out every line with a string keyed "NSDev" $regex = '(?.+?)<\/string>' # regex results $strings = [regex]::Matches($lines,$regex) # public translation API - no key required! # throttled to 40 requests per 60 seconds # one request per 1.5 seconds $url = 'https://translate.mentality.rip/translate' # log errors $errors = @() # create a CSV of translated values, to make corrections easier # this is because the final XIB still has base64-encoded strings $csv = 'Base64JP,UTF8JP,Base64EN,UTF8EN' # process every regex match foreach($string in $strings) { # get the base64 value # uses named regex key $txt = $string.Groups["txt"].Value # append appropriate padding # sauce: https://gist.github.com/obscuresec/82775093ad892ef5fd00 $mod = ($txt.length % 4) switch ($mod) { '0' {$txtp = $txt} '1' {$txtp = $txt.Substring(0,$txt.Length - 1)} '2' {$txtp = $txt + ('=' * (4 - $mod))} '3' {$txtp = $txt + ('=' * (4 - $mod))} } # convert the base64 to UTF8 text $utf = [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String($txtp)) # get current array index (for progress bar) $idx = [array]::IndexOf($strings,$string) # get percent complete (for progress bar) $pct = (($idx + 1) / $strings.Count) * 100 # round the percent to one decimal $pcn = [math]::Round($pct,2) # update the status bar Write-Progress -Activity ("Translating <<" + $utf + ">>") -Status "$pcn% Complete:" -PercentComplete $pct # create the json request using Japanese string $json = '{"q":"' + $utf + '","source":"ja","target":"en"}' # add delay due to api throttle Start-Sleep -Seconds 1.5 try { # post the request to the translation service $result = Invoke-WebRequest -Method 'Post' -Uri $url -Body $json -ContentType "application/json; charset=utf-8" # this is the english translation $ttxt = ($result.Content | ConvertFrom-Json).translatedText # convert the english translation to base64 using .net $txt64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($ttxt)) # remove the padding == because these don't exist in the original XIB $txt64clean = $txt64 -replace '=','' # replace the value everywhere it occurs in the source data $output = $output -replace $txt,$txt64clean # add to the csv $csv += "`n""$txt"",""$utf"",""$txt64clean"",""$ttxt""" } catch { # couldn't translate, probably because it's already English Write-Host ("Couldn't translate <<" + $utf + ">>") $errors += $utf } } # save the xib $output | Out-File Output.xib -Encoding utf8 # save the csv $csv | Out-File output.csv -Encoding utf8