summaryrefslogtreecommitdiff
path: root/src/www/translator/translator.js
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2012-05-28 16:42:02 +0000
committerhallgren <hallgren@chalmers.se>2012-05-28 16:42:02 +0000
commit9e34a7f7fa462a5ec1333a364affde84b8e2d703 (patch)
treece5fe6f4be6310b664fa9b9fdc90e986f2bd2073 /src/www/translator/translator.js
parentb19ae37d9c603dda1bb31b23059ef7b22bc887d8 (diff)
translator: better support for ambiguous translations
The translator picks "the first" translation by default, but the user can choose among the generated translations from a popup menu.
Diffstat (limited to 'src/www/translator/translator.js')
-rw-r--r--src/www/translator/translator.js82
1 files changed, 54 insertions, 28 deletions
diff --git a/src/www/translator/translator.js b/src/www/translator/translator.js
index b83df8c29..6a9f4d7dc 100644
--- a/src/www/translator/translator.js
+++ b/src/www/translator/translator.js
@@ -80,16 +80,19 @@ Translator.prototype.update_translations=function() {
ts[i].appendChild(text(segment.target+" "))
}
}
- function upd3(txt) {
- segment.target=txt;
+ function upd3(txts) {
+ segment.target=txts[0];
segment.options={method:o.method,from:o.from,to:o.to} // no sharing!
+ if(txts.length>1) segment.choices=txts
+ else delete segment.choices
replace()
}
function upd2(ts) {
+ function unlex(txt,cont) { gfshell('ps -unlextext "'+txt+'"',cont) }
+
switch(ts.length) {
- case 1: gfshell('ps -unlextext "'+ts[0]+'"',upd3); break;
- case 0: upd3("[no translation]");break;
- default: upd3("[ambiguous translation]")
+ case 0: upd3(["[no translation]"]);break;
+ default: mapc(unlex,ts,upd3); break;
}
}
function upd1(translate_output) {
@@ -310,35 +313,46 @@ Translator.prototype.remove=function(el) {
setTimeout(rm,100)
}
-Translator.prototype.edit_translation=function(i) {
- var t=this
- var ds=t.drawing.segments
-
- function replace_segment(sd) {
+Translator.prototype.replace_segment=function(i,sd) {
+ var t=this;
+ var ds=t.drawing.segments;
+
+ if(ds) {
var old=ds[i]
ds[i]=sd
replaceNode(sd,old)
}
+}
- function edit_segment(s) {
- function restore() { replace_segment(t.draw_segment(s,i)) }
- function done() {
- s.options.method="Manual"
- s.options.from=t.document.options.from
- s.options.to=t.document.options.to
- s.target=inp.value // side effect, updating the document in-place
- restore();
- return false;
- }
- var inp=node("input",{name:"it",value:s.target})
- var e=wrap("form",[inp, submit(), button("Cancel",restore)])
- var target=wrap_class("td","target",e)
- var edit=t.draw_segment_given_target(s,target)
- replace_segment(edit)
- e.onsubmit=done
- inp.focus();
+Translator.prototype.pick_translation=function(i,txt) {
+ var t=this
+ var s=t.document.segments[i]
+ s.options.method="Manual"
+ s.target=txt // side effect, updating the document in-place
+ t.replace_segment(i,t.draw_segment(s,i))
+}
+
+Translator.prototype.edit_translation=function(i) {
+ var t=this
+ var s=t.document.segments[i]
+
+ function restore() { t.replace_segment(i,t.draw_segment(s,i)) }
+ function done() {
+ s.options.method="Manual"
+ s.options.from=t.document.options.from
+ s.options.to=t.document.options.to
+ s.target=inp.value // side effect, updating the document in-place
+ restore();
+ return false;
}
- edit_segment(t.document.segments[i])
+
+ var inp=node("input",{name:"it",value:s.target})
+ var e=wrap("form",[inp, submit(), button("Cancel",restore)])
+ var target=wrap_class("td","target",e)
+ var edit=t.draw_segment_given_target(s,target)
+ t.replace_segment(i,edit)
+ e.onsubmit=done
+ inp.focus();
}
function hide_menu(el) {
@@ -405,10 +419,22 @@ Translator.prototype.draw_segment=function(s,i) {
if(opt.from!=dopt.from || opt.to!=dopt.to) txt=span_class("error",txt)
var target=wrap_class("td","target",txt)
function edit() { t.edit_translation(i) }
+ function pick(txt) { t.pick_translation(i,txt) }
target.onclick=edit
+ if(s.choices) appendChildren(target,draw_choices(s.choices,pick))
return t.draw_segment_given_target(s,target)
}
+function draw_choices(txts,onclick) {
+ function opt(txt) {
+ var o=dt(text(txt))
+ o.onclick=function(ev) { ev.stopPropagation(); onclick(txt) }
+ return o
+ }
+ return [span_class("choices",text("+")),
+ wrap_class("dl","popupmenu",map(opt,txts))]
+}
+
Translator.prototype.draw_segment_given_target=function(s,target) {
var t=this