summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/www/js/gftranslate.js25
-rw-r--r--src/www/js/wc.js70
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