[gedit-plugins/translate] Yandex provider
- From: Jordi Mas <jmas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit-plugins/translate] Yandex provider
- Date: Fri, 4 Aug 2017 19:39:45 +0000 (UTC)
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]