google.load("language", "1");
/** * source content object, living in global space so it can be accessed by callbacks */ var sourceLines; // type: Array
/** * a explict point for going through yaml */ var currentLineNumber;
/** * the text field for result output */ var resultField;
/** * the language code of source content */ var sourceLanguageCode = null;
/** * init mark the system is ready */ google.setOnLoadCallback( function(){ updateStatus("Ready".bold()); resultField = $("result_field"); resultField.value = ""; // $("source_content").value = "";
// populate target languages
var values = Object.values(google.language.Languages);
var keys = Object.keys(google.language.Languages);
for(var i = 0; i
$(”language_select”).update(values.join(’ ‘)); } );
/** * update the sataus message * * @param msg [String] the status message to display */ function updateStatus(msg) { $(”status_node”).update(msg); }
/** * start the translation */ function doTranslate() { // get the source content var source_content = $(”source_content”).value.strip();
if(source_content == “”) { reportFailure(”missing source content”); return; }
sourceLines = source_content.split(’\n’); currentLineNumber= 0; resultField.value = “”;
detectLanguage();
return false; }
/** * translate the yaml line by line */ function translateLine() { // reach end? if(currentLineNumber >= sourceLines.length) { updateStatus(”Translation completed”.bold()); return }
// get the current line content var currentLine = sourceLines[currentLineNumber++];
var lineObj = extractContent(currentLine);
if(!lineObj) { addTranslatedResult(currentLine); translateLine(); return; }
addTranslatedResult(lineObj.leadingSpaces+lineObj.key+’:”‘); gTranslate(lineObj.content); }
/**
* detect the language code of the source content
*/
function detectLanguage()
{
for(var i=0; i
}
return false; sourceLanguageCode }
/** * extract content string from a line of yaml code * * @param line [String] a line of yaml code * * @return [{leadingSpaces:String, key:String, content:String}] extracted content string. * If not content string can be extracted, then return null */ function extractContent(line) { // is this a valid key:value line if(line.indexOf(’:') == -1) { return null; }
// is this a valid key:value line, again var strippedLine = line.strip(); if(strippedLine.lastIndexOf(’:') == strippedLine.length -1) { return null }
var lineObj = {}
// translate this line line.scan(/\s+(.*?)\:\s+\”(.*?)\”/, function(match) { // get leading spaces var firstHalf = match[0].split(’:')[0]; var leadingSpaces = ‘ ‘.times(firstHalf.lastIndexOf(’ ‘) + 1);
lineObj = { leadingSpaces:’ ‘.times(firstHalf.lastIndexOf(’ ‘) + 1), key:match[1], content:match[2] } } )
return lineObj; }
/** * add translated line into the result field * * @param content [String] */ function addTranslatedResult(content) { resultField.value += “\n”+ content; }
function padTranslatedResult(content) { content = content.gsub(/\\{\{(.*?)\}\}\<\/span\>/, ‘{{#{1}}}’);
resultField.value += content + ‘”‘;
// scrolling textarea causes blinking in firefox
// resultField.scrollTop = resultField.scrollHeight;
translateLine();
}
/** * report failure message into the output field * * @param msg[String] failure message */ function reportFailure(msg) { resultField.value = “ERROR!!!\n”+msg; }
/** * wrap the google translator */ function gTranslate(text) {
text = text.gsub(/\{\{(.*?)\}\}/, ‘{{#{1}}}‘)
if (!sourceLanguageCode || !$F(”language_select”)) { updateStatus(”Translation halted.”.bold()); reportFailure(”missing source language code or target language code.”); return; }
google.language.translate(text, sourceLanguageCode, $F(”language_select”), function(result) { var translated = document.getElementById(”translation”); if (result.translation) { padTranslatedResult(result.translation); } else { padTranslatedResult(”ERROR!”+ result.error.message +”(code:”+result.error.code+”)”); } }); }
Waiting for Google translate API…