Blob Blame History Raw
# -*- 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

try:
    import gettext
    gettext.bindtextdomain('gedit-plugins')
    gettext.textdomain('gedit-plugins')
    _ = gettext.gettext
except:
    _ = lambda s: s


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 get_default_language_codes(self):
        return 'en|es'

    def get_api_hint(self):
        return _("You need to obtain a free API key at <a href='https://tech.yandex.com/translate/'>https://tech.yandex.com/translate/</a>")

    def has_api_key(self):
        return True

    def set_api_key(self, key):
        self._key = key

    def init(self):
        self._fetch_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 _fetch_remote_language_names(self):

        try:

            if len(self._key) == 0:
                return

            url = "{0}/getLangs?ui=en&key={1}".format(self.SERVER, self._key)
            response = urllib.request.urlopen(url)
            payload = json.loads(response.read().decode("utf-8"))

            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('|')
                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

        except Exception as e:
            print("_fetch_remote_language_names exception {0}".format(e))

    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'))
        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