|
|
|
# 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 type="base64-UTF8" key="NSDev">(?<txt>.+?)<\/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
|