mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-24 20:12:51 -06:00
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.
105 lines
3.3 KiB
JavaScript
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
|
|
}
|
|
}
|