Auteur : Jean Christophe André
Date de création : 28 septembre 2009
"""
-
+import sys
from threading import Thread
from Queue import Queue
-import xmpp
-
-import pygtk
-pygtk.require('2.0')
-import gtk, gobject
-
+try:
+ import xmpp
+ import pygtk
+ pygtk.require('2.0')
+ import gtk
+ import gobject
+except ImportError:
+ modules = ['xmpp','gtk2','gobject']
+ print u"Ce programme requiert l'installation des paquets Debian suivants :"
+ print u"* python-" + "\n* python-".join(modules)
+ sys.exit(-1)
+
+debug = False
def DEBUG(message):
- #print "\x1b[31;1mDEBUG\x1b[m:", message
+ if debug:
+ print "\x1b[31;1mDEBUG\x1b[m:", message
return
class XmppTranslator(Thread):
def __init__(self, jid, password):
Thread.__init__(self)
self.setDaemon(True)
+ self._quit = False
+
self._input_queue = Queue(0)
self._output_queue = Queue(0)
- self._quit = False
+ self._last_text_to_translate = {}
self._jid = xmpp.JID(jid)
self._password = password
self._client.Process(1)
def request_translation(self, translation_path, text):
+ text = text.strip().replace('\r\n','\n')
+ # skip consecutive identical requests
+ if text == self._last_text_to_translate.get(translation_path):
+ return
+ self._last_text_to_translate[translation_path] = text
# remove any pending translation job
while not self._input_queue.empty():
self._input_queue.get()
self.window.set_title(u"PygTranslator")
self.window.set_border_width(0)
self.window.connect("destroy", lambda w: gtk.main_quit())
- self.window.connect("delete_event", self.delete_event)
+ self.window.connect("delete_event", self._delete_event)
vbox = gtk.VBox(True, 0)
vbox.show()
scroll.add(textview)
scroll.show()
frame = gtk.Frame(u"Texte en français")
- frame.connect("key_release_event", self.key_release_event, 'fr')
+ frame.connect("key_release_event", self._text_change, 'fr')
+ frame.connect("button_release_event", self._text_change, 'fr')
frame.add(scroll)
frame.show()
vbox.pack_start(frame, True, True, 0)
scroll.add(textview)
scroll.show()
frame = gtk.Frame(u"Text in English")
- frame.connect("key_release_event", self.key_release_event, 'en')
+ frame.connect("key_release_event", self._text_change, 'en')
+ frame.connect("button_release_event", self._text_change, 'en')
frame.add(scroll)
frame.show()
vbox.pack_start(frame, True, True, 0)
self.window.add(vbox)
self.window.show()
- def run(self):
- DEBUG("running graphic interface")
- gobject.timeout_add(100, self.process_translation_result)
- gtk.gdk.threads_init()
- gtk.main()
-
- def delete_event(self, widget, event, data=None):
+ def _delete_event(self, widget, event, data=None):
DEBUG("caught delete event")
gtk.main_quit()
return False
- def key_release_event(self, widget, event, lang):
+ def _text_change(self, widget, event, lang):
start, end = self._textbuf[lang].get_bounds()
text = self._textbuf[lang].get_text(start, end)
other_lang = (set(self._textbuf.keys()) - set((lang,))).pop()
translation_path = lang + '2' + other_lang
self._translator.request_translation(translation_path, text)
- def process_translation_result(self):
+ def _process_translation_result(self):
result = {}
# FIXME: to transform into an iterator...
while True:
self._translator.translation_done()
for lang, text in result.items():
self._textbuf[lang].set_text(text)
- gobject.timeout_add(100, self.process_translation_result)
+ gobject.timeout_add(300, self._process_translation_result)
+
+ def run(self):
+ DEBUG("running graphic interface")
+ gobject.timeout_add(300, self._process_translation_result)
+ gtk.gdk.threads_init()
+ gtk.main()
if __name__ == "__main__":
- import sys
+ if len(sys.argv) > 1 and sys.argv[1] == '-d':
+ debug = True
+ del(sys.argv[1])
if len(sys.argv) != 3:
- print "Usage: %s <jid> <password>" % sys.argv[0]
+ print "Usage: %s [-d] <jid> <password>" % sys.argv[0]
sys.exit(1)
translator = XmppTranslator(sys.argv[1], sys.argv[2])