[gedit-plugins/translate] Yandex provider



commit a954ad3e33facbf1d839ffde6b3de5c79a440407
Author: Jordi Mas <jmas softcatala org>
Date:   Fri Aug 4 21:39:32 2017 +0200

    Yandex provider

 plugins/translate/tests/testapertium.py          |    8 +-
 plugins/translate/translate/__init__.py          |   16 +++-
 plugins/translate/translate/preferences.py       |    5 +
 plugins/translate/translate/services/apertium.py |    7 +-
 plugins/translate/translate/services/yandex.py   |  126 ++++++++++++++++++++++
 5 files changed, 151 insertions(+), 11 deletions(-)
---
diff --git a/plugins/translate/tests/testapertium.py b/plugins/translate/tests/testapertium.py
index d6da6b6..cacd08f 100644
--- a/plugins/translate/tests/testapertium.py
+++ b/plugins/translate/tests/testapertium.py
@@ -37,13 +37,13 @@ class TestApertium(unittest.TestCase):
         cm.__enter__.return_value = cm
         mock_urlopen.return_value = cm
 
-        apertium = Apertium(False)
+        apertium = Apertium()
         translated = apertium.translate_text('You should have received a copy', 'eng|cat')
         self.assertEqual('Hauries d\'haver-hi rebut una còpia', translated)
         
mock_urlopen.assert_called_with("https://www.apertium.org/apy/translate?langpair=eng|cat&markUnknown=no&q=You+should+have+received+a+copy")
 
     def test__get_remote_language_names_and_pairs_localized(self):
-        mockObject = Apertium(False)
+        mockObject = Apertium()
         mockObject._get_user_locale = Mock(return_value='ca')
         mockObject._get_remote_language_pairs = Mock(return_value=[['es'], ['en'], ['es', 'en'], ['es|en']])
         mockObject._get_remote_language_names = Mock(return_value={'es': 'Espanyol', 'en': 'Anglès'})
@@ -54,7 +54,7 @@ class TestApertium(unittest.TestCase):
         self.assertEqual(['es|en'], Apertium.g_language_codes)
 
     def test__get_remote_language_names_and_pairs_non_localized(self):
-        mockObject = Apertium(False)
+        mockObject = Apertium()
         mockObject._get_user_locale = Mock(return_value='ca_ES')
         mockObject._get_remote_language_pairs = Mock(return_value=[['ca'], ['en'], ['ca', 'en'], ['ca|en']])
         mockObject._get_remote_language_names = Mock(return_value={'es': 'Espanyol', 'en': 'Anglès'})
@@ -73,7 +73,7 @@ class TestApertium(unittest.TestCase):
         cm.__enter__.return_value = cm
         mock_urlopen.return_value = cm
 
-        apertium = Apertium(False)
+        apertium = Apertium()
         language_pair_source, language_pair_target, locales, language_codes = 
apertium._get_remote_language_pairs()
         self.assertEqual(['oci_aran'], language_pair_source)
         self.assertEqual(['cat'], language_pair_target)
diff --git a/plugins/translate/translate/__init__.py b/plugins/translate/translate/__init__.py
index dfeac47..71d665b 100644
--- a/plugins/translate/translate/__init__.py
+++ b/plugins/translate/translate/__init__.py
@@ -83,12 +83,21 @@ class TranslateWindowActivatable(GObject.Object, Gedit.WindowActivatable, PeasGt
 
         self.window.lookup_action('translate').set_enabled(sensitive)
 
- 
-    def get_languages_names_codes(self, service_id):
-        print("get_languages_names_codes. service_id: " + str(service_id))
+
+    def _get_translation_service(self):
         settings = Settings()
         service_id = settings.get_service()
         service = Services.get(service_id)
+        if service.has_api_key() is True:
+            key = settings.get_apikey()
+            service.set_api_key(key)
+            service.init()
+
+        return service
+ 
+    def get_languages_names_codes(self, service_id):
+        print("get_languages_names_codes. service_id: " + str(service_id))
+        service = self._get_translation_service();
         return service.get_language_names(), service.get_language_codes()
 
     def do_create_configure_widget(self):
@@ -168,6 +177,7 @@ class TranslateViewActivatable(GObject.Object, Gedit.ViewActivatable):
         if service.has_api_key() is True:
             key = self._settings.get_apikey()
             service.set_api_key(key)
+            service.init()
 
         return service
 
diff --git a/plugins/translate/translate/preferences.py b/plugins/translate/translate/preferences.py
index 891735c..eec7390 100644
--- a/plugins/translate/translate/preferences.py
+++ b/plugins/translate/translate/preferences.py
@@ -159,6 +159,11 @@ class Preferences(object):
         self._service_id = item[1]
         self._settings.set_service(self._service_id)
         service = Services.get(self._service_id)
+        if service.has_api_key() is True:
+            key = settings.get_apikey()
+            service.set_api_key(key)
+        
+        service.init()
         self._update_api_key_ui(service.has_api_key())
         self._populate_languages()
       
diff --git a/plugins/translate/translate/services/apertium.py 
b/plugins/translate/translate/services/apertium.py
index 4f933a8..828229e 100644
--- a/plugins/translate/translate/services/apertium.py
+++ b/plugins/translate/translate/services/apertium.py
@@ -41,10 +41,6 @@ class Apertium(Service):
 
     SERVER = "https://www.apertium.org/apy";
 
-    def __init__(self, init = True):
-        if init is True:
-            self._get_remote_language_names_and_pairs()
-
     @staticmethod
     def _clean_for_ut():
         Apertium.g_language_codes = []
@@ -57,6 +53,9 @@ class Apertium(Service):
     def set_api_key(self, key):
         pass
 
+    def init(self):
+        self._get_remote_language_names_and_pairs()
+
     def get_language_names(self):
         if len(Apertium.g_language_codes) > 0 and len(Apertium.g_language_names) > 0:
             return Apertium.g_language_names
diff --git a/plugins/translate/translate/services/yandex.py b/plugins/translate/translate/services/yandex.py
new file mode 100644
index 0000000..89dc7ab
--- /dev/null
+++ b/plugins/translate/translate/services/yandex.py
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+#
+#  Copyrignt (C) 2017 Jordi Mas <jmas softcatala org>
+#
+#  This program 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; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program 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 this program; if not, write to the Free Software
+#  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+#  Boston, MA 02110-1301, USA.
+
+import urllib.request, urllib.parse, urllib.error
+import json
+from .service import Service
+
+class Yandex(Service):
+
+    g_language_codes = []
+    g_language_names = []
+    g_locales_names = {}
+
+    DEFAULT_LANGUAGE_NAMES = ["Spanish -> English",
+            "English -> Spanish",
+            "Catalan -> English",
+            "English -> Catalan"]
+
+    DEFAULT_LANGUAGE_CODES = ["es-en",
+            "en|es",
+            "ca|en",
+            "en|ca",
+    ]
+
+    SERVER = "https://translate.yandex.net/api/v1.5/tr.json";
+
+    g_language_codes = []
+    g_language_names = []
+
+    @staticmethod
+    def _clean_for_ut():
+        Yandex.g_language_codes = []
+        Yandex.g_language_names = []
+        Yandex.g_locales_names = {}      
+ 
+    def has_api_key(self):
+        return True
+    
+    def set_api_key(self, key):
+        self._key = key
+
+    def init(self):
+        self._get_remote_language_names()
+
+    def get_language_names(self):
+        if len(Yandex.g_language_codes) > 0 and len(Yandex.g_language_names) > 0:
+            return Yandex.g_language_names
+
+        return self.DEFAULT_LANGUAGE_NAMES
+
+    def get_language_codes(self):
+       if len(Yandex.g_language_codes) > 0 and len(Yandex.g_language_names) > 0:
+            return Yandex.g_language_codes
+
+       return self.DEFAULT_LANGUAGE_CODES
+
+    def get_language_pair_name(self, source, target, locales_names=None):
+        if locales_names is None:
+            locales_names = Yandex.g_locales_names
+
+        source = self._get_language_name(source, locales_names)
+        target = self._get_language_name(target, locales_names)
+        return "{0} -> {1}".format(source, target)
+
+    def _get_language_name(self, langcode, locales_names):
+        return locales_names[langcode]
+      
+    def _get_remote_language_names(self):
+        
+        url = "{0}/getLangs?ui=en&key={1}".format(self.SERVER, self._key)
+        print("url->" + url)
+
+        response = urllib.request.urlopen(url)
+        payload = json.loads(response.read().decode("utf-8"))
+        print("json:" + str(payload))
+
+        language_codes = payload['dirs']
+        language_codes = [x.replace('-', '|') for x in language_codes]
+        locales_names = payload['langs']
+
+        language_names = []
+        for lang_pair in language_codes:
+            langs = lang_pair.split('|')
+            print("langs: " + str(langs))
+            source = langs[0]
+            target = langs[1]
+            name = self.get_language_pair_name(source, target, locales_names)
+            language_names.append(name)
+            
+        Yandex.g_locales_names = locales_names
+        Yandex.g_language_names = language_names
+        Yandex.g_language_codes = language_codes
+        print("g_locales_names:" + str(Yandex.g_locales_names))
+        print("g_language_codes:" + str(Yandex.g_language_codes))
+        print("g_language_names:" + str(Yandex.g_language_names))
+
+    def translate_text(self, text, language_pair):
+        language_pair = language_pair.replace('|', '-')
+        url = "{0}/translate?lang={1}&format=plain&key={2}".format(self.SERVER, language_pair, self._key)
+        url += "&text=" + urllib.parse.quote_plus(text.encode('utf-8'))
+        print("url->" + url)
+        response = urllib.request.urlopen(url)
+        r = response.read().decode("utf-8")
+        data = json.loads(r)
+        all_text = ''
+
+        texts = data['text']
+        for text in texts:
+            all_text += text
+        return all_text


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]