1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2014 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing the Translator plugin.
8"""
9
10import os
11
12from PyQt5.QtCore import pyqtSignal, QObject, QCoreApplication, QDateTime, Qt
13
14from E5Gui.E5Application import e5App
15
16import Preferences
17
18from UiExtensionPlugins.Translator.Translator import Translator
19
20import UI.Info
21
22# Start-Of-Header
23name = "Translator Plugin"
24author = "Detlev Offenbach <detlev@die-offenbachs.de>"
25autoactivate = True
26deactivateable = True
27version = UI.Info.VersionOnly
28className = "TranslatorPlugin"
29packageName = "__core__"
30shortDescription = "Translation utility using various translators."
31longDescription = (
32    """This plug-in implements a utility to translate text using"""
33    """ various online translation services."""
34)
35needsRestart = False
36pyqtApi = 2
37# End-Of-Header
38
39error = ""
40
41translatorPluginObject = None
42
43
44def createTranslatorPage(configDlg):
45    """
46    Module function to create the Translator configuration page.
47
48    @param configDlg reference to the configuration dialog
49    @return reference to the configuration page
50    """
51    from UiExtensionPlugins.Translator.ConfigurationPage import TranslatorPage
52    page = TranslatorPage.TranslatorPage(translatorPluginObject)
53    return page
54
55
56def getConfigData():
57    """
58    Module function returning data as required by the configuration dialog.
59
60    @return dictionary containing the relevant data
61    """
62    icon = (
63        os.path.join("UiExtensionPlugins", "Translator", "icons", "flag-dark")
64        if e5App().usesDarkPalette() else
65        os.path.join("UiExtensionPlugins", "Translator", "icons", "flag-light")
66    )
67    return {
68        "translatorPage": [
69            QCoreApplication.translate("TranslatorPlugin",
70                                       "Translator"),
71            icon, createTranslatorPage, None, None],
72    }
73
74
75def prepareUninstall():
76    """
77    Module function to prepare for an uninstallation.
78    """
79    Preferences.Prefs.settings.remove(TranslatorPlugin.PreferencesKey)
80
81
82class TranslatorPlugin(QObject):
83    """
84    Class implementing the Translator plug-in.
85
86    @signal updateLanguages() emitted to indicate a languages update
87    """
88    PreferencesKey = "Translator"
89
90    updateLanguages = pyqtSignal()
91
92    def __init__(self, ui):
93        """
94        Constructor
95
96        @param ui reference to the user interface object (UI.UserInterface)
97        """
98        super().__init__(ui)
99        self.__ui = ui
100        self.__initialize()
101
102        self.__defaults = {
103            "OriginalLanguage": "en",
104            "TranslationLanguage": "de",
105            "SelectedEngine": "deepl",
106            "EnabledLanguages": ["en", "de", "fr", "cs", "es", "pt",
107                                 "ru", "tr", "zh-CN", "zh-TW"],
108            # service specific settings below
109            # DeepL
110            "DeeplKey": "",
111            # Google
112            "GoogleEnableDictionary": False,
113            "GoogleV2Key": "",
114            # IBM Watson Language Translator
115            "IbmUrl": "",
116            "IbmKey": "",
117            # Microsoft
118            "MsTranslatorKey": "",
119            "MsAuthToken": "",
120            "MsAuthTokenExpire": QDateTime(),
121            # MyMemory
122            "MyMemoryKey": "",
123            "MyMemoryEmail": "",
124            # Yandex
125            "YandexKey": "",
126        }
127
128    def __initialize(self):
129        """
130        Private slot to (re)initialize the plugin.
131        """
132        self.__object = None
133
134    def activate(self):
135        """
136        Public method to activate this plugin.
137
138        @return tuple of None and activation status (boolean)
139        """
140        global error
141        error = ""     # clear previous error
142
143        global translatorPluginObject
144        translatorPluginObject = self
145
146        self.__object = Translator(self, e5App().usesDarkPalette(), self.__ui)
147        self.__object.activate()
148        e5App().registerPluginObject("Translator", self.__object)
149
150        return None, True
151
152    def deactivate(self):
153        """
154        Public method to deactivate this plugin.
155        """
156        e5App().unregisterPluginObject("Translator")
157        self.__object.deactivate()
158
159        self.__initialize()
160
161    def getPreferencesDefault(self, key):
162        """
163        Public method to retrieve the various default settings.
164
165        @param key the key of the value to get
166        @return the requested setting
167        """
168        return self.__defaults[key]
169
170    def getPreferences(self, key):
171        """
172        Public method to retrieve the various settings.
173
174        @param key the key of the value to get
175        @return the requested setting
176        """
177        if key in ["EnabledLanguages"]:
178            return Preferences.toList(
179                Preferences.Prefs.settings.value(
180                    self.PreferencesKey + "/" + key, self.__defaults[key]))
181        elif key in ["GoogleEnableDictionary"]:
182            return Preferences.toBool(
183                Preferences.Prefs.settings.value(
184                    self.PreferencesKey + "/" + key, self.__defaults[key]))
185        elif key in ["MsAuthTokenExpire"]:
186            value = Preferences.Prefs.settings.value(
187                self.PreferencesKey + "/" + key, self.__defaults[key])
188            if isinstance(value, str):
189                if value.startswith("@QDateTime"):
190                    # old value, replace with default
191                    value = self.__defaults[key]
192                else:
193                    value = QDateTime.fromString(value, Qt.DateFormat.ISODate)
194            return value
195        else:
196            return Preferences.Prefs.settings.value(
197                self.PreferencesKey + "/" + key, self.__defaults[key])
198
199    def setPreferences(self, key, value):
200        """
201        Public method to store the various settings.
202
203        @param key the key of the setting to be set (string)
204        @param value the value to be set
205        """
206        if key in ["MsAuthTokenExpire"]:
207            Preferences.Prefs.settings.setValue(
208                self.PreferencesKey + "/" + key,
209                value.toString(Qt.DateFormat.ISODate))
210        else:
211            Preferences.Prefs.settings.setValue(
212                self.PreferencesKey + "/" + key, value)
213
214        if key in ["EnabledLanguages"]:
215            self.updateLanguages.emit()
216
217#
218# eflag: noqa = M801
219