diff options
| author | hallgren <hallgren@chalmers.se> | 2014-04-29 16:01:57 +0000 |
|---|---|---|
| committer | hallgren <hallgren@chalmers.se> | 2014-04-29 16:01:57 +0000 |
| commit | 580b8cc78303f864e39472ba7a7f92c1bd0073f8 (patch) | |
| tree | d7d52a0777eee1e398457d74ea16c1576fbe6248 /src | |
| parent | a7b1f9e1b3c042cf2442d8ed665998042acd106e (diff) | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/www/js/gftranslate.js | 25 | ||||
| -rw-r--r-- | src/www/js/wc.js | 70 |
2 files changed, 65 insertions, 30 deletions
diff --git a/src/www/js/gftranslate.js b/src/www/js/gftranslate.js index 5bf1aaa6f..a232bde50 100644 --- a/src/www/js/gftranslate.js +++ b/src/www/js/gftranslate.js @@ -13,6 +13,12 @@ gftranslate.call=function(querystring,cont) { 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 @@ -22,7 +28,7 @@ gftranslate.translate=function(source,from,to,start,limit,cont) { 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="+g+to + +lexer+"&unlexer=text&from="+g+from+"&to="+enc_langs(g,to) +"&start="+start+"&limit="+limit,extract) 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(" ") 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="+g+to + +lexer+"&unlexer=text&from="+g+from+"&to="+enc_to ,extract) else cont([{error:"sentence too long"}]) } @@ -77,12 +84,20 @@ function trans_text_quality(text) { return {quality:quality,text:text} } -function trans_quality(r) { - var text=r.linearizations[0].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[0]=="?") + if(t.quality=="default_quality" && r.tree && r.tree[0]=="?") t.quality="low_quality" return t } diff --git a/src/www/js/wc.js b/src/www/js/wc.js index 2b12ca322..593453623 100644 --- a/src/www/js/wc.js +++ b/src/www/js/wc.js @@ -58,8 +58,8 @@ wc.translate=function() { } function translate_segment(so) { // so = segment output - var rs=[] // list of alternative translations for this segment - var current_pick=0 // index of currently selected alternative + so.rs=[] // list of alternative translations for this segment + so.current_pick=0 // index of currently selected alternative function show_error(msg) { //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_picks() { clear(p) - for(var i=0;i<rs.length;i++) { + for(var i=0;i<so.rs.length;i++) { p.appendChild(text(" ")) var pick=text(i+1) // +"⃝" - if(i!=current_pick) { + if(i!=so.current_pick) { var pick=node("a",{href:"#"},[pick]) 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)) } /* @@ -92,35 +92,37 @@ wc.translate=function() { } function show_more() { 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(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) } so.target.onclick=show_more function show_trans(i) { - var r=rs[i] + var r=so.rs[i] replaceChildren(so.target,text(r.text)) so.text=r.text so.target.className=r.t.quality - current_pick=i + so.current_pick=i if(wc.selected==so) show_more() } function showit2(r) { - rs.push(r) - var j=rs.length-1 - if(current_pick==j) show_trans(j) + so.rs.push(r) + var j=so.rs.length-1 + if(so.current_pick==j) show_trans(j) else if(wc.selected==so) show_picks() //disable(false) } - function showit(r) { - r.t=trans_quality(r) + function showit(r,grammar) { + r.grammar=grammar + r.t=trans_quality(r,grammar+f.to.value) r.text=r.t.text showit2(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} showit2(r) } @@ -130,17 +132,17 @@ wc.translate=function() { if(tra.length>=1) { var r=tra[0] 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 { var r=tra[0] 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") } - 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) { @@ -148,7 +150,7 @@ wc.translate=function() { if(tra.length>=1) { var r=tra[0] if(r.error!=undefined) { - if(i==0 && rs.length==0) { + if(i==0 && so.rs.length==0) { //show_error(tra[0].error) word_for_word(text) } @@ -156,15 +158,15 @@ wc.translate=function() { else { for(var ti=0;ti<tra.length;ti++) { var r=tra[ti] - if(r.linearizations) showit(r) + if(r.linearizations) showit(r,gftranslate.grammar) //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") } - 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 step2cnl(text) { @@ -173,12 +175,12 @@ wc.translate=function() { if(trans && trans.length>=1) { var r=trans[0] r.prob=0 - showit(r) + showit(r,wc.cnl) } step2(text) } 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}, step3cnl, function(){step2(text)}) @@ -187,6 +189,22 @@ wc.translate=function() { 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) clear(wc.o) clear(e) @@ -205,12 +223,13 @@ wc.translate=function() { for(var i=0;i<is.length;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 wc.os[i]=same wc.o.appendChild(same.target) if(same==old_selected) wc.selected=same 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 { // create a new output segment @@ -272,6 +291,7 @@ wc.try_google=function() { // Update language selection menus with the languages supported by the grammar function init_languages() { function init2(langs) { + wc.languages=langs var langset=toSet(langs) function update_menu(m) { var l=m.value |
