From 715ae884807fa74fc7efb727a01d7822f6dbb3c6 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 16 Nov 2011 14:07:47 +0100 Subject: [PATCH] ability to enable and choose languages for google translation plugin per jid. --- plugins/google_translation/plugin.py | 191 ++++++++++++++++++++++++++- 1 file changed, 184 insertions(+), 7 deletions(-) diff --git a/plugins/google_translation/plugin.py b/plugins/google_translation/plugin.py index 70de53553..d00d1b993 100644 --- a/plugins/google_translation/plugin.py +++ b/plugins/google_translation/plugin.py @@ -30,9 +30,13 @@ import re import urllib2 import HTMLParser import new +import gtk from pprint import pformat from sys import getfilesystemencoding +import chat_control +import groupchat_control + from common import helpers from common import gajim @@ -41,6 +45,67 @@ from plugins.helpers import log_calls, log from common import ged from common import nec +languages = { + _('Afrikaans'): 'af', + _('Albanian'): 'sq', + _('Armenian'): 'hy', + _('Azerbaijani'): 'az', + _('Arabic'): 'ar', + _('Basque'): 'eu', + _('Belarusian'): 'be', + _('Bulgarian'): 'bg', + _('Catalan'): 'ca', + _('Chinese (Simplified)'): 'zh-cn', + _('Chinese (Traditional)'): 'zh-tw', + _('Croatian'): 'hr', + _('Czech'): 'cs', + _('Danish'): 'da', + _('Dutch'): 'nl', + _('English'): 'en', + _('Estonian'): 'et', + _('Filipino'): 'tl', + _('Finnish'): 'fi', + _('French'): 'fr', + _('Galician'): 'gl', + _('Georgian'): 'ka', + _('German'): 'de', + _('Greek'): 'el', + _('Haitian Creole'): 'ht', + _('Hebrew'): 'iw', + _('Hindi'): 'hi', + _('Hungarian'): 'hu', + _('Icelandic'): 'is', + _('Indonesian'): 'id', + _('Italian'): 'it', + _('Irish'): 'da', + _('Japanese'): 'ja', + _('Korean'): 'ko', + _('Latvian'): 'lv', + _('Lithuanian'): 'lt', + _('Macedonian'): 'mk', + _('Malay'): 'ml', + _('Maltese'): 'mt', + _('Norwegian'): 'no', + _('Persian'): 'fa', + _('Polish'): 'pl', + _('Portuguese'): 'pt-BR', + _('Romanian'): 'ro', + _('Russian'): 'ru', + _('Serbian'): 'sr', + _('Slovak'): 'sk', + _('Slovenian'): 'sl', + _('Spanish'): 'es', + _('Swahili'): 'sw', + _('Swedish'): 'sv', + _('Thai'): 'th', + _('Turkish'): 'tr', + _('Ukrainian'): 'uk', + _('Urdu'): 'ur', + _('Vietnamese'): 'vi', + _('Welsh'): 'cy', + _('Yiddish'): 'yi', +} + class GoogleTranslationPlugin(GajimPlugin): @log_calls('GoogleTranslationPlugin') @@ -50,10 +115,7 @@ class GoogleTranslationPlugin(GajimPlugin): self.config_dialog = None self.config_default_values = { - 'from_lang' : - (u'en', u'Language of text to be translated'), - 'to_lang' : - (u'fr', u'Language to which translation will be made'), + 'per_jid_config': ({}, ''), 'user_agent' : (u'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) ' 'Gecko/20080213 Firefox/2.0.0.11', @@ -63,6 +125,12 @@ class GoogleTranslationPlugin(GajimPlugin): self.events_handlers = {'decrypted-message-received': (ged.PREGUI, self._nec_decrypted_message_received)} + self.gui_extension_points = { + 'chat_control_base' : (self.connect_with_control, + self.disconnect_from_control), + } + + self.controls = [] self.translated_text_re = re.compile( r'google.language.callbacks.id100\(\'22\', ' '{"translatedText":"(?P[^"]*)"}, 200, null, 200\)') @@ -103,11 +171,16 @@ class GoogleTranslationPlugin(GajimPlugin): def _nec_decrypted_message_received(self, obj): if not obj.msgtxt: return - from_lang = self.config['from_lang'] - to_lang = self.config['to_lang'] + if obj.jid not in self.config['per_jid_config']: + return + if not self.config['per_jid_config'][obj.jid]['enabled']: + return + from_lang = self.config['per_jid_config'][obj.jid]['from'] + to_lang = self.config['per_jid_config'][obj.jid]['to'] translated_text = self.translate_text(obj.msgtxt, from_lang, to_lang) if translated_text: - obj.msgtxt = translated_text + obj.msgtxt = translated_text + '\n/' + _('Original text:') + '/ ' +\ + obj.msgtxt @log_calls('GoogleTranslationPlugin') def activate(self): @@ -116,3 +189,107 @@ class GoogleTranslationPlugin(GajimPlugin): @log_calls('GoogleTranslationPlugin') def deactivate(self): pass + + @log_calls('GoogleTranslationPlugin') + def connect_with_control(self, control): + base = Base(self, control) + self.controls.append(base) + + @log_calls('GoogleTranslationPlugin') + def disconnect_from_control(self, chat_control): + for base in self.controls: + base.disconnect_from_control() + self.controls = [] + +class Base(object): + def __init__(self, plugin, control): + self.plugin = plugin + self.control = control + self.contact = control.contact + self.account = control.account + self.jid = self.contact.jid + if self.jid in self.plugin.config['per_jid_config']: + self.config = self.plugin.config['per_jid_config'][self.jid] + else: + self.config = {'from': '', 'to': 'en', 'enabled': False} + self.create_buttons() + + def create_buttons(self): + if isinstance(self.control, chat_control.ChatControl): + vbox = self.control.xml.get_object('vbox106') + elif isinstance(self.control, groupchat_control.GroupchatControl): + vbox = self.control.xml.get_object('gc_textviews_vbox') + else: + return + + self.expander = gtk.Expander(_('Google translation')) + hbox = gtk.HBox(spacing=6) + self.expander.add(hbox) + label = gtk.Label(_('Translate from')) + hbox.pack_start(label, False, False) + liststore1 = gtk.ListStore(str, str) + liststore2 = gtk.ListStore(str, str) + cb1 = gtk.ComboBox(liststore1) + cb2 = gtk.ComboBox(liststore2) + cell = gtk.CellRendererText() + cb1.pack_start(cell, True) + cb1.add_attribute(cell, 'text', 0) + cell = gtk.CellRendererText() + cb2.pack_start(cell, True) + cb2.add_attribute(cell, 'text', 0) + #Language to translate from + liststore1.append([_('Auto'), '']) + if self.config['from'] == '': + cb1.set_active(0) + if self.config['from'] == '': + cb1.set_active(0) + i = 0 + ls = languages.items() + ls.sort() + for l in ls: + liststore1.append(l) + if l[1] == self.config['from']: + cb1.set_active(i+1) + liststore2.append(l) + if l[1] == self.config['to']: + cb2.set_active(i) + i += 1 + + hbox.pack_start(cb1, False, False) + label = gtk.Label(_('to')) + hbox.pack_start(label, False, False) + hbox.pack_start(cb2, False, False) + + cb = gtk.CheckButton(_('enable')) + if self.config['enabled']: + cb.set_active(True) + hbox.pack_start(cb, False, False) + vbox.pack_start(self.expander, False, False) + vbox.reorder_child(self.expander, 1) + + cb1.connect('changed', self.on_cb_changed, 'from') + cb2.connect('changed', self.on_cb_changed, 'to') + cb.connect('toggled', self.on_cb_toggled) + self.expander.show_all() + + def on_cb_changed(self, widget, option): + model = widget.get_model() + it = widget.get_active_iter() + self.config[option] = model[it][1] + self.plugin.config['per_jid_config'][self.jid] = self.config + self.plugin.config.save() + + def on_cb_toggled(self, widget): + self.config['enabled'] = widget.get_active() + self.plugin.config['per_jid_config'][self.jid] = self.config + self.plugin.config.save() + + def disconnect_from_control(self): + if isinstance(self.control, chat_control.ChatControl): + vbox = self.control.xml.get_object('vbox106') + elif isinstance(self.control, groupchat_control.GroupchatControl): + vbox = self.control.xml.get_object('gc_textviews_vbox') + else: + return + + vbox.remove(self.expander)