Files
gf-core/src/www/js/gftranslate.js
hallgren 8b4e13ea84 Wide Coverage Demo App: translate to all available target langauges at once
This means that the new translation is available instantly when switching
target languages. It can also reduce space leaks problems in the server
somewhat by avoiding repeated parsing of the source text.
2014-04-29 16:01:57 +00:00

105 lines
3.3 KiB
JavaScript

/* --- GF wide coverage translation interface ------------------------------- */
var gftranslate = {}
gftranslate.jsonurl="/robust/Translate11.pgf"
gftranslate.grammar="Translate" // the name of the grammar
gftranslate.call=function(querystring,cont) {
function errcont(text,code) {
cont([{translations:[{error:code+" "+text}]}])
}
http_get_json(gftranslate.jsonurl+querystring,cont,errcont)
}
function enc_langs(g,to) {
return Array.isArray(to)
? to.map(function(l){return g+l}).join("+")
: g+to
}
// Translate a sentence
gftranslate.translate=function(source,from,to,start,limit,cont) {
var g=gftranslate.grammar
var lexer="&lexer=text"
if(from=="Chi") lexer="",source=source.split("").join(" ")
var encsrc=encodeURIComponent(source)
function extract(result) { cont(result[0].translations) }
if(encsrc.length<500)
gftranslate.call("?command=c-translate&input="+encsrc
+lexer+"&unlexer=text&from="+g+from+"&to="+enc_langs(g,to)
+"&start="+start+"&limit="+limit,extract)
else cont([{error:"sentence too long"}])
}
// Translate a sentence word for word (if all else fails...)
gftranslate.wordforword=function(source,from,to,cont) {
var g=gftranslate.grammar
var lexer="&lexer=text"
if(from=="Chi") lexer="",source=source.split("").join(" ")
var encsrc=encodeURIComponent(source)
function extract(result) { cont(result[0].translations) }
var enc_to = enc_langs(g,to)
if(encsrc.length<500)
gftranslate.call("?command=c-wordforword&input="+encsrc
+lexer+"&unlexer=text&from="+g+from+"&to="+enc_to
,extract)
else cont([{error:"sentence too long"}])
}
// Get list of supported languages
gftranslate.get_languages=function(cont) {
function init2(grammar_info) {
var ls=grammar_info.languages
gftranslate.grammar=grammar_info.name
var langs=[], pre=gftranslate.grammar, n=pre.length
for(var i=0;i<ls.length;i++)
if(ls[i].name.substr(0,n)==pre) langs.push(ls[i].name.substr(n))
gftranslate.targetlist=langs
cont(langs)
}
if(gftranslate.targetlist) cont(gftranslate.targetlist)
else gftranslate.call("?command=c-grammar",init2)
}
// Get functions to test which source and target langauges are supported
gftranslate.get_support=function(cont) {
function support(code) { return gftranslate.targets[code] }
function init2(langs) {
gftranslate.targets=toSet(langs)
cont(support,support)
}
if(gftranslate.targets) cont(support,support)
else gftranslate.get_languages(init2)
}
// trans_text_quality : String -> {quality:String, text:String}
function trans_text_quality(text) {
var quality="default_quality"
switch(text[0]) {
case '+': text=text.substr(1).trimLeft(); quality="high_quality"; break;
case '*': text=text.substr(1).trimLeft(); quality="low_quality"; break;
}
return {quality:quality,text:text}
}
// find_to :: Lang -> [{to:Lang,...}] -> Int
find_to=function(to,lins) {
for(var i=0;i<lins.length;i++)
if(lins[i].to==to) return i
return 0 // Hmm....
}
trans_quality=function(r,to) {
var ix=to ? find_to(to,r.linearizations) : 0
var text=r.linearizations[ix].text
if(r.prob==0) return {quality:"high_quality",text:text}
else {
var t=trans_text_quality(text)
if(t.quality=="default_quality" && r.tree && r.tree[0]=="?")
t.quality="low_quality"
return t
}
}