diff --git a/plugins/google_translation/__init__.py b/plugins/google_translation/__init__.py new file mode 100644 index 000000000..33fb27f0f --- /dev/null +++ b/plugins/google_translation/__init__.py @@ -0,0 +1 @@ +from plugin import GoogleTranslationPlugin \ No newline at end of file diff --git a/plugins/google_translation/plugin.py b/plugins/google_translation/plugin.py new file mode 100644 index 000000000..55bf0dd10 --- /dev/null +++ b/plugins/google_translation/plugin.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +## +## This file is part of Gajim. +## +## Gajim is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published +## by the Free Software Foundation; version 3 only. +## +## Gajim is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Gajim. If not, see . +## +''' +Google Translation plugin. + +Translates (currently only incoming) messages using Google Translate. + +:note: consider this as proof-of-concept +:author: Mateusz Biliński +:since: 25th August 2008 +:copyright: Copyright (2008) Mateusz Biliński +:license: GPL +''' + +import re +import urllib2 +import new +from pprint import pformat + +from common import helpers +from common import gajim + +from plugins import GajimPlugin +from plugins.helpers import log_calls, log +from common import ged +from common import nec + +class GoogleTranslationPlugin(GajimPlugin): + name = u'Google Translation' + short_name = u'google_translation' + version = u'0.1' + description = u'''Translates (currently only incoming) messages using Google Translate.''' + authors = [u'Mateusz Biliński '] + homepage = u'http://blog.bilinski.it' + + @log_calls('GoogleTranslationPlugin') + def init(self): + self.config_dialog = None + #self.gui_extension_points = {} + self.config_default_values = {'from_lang' : ('en', _('Language of text to be translated')), + 'to_lang' : ('fr', _('Language to which translation will be made')), + 'user_agent' : ('Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080213 Firefox/2.0.0.11', + _('User Agent data to be used with urllib2 when connecting to Google Translate service'))} + + #self.events_handlers = {} + + self.events = [GoogleTranslateMessageReceivedEvent] + + self.translated_text_re = \ + re.compile(r'google.language.callbacks.id100\(\'22\',{"translatedText":"(?P[^"]*)"}, 200, null, 200\)') + + def translate_text(self, text, from_lang, to_lang): + text = self.prepare_text_for_url(text) + headers = { 'User-Agent' : self.config['user_agent'] } + translation_url = 'http://www.google.com/uds/Gtranslate?callback=google.language.callbacks.id100&context=22&q=%(text)s&langpair=%(from_lang)s%%7C%(to_lang)s&key=notsupplied&v=1.0'%locals() + + request = urllib2.Request(translation_url, headers=headers) + response = urllib2.urlopen(request) + results = response.read() + + translated_text = self.translated_text_re.search(results).group('text') + + return translated_text + + def prepare_text_for_url(self, text): + ''' + Converts text so it can be used within URL as query to Google Translate. + ''' + + # There should be more replacements for plugin to work in any case: + char_replacements = { ' ' : '%20', + '+' : '%2B'} + + for char, replacement in char_replacements.iteritems(): + text = text.replace(char, replacement) + + return text + + def activate(self): + pass + + def deactivate(self): + pass + +class GoogleTranslateMessageReceivedEvent(nec.NetworkIncomingEvent): + name = 'google-translate-message-received' + base_network_events = ['raw-message-received'] + + def generate(self): + msg_type = self.base_event.xmpp_msg.attrs['type'] + if msg_type == u'chat': + msg_text = "".join(self.base_event.xmpp_msg.kids[0].data) + if msg_text: + from_lang = self.plugin.config['from_lang'] + to_lang = self.plugin.config['to_lang'] + self.base_event.xmpp_msg.kids[0].setData( + self.plugin.translate_text(msg_text, from_lang, to_lang)) + + return False # We only want to modify old event, not emit another, + # so we return False here. + diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index 95952a124..1b1eb7cf3 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -256,6 +256,7 @@ class PluginManager(object): def _register_network_events_in_nec(self, plugin): for event_class in plugin.events: + setattr(event_class, 'plugin', plugin) if issubclass(event_class, nec.NetworkIncomingEvent): gajim.nec.register_incoming_event(event_class) elif issubclass(event_class, nec.NetworkOutgoingEvent):