Claire
2 years ago
2 changed files with 245 additions and 0 deletions
@ -0,0 +1,170 @@ |
|||||||
|
<html> |
||||||
|
|
||||||
|
<head> |
||||||
|
<meta charset="ISO-8859-1"> |
||||||
|
<script> |
||||||
|
var to64 = false; |
||||||
|
var txtInput = 'txt64'; |
||||||
|
var txtOutput = 'txtjp'; |
||||||
|
|
||||||
|
var butts = ''; |
||||||
|
|
||||||
|
function utf8_to_b64(str) { |
||||||
|
return window.btoa(unescape(encodeURIComponent(str))); |
||||||
|
} |
||||||
|
|
||||||
|
function b64_to_utf8(str) { |
||||||
|
return decodeURIComponent(escape(window.atob(str))); |
||||||
|
} |
||||||
|
|
||||||
|
function fixtext() { |
||||||
|
try { |
||||||
|
document.getElementById('msg').innerText = ''; |
||||||
|
var txt = document.getElementById(txtInput).value; |
||||||
|
|
||||||
|
if (to64) { |
||||||
|
// txt = txt.replace(/"/g, '""').replace(/\\\//g, '/'); |
||||||
|
txt = utf8_to_b64(txt); |
||||||
|
} else { |
||||||
|
// txt = txt.replace(/""/g, '"').replace(/\//g, '\\\/'); |
||||||
|
txt = b64_to_utf8(txt); |
||||||
|
} |
||||||
|
|
||||||
|
document.getElementById(txtOutput).value = txt; |
||||||
|
document.getElementById('txtcopy').value = txt; |
||||||
|
|
||||||
|
document.getElementById('msg').innerText = "Text converted!"; |
||||||
|
} catch (e) { |
||||||
|
document.getElementById('msg').innerText = e; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async function transtext(str) { |
||||||
|
if (str != '') { |
||||||
|
document.getElementById('msg').innerText = "Translating..."; |
||||||
|
const res = await fetch("https://translate.mentality.rip/translate", { |
||||||
|
method: "POST", |
||||||
|
body: JSON.stringify({ |
||||||
|
q: str, |
||||||
|
source: "ja", |
||||||
|
target: "en" |
||||||
|
}), |
||||||
|
headers: { |
||||||
|
"Content-Type": "application/json" |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
document.getElementById('msg').innerText = "Text translated!"; |
||||||
|
|
||||||
|
// console.log(await res.json()); |
||||||
|
jres = await res.json(); |
||||||
|
document.getElementById('txten').value = jres.translatedText; |
||||||
|
document.getElementById('txtcopy').value = jres.translatedText; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function copytext() { |
||||||
|
try { |
||||||
|
var txtcopy = document.getElementById('txtcopy'); |
||||||
|
txtcopy.select(); |
||||||
|
txtcopy.setSelectionRange(0, 99999); |
||||||
|
document.execCommand("copy"); |
||||||
|
document.getElementById('msg').innerText = 'Copied to clipboard!'; |
||||||
|
} catch (e) { |
||||||
|
document.getElementById('msg').innerText = e; |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style> |
||||||
|
BODY, |
||||||
|
INPUT { |
||||||
|
font-family: 'Perspective Sans', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
||||||
|
} |
||||||
|
|
||||||
|
HR { |
||||||
|
clear: both; |
||||||
|
border: none; |
||||||
|
border-bottom: 1px dashed #6a6a6a; |
||||||
|
} |
||||||
|
|
||||||
|
H4 { |
||||||
|
margin: 0.5em 0; |
||||||
|
} |
||||||
|
|
||||||
|
TEXTAREA { |
||||||
|
clear: both; |
||||||
|
width: 100%; |
||||||
|
max-width: 300px; |
||||||
|
height: calc(50% - 3em); |
||||||
|
min-height: 25px; |
||||||
|
max-height: 100px; |
||||||
|
} |
||||||
|
|
||||||
|
TEXTAREA { |
||||||
|
background-color: #333; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
#buttons, |
||||||
|
#direction, |
||||||
|
#msg { |
||||||
|
float: left; |
||||||
|
margin-bottom: 0.5em; |
||||||
|
} |
||||||
|
|
||||||
|
#buttons { |
||||||
|
margin-right: 0.5em; |
||||||
|
} |
||||||
|
|
||||||
|
#buttons INPUT { |
||||||
|
height: 2.2em; |
||||||
|
font-size: .8em; |
||||||
|
} |
||||||
|
|
||||||
|
#buttons INPUT[name="flip"] { |
||||||
|
padding-bottom: 3px; |
||||||
|
} |
||||||
|
|
||||||
|
#direction { |
||||||
|
margin-bottom: 0; |
||||||
|
line-height: 1.5em; |
||||||
|
font-size: 1.25em; |
||||||
|
} |
||||||
|
|
||||||
|
#msg { |
||||||
|
margin-left: 1em; |
||||||
|
font-size: .9em; |
||||||
|
line-height: 2em; |
||||||
|
color: #0ba82d; |
||||||
|
} |
||||||
|
|
||||||
|
#txtcopy { |
||||||
|
min-height: 0px; |
||||||
|
height: 0px; |
||||||
|
border: none; |
||||||
|
opacity: 0; |
||||||
|
} |
||||||
|
</style> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
<form accept-charset="utf-8"> |
||||||
|
<h4>Base64</h4> |
||||||
|
<textarea id="txt64" onkeyup="fixtext();"></textarea> |
||||||
|
<hr/> |
||||||
|
<div id="buttons"> |
||||||
|
<input type="button" name="submit" onclick="fixtext();" value="Format"> |
||||||
|
<input type="button" name="translate" onclick="transtext(document.getElementById('txtjp').value);" value="Translate"> |
||||||
|
<input type="button" name="copy" onclick="copytext();" value="Copy Result"> |
||||||
|
</div> |
||||||
|
<div id="msg"></div> |
||||||
|
<hr/> |
||||||
|
<h4>Japanese</h4> |
||||||
|
<textarea id="txtjp" disabled="disabled" onkeyup="fixtext();"></textarea> |
||||||
|
<h4>English</h4> |
||||||
|
<textarea id="txten" disabled="disabled"></textarea> |
||||||
|
<textarea id="txtcopy"></textarea> |
||||||
|
</form> |
||||||
|
</body> |
||||||
|
|
||||||
|
</html> |
@ -0,0 +1,75 @@ |
|||||||
|
$lines = Get-Content .\MainMenu.xib -Encoding UTF8 |
||||||
|
|
||||||
|
$output = $lines |
||||||
|
|
||||||
|
$regex = '<string type="base64-UTF8" key="NSDev">(?<txt>.+?)<\/string>' |
||||||
|
|
||||||
|
$strings = [regex]::Matches($lines,$regex) |
||||||
|
|
||||||
|
$url = 'https://translate.mentality.rip/translate' |
||||||
|
|
||||||
|
$errors = @() |
||||||
|
|
||||||
|
$csv = 'Base64JP,UTF8JP,Base64EN,UTF8EN' |
||||||
|
|
||||||
|
foreach($string in $strings) { |
||||||
|
# get the value |
||||||
|
$txt = $string.Groups["txt"].Value |
||||||
|
|
||||||
|
# append appropriate padding |
||||||
|
$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 |
||||||
|
$idx = [array]::IndexOf($strings,$string) |
||||||
|
|
||||||
|
# get percent complete |
||||||
|
$pct = (($idx + 1) / $strings.Count) * 100 |
||||||
|
|
||||||
|
# round the percent |
||||||
|
$pcn = [math]::Round($pct,2) |
||||||
|
|
||||||
|
# update the status bar |
||||||
|
Write-Progress -Activity ("Translating <<" + $utf + ">>") -Status "$pcn% Complete:" -PercentComplete $pct |
||||||
|
|
||||||
|
# create the json request |
||||||
|
$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 { |
||||||
|
Write-Host ("Couldn't translate <<" + $utf + ">>") |
||||||
|
$errors += $utf |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$output | Out-File Output.xib -Encoding utf8 |
||||||
|
$csv | Out-File output.csv -Encoding utf8 |
Loading…
issues.context.reference_issue