mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-27 21:42:50 -06:00
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.
This commit is contained in:
@@ -13,6 +13,12 @@ gftranslate.call=function(querystring,cont) {
|
|||||||
http_get_json(gftranslate.jsonurl+querystring,cont,errcont)
|
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
|
// Translate a sentence
|
||||||
gftranslate.translate=function(source,from,to,start,limit,cont) {
|
gftranslate.translate=function(source,from,to,start,limit,cont) {
|
||||||
var g=gftranslate.grammar
|
var g=gftranslate.grammar
|
||||||
@@ -22,7 +28,7 @@ gftranslate.translate=function(source,from,to,start,limit,cont) {
|
|||||||
function extract(result) { cont(result[0].translations) }
|
function extract(result) { cont(result[0].translations) }
|
||||||
if(encsrc.length<500)
|
if(encsrc.length<500)
|
||||||
gftranslate.call("?command=c-translate&input="+encsrc
|
gftranslate.call("?command=c-translate&input="+encsrc
|
||||||
+lexer+"&unlexer=text&from="+g+from+"&to="+g+to
|
+lexer+"&unlexer=text&from="+g+from+"&to="+enc_langs(g,to)
|
||||||
+"&start="+start+"&limit="+limit,extract)
|
+"&start="+start+"&limit="+limit,extract)
|
||||||
else cont([{error:"sentence too long"}])
|
else cont([{error:"sentence too long"}])
|
||||||
}
|
}
|
||||||
@@ -34,9 +40,10 @@ gftranslate.wordforword=function(source,from,to,cont) {
|
|||||||
if(from=="Chi") lexer="",source=source.split("").join(" ")
|
if(from=="Chi") lexer="",source=source.split("").join(" ")
|
||||||
var encsrc=encodeURIComponent(source)
|
var encsrc=encodeURIComponent(source)
|
||||||
function extract(result) { cont(result[0].translations) }
|
function extract(result) { cont(result[0].translations) }
|
||||||
|
var enc_to = enc_langs(g,to)
|
||||||
if(encsrc.length<500)
|
if(encsrc.length<500)
|
||||||
gftranslate.call("?command=c-wordforword&input="+encsrc
|
gftranslate.call("?command=c-wordforword&input="+encsrc
|
||||||
+lexer+"&unlexer=text&from="+g+from+"&to="+g+to
|
+lexer+"&unlexer=text&from="+g+from+"&to="+enc_to
|
||||||
,extract)
|
,extract)
|
||||||
else cont([{error:"sentence too long"}])
|
else cont([{error:"sentence too long"}])
|
||||||
}
|
}
|
||||||
@@ -77,12 +84,20 @@ function trans_text_quality(text) {
|
|||||||
return {quality:quality,text:text}
|
return {quality:quality,text:text}
|
||||||
}
|
}
|
||||||
|
|
||||||
function trans_quality(r) {
|
// find_to :: Lang -> [{to:Lang,...}] -> Int
|
||||||
var text=r.linearizations[0].text
|
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}
|
if(r.prob==0) return {quality:"high_quality",text:text}
|
||||||
else {
|
else {
|
||||||
var t=trans_text_quality(text)
|
var t=trans_text_quality(text)
|
||||||
if(t.quality=="default_quality" && r.tree[0]=="?")
|
if(t.quality=="default_quality" && r.tree && r.tree[0]=="?")
|
||||||
t.quality="low_quality"
|
t.quality="low_quality"
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ wc.translate=function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function translate_segment(so) { // so = segment output
|
function translate_segment(so) { // so = segment output
|
||||||
var rs=[] // list of alternative translations for this segment
|
so.rs=[] // list of alternative translations for this segment
|
||||||
var current_pick=0 // index of currently selected alternative
|
so.current_pick=0 // index of currently selected alternative
|
||||||
|
|
||||||
function show_error(msg) {
|
function show_error(msg) {
|
||||||
//if(e) e.innerHTML="<span class=low_quality>Translation problem: "+msg+"</span>"
|
//if(e) e.innerHTML="<span class=low_quality>Translation problem: "+msg+"</span>"
|
||||||
@@ -73,14 +73,14 @@ wc.translate=function() {
|
|||||||
function show_pick(i) { return function() { show_trans(i); return false; } }
|
function show_pick(i) { return function() { show_trans(i); return false; } }
|
||||||
function show_picks() {
|
function show_picks() {
|
||||||
clear(p)
|
clear(p)
|
||||||
for(var i=0;i<rs.length;i++) {
|
for(var i=0;i<so.rs.length;i++) {
|
||||||
p.appendChild(text(" "))
|
p.appendChild(text(" "))
|
||||||
var pick=text(i+1) // +"⃝"
|
var pick=text(i+1) // +"⃝"
|
||||||
if(i!=current_pick) {
|
if(i!=so.current_pick) {
|
||||||
var pick=node("a",{href:"#"},[pick])
|
var pick=node("a",{href:"#"},[pick])
|
||||||
pick.onclick=pick.onmouseover=show_pick(i)
|
pick.onclick=pick.onmouseover=show_pick(i)
|
||||||
}
|
}
|
||||||
var q=rs[i].t.quality
|
var q=so.rs[i].t.quality
|
||||||
p.appendChild(span_class("pick "+q,pick))
|
p.appendChild(span_class("pick "+q,pick))
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@@ -92,35 +92,37 @@ wc.translate=function() {
|
|||||||
}
|
}
|
||||||
function show_more() {
|
function show_more() {
|
||||||
wc.selected=so
|
wc.selected=so
|
||||||
var r=rs[current_pick]
|
var r=so.rs[so.current_pick]
|
||||||
if(e) e.innerHTML=(r.prob||"")+"<br>"+(r.tree||"")
|
if(e) e.innerHTML=(r.prob||"")+"<br>"+(r.tree||"")
|
||||||
if(wc.p /*&& rs.length>1*/) show_picks()
|
if(wc.p /*&& so.rs.length>1*/) show_picks()
|
||||||
//if(f.speak.checked) wc.speak(t.text,f.to.value)
|
//if(f.speak.checked) wc.speak(t.text,f.to.value)
|
||||||
}
|
}
|
||||||
so.target.onclick=show_more
|
so.target.onclick=show_more
|
||||||
|
|
||||||
function show_trans(i) {
|
function show_trans(i) {
|
||||||
var r=rs[i]
|
var r=so.rs[i]
|
||||||
replaceChildren(so.target,text(r.text))
|
replaceChildren(so.target,text(r.text))
|
||||||
so.text=r.text
|
so.text=r.text
|
||||||
so.target.className=r.t.quality
|
so.target.className=r.t.quality
|
||||||
current_pick=i
|
so.current_pick=i
|
||||||
if(wc.selected==so) show_more()
|
if(wc.selected==so) show_more()
|
||||||
}
|
}
|
||||||
function showit2(r) {
|
function showit2(r) {
|
||||||
rs.push(r)
|
so.rs.push(r)
|
||||||
var j=rs.length-1
|
var j=so.rs.length-1
|
||||||
if(current_pick==j) show_trans(j)
|
if(so.current_pick==j) show_trans(j)
|
||||||
else if(wc.selected==so) show_picks()
|
else if(wc.selected==so) show_picks()
|
||||||
//disable(false)
|
//disable(false)
|
||||||
}
|
}
|
||||||
function showit(r) {
|
function showit(r,grammar) {
|
||||||
r.t=trans_quality(r)
|
r.grammar=grammar
|
||||||
|
r.t=trans_quality(r,grammar+f.to.value)
|
||||||
r.text=r.t.text
|
r.text=r.t.text
|
||||||
showit2(r)
|
showit2(r)
|
||||||
}
|
}
|
||||||
function show_words(r) {
|
function show_words(r) {
|
||||||
r.text=r.linearizations[0].text
|
var ix=find_to(gftranslate.grammar+f.to.value,r.linearizations)
|
||||||
|
r.text=r.linearizations[ix].text
|
||||||
r.t={quality:"bad_quality",text:r.text}
|
r.t={quality:"bad_quality",text:r.text}
|
||||||
showit2(r)
|
showit2(r)
|
||||||
}
|
}
|
||||||
@@ -130,17 +132,17 @@ wc.translate=function() {
|
|||||||
if(tra.length>=1) {
|
if(tra.length>=1) {
|
||||||
var r=tra[0]
|
var r=tra[0]
|
||||||
if(r.error!=undefined) {
|
if(r.error!=undefined) {
|
||||||
if(i==0 && rs.length==0) show_error(tra[0].error)
|
if(i==0 && so.rs.length==0) show_error(tra[0].error)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var r=tra[0]
|
var r=tra[0]
|
||||||
if(r.linearizations) show_words(r)
|
if(r.linearizations) show_words(r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(i==0 && rs.length==0)
|
else if(i==0 && so.rs.length==0)
|
||||||
show_error("Unable to translate")
|
show_error("Unable to translate")
|
||||||
}
|
}
|
||||||
gftranslate.wordforword(text,f.from.value,f.to.value,step3)
|
gftranslate.wordforword(text,f.from.value,wc.languages || f.to.value,step3)
|
||||||
}
|
}
|
||||||
|
|
||||||
function trans(text,i,count) {
|
function trans(text,i,count) {
|
||||||
@@ -148,7 +150,7 @@ wc.translate=function() {
|
|||||||
if(tra.length>=1) {
|
if(tra.length>=1) {
|
||||||
var r=tra[0]
|
var r=tra[0]
|
||||||
if(r.error!=undefined) {
|
if(r.error!=undefined) {
|
||||||
if(i==0 && rs.length==0) {
|
if(i==0 && so.rs.length==0) {
|
||||||
//show_error(tra[0].error)
|
//show_error(tra[0].error)
|
||||||
word_for_word(text)
|
word_for_word(text)
|
||||||
}
|
}
|
||||||
@@ -156,15 +158,15 @@ wc.translate=function() {
|
|||||||
else {
|
else {
|
||||||
for(var ti=0;ti<tra.length;ti++) {
|
for(var ti=0;ti<tra.length;ti++) {
|
||||||
var r=tra[ti]
|
var r=tra[ti]
|
||||||
if(r.linearizations) showit(r)
|
if(r.linearizations) showit(r,gftranslate.grammar)
|
||||||
//else show_error("no linearizations")
|
//else show_error("no linearizations")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(i==0 && rs.length==0)
|
else if(i==0 && so.rs.length==0)
|
||||||
show_error("Unable to translate")
|
show_error("Unable to translate")
|
||||||
}
|
}
|
||||||
gftranslate.translate(text,f.from.value,f.to.value,i,count,step3)
|
gftranslate.translate(text,f.from.value,wc.languages || f.to.value,i,count,step3)
|
||||||
}
|
}
|
||||||
function step2(text) { trans(text,0,10) }
|
function step2(text) { trans(text,0,10) }
|
||||||
function step2cnl(text) {
|
function step2cnl(text) {
|
||||||
@@ -173,12 +175,12 @@ wc.translate=function() {
|
|||||||
if(trans && trans.length>=1) {
|
if(trans && trans.length>=1) {
|
||||||
var r=trans[0]
|
var r=trans[0]
|
||||||
r.prob=0
|
r.prob=0
|
||||||
showit(r)
|
showit(r,wc.cnl)
|
||||||
}
|
}
|
||||||
step2(text)
|
step2(text)
|
||||||
}
|
}
|
||||||
wc.pgf_online.translate({from:wc.cnl+f.from.value,
|
wc.pgf_online.translate({from:wc.cnl+f.from.value,
|
||||||
to:wc.cnl+f.to.value,
|
//to:wc.cnl+f.to.value,
|
||||||
lexer:"text",unlexer:"text",input:text},
|
lexer:"text",unlexer:"text",input:text},
|
||||||
step3cnl,
|
step3cnl,
|
||||||
function(){step2(text)})
|
function(){step2(text)})
|
||||||
@@ -187,6 +189,22 @@ wc.translate=function() {
|
|||||||
else step2(so.input)
|
else step2(so.input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function change_segment_to(so,to) {
|
||||||
|
var rs=so.rs
|
||||||
|
if(rs) {
|
||||||
|
for(var i=0;i<rs.length;i++) {
|
||||||
|
var r=rs[i]
|
||||||
|
r.t=trans_quality(r,r.grammar+to)
|
||||||
|
r.text=r.t.text
|
||||||
|
if(i==so.current_pick) {
|
||||||
|
so.text=r.text
|
||||||
|
replaceChildren(so.target,text(r.text))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
so.to=to
|
||||||
|
}
|
||||||
|
|
||||||
//disable(true)
|
//disable(true)
|
||||||
clear(wc.o)
|
clear(wc.o)
|
||||||
clear(e)
|
clear(e)
|
||||||
@@ -205,12 +223,13 @@ wc.translate=function() {
|
|||||||
|
|
||||||
for(var i=0;i<is.length;i++) {
|
for(var i=0;i<is.length;i++) {
|
||||||
var same=old[is[i]]
|
var same=old[is[i]]
|
||||||
if(same && same.to==f.to.value && same.from==f.from.value) {
|
if(same /*&& same.to==f.to.value*/ && same.from==f.from.value) {
|
||||||
// reuse an unchanged segment
|
// reuse an unchanged segment
|
||||||
wc.os[i]=same
|
wc.os[i]=same
|
||||||
wc.o.appendChild(same.target)
|
wc.o.appendChild(same.target)
|
||||||
if(same==old_selected) wc.selected=same
|
if(same==old_selected) wc.selected=same
|
||||||
delete old[is[i]] // can't use the same node twice
|
delete old[is[i]] // can't use the same node twice
|
||||||
|
if(same.to!=f.to.value) change_segment_to(same,f.to.value)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// create a new output segment
|
// create a new output segment
|
||||||
@@ -272,6 +291,7 @@ wc.try_google=function() {
|
|||||||
// Update language selection menus with the languages supported by the grammar
|
// Update language selection menus with the languages supported by the grammar
|
||||||
function init_languages() {
|
function init_languages() {
|
||||||
function init2(langs) {
|
function init2(langs) {
|
||||||
|
wc.languages=langs
|
||||||
var langset=toSet(langs)
|
var langset=toSet(langs)
|
||||||
function update_menu(m) {
|
function update_menu(m) {
|
||||||
var l=m.value
|
var l=m.value
|
||||||
|
|||||||
Reference in New Issue
Block a user