Пример #1
0
    def optionToolBar(self):
        ret = QtWidgets.QToolBar()
        ret.setGraphicsEffect(ui.createGlowEffect(ret))
        skqss.class_(ret, 'webkit toolbar toolbar-opt')

        a = self.siteAct = ret.addAction(u"遊")
        a.setCheckable(True)
        a.setEnabled(False)  # disable on startup
        a.setToolTip(i18n.tr("Display subtitles for the game site"))
        #a.setMenu(self.siteMenu)
        a.triggered.connect(self._injectSite)
        btn = ret.widgetForAction(a)
        btn.setPopupMode(QtWidgets.QToolButton.InstantPopup)

        a = self.annotAct = ret.addAction(u"訳")
        a.setCheckable(True)
        a.setToolTip(i18n.tr("Settings for all sites"))
        a.setMenu(self.annotMenu)
        btn = ret.widgetForAction(a)
        btn.setPopupMode(QtWidgets.QToolButton.InstantPopup)
        a.setChecked(self.isAnnotEnabled())

        a = ret.addAction(
            u"≡")  # U+226, three lines; alternative: "⌘", U+2318 コマンド記号
        a.setToolTip(i18n.tr("Global settings"))
        a.setMenu(self.optionMenu)
        #a.triggered.connect(a.menu().exec_)
        # https://bugreports.qt-project.org/browse/QTBUG-1453
        btn = ret.widgetForAction(a)
        btn.setPopupMode(QtWidgets.QToolButton.InstantPopup)
        return ret
Пример #2
0
    def navigationToolBar(self):
        ret = QtWidgets.QToolBar()
        ret.setGraphicsEffect(ui.createGlowEffect(ret))
        skqss.class_(ret, 'webkit toolbar toolbar-nav')

        a = ret.addAction(u"\u25c0")  # left triangle
        a.triggered.connect(self.back)
        a.setToolTip(u"%s (Ctrl+[, Alt+←, %s: ←)" %
                     (tr_("Back"), i18n.tr("Gesture")))

        a = ret.addAction(u"\u25B6")  # right triangle
        a.triggered.connect(self.forward)
        a.setToolTip(u"%s (Ctrl+], Alt+→, %s: →)" %
                     (tr_("Forward"), i18n.tr("Gesture")))

        #a = ret.addAction(u'\u27f3') # circle
        a = ret.addAction(u"◯")  # まる
        a.triggered.connect(self.refresh)
        a.setToolTip(u"%s (Ctrl+R, %s: ↑↓)" %
                     (tr_("Refresh"), i18n.tr("Gesture")))

        #a = ret.addAction(u"\u238c")
        a = ret.addAction(u"←")  # ひだり
        a.triggered.connect(self.undoCloseTab)
        a.setToolTip(u"%s (Ctrl+Shift+T, %s: ←→)" %
                     (i18n.tr("Undo close tab"), i18n.tr("Gesture")))

        a = ret.addAction(u"+")  # fullwidth +
        a.triggered.connect(self.zoomIn)
        a.setToolTip(u"%s (Ctrl+=)" % tr_("Zoom In"))

        a = ret.addAction(u"ー")  # fullwidth -
        a.triggered.connect(self.zoomIn)
        a.setToolTip(u"%s (Ctrl+-)" % tr_("Zoom Out"))
        return ret
Пример #3
0
 def showProgressMessage(self):
     if self.loadProgress == 0:
         t = "%s ..." % i18n.tr("Loading")
     elif self.loadProgress == 100:
         t = i18n.tr("Loading complete")
     else:
         t = "%s ... %i/100" % (i18n.tr("Loading"), self.loadProgress)
     self.showMessage(t)
Пример #4
0
 def newTabButton(self):
     ret = QtWidgets.QPushButton()
     ret.setGraphicsEffect(ui.createGlowEffect(ret))
     skqss.class_(ret, 'webkit btn-tab-corner')
     ret.setText("+")
     #ret.setToolTip(tr_("New Tab"))
     ret.setToolTip(u"%s (%s, %s, %s: →←)" %
                    (i18n.tr("New Tab"), "Ctrl+T", tr_("Double-click"),
                     i18n.tr("Gesture")))
     ret.clicked.connect(self.newTabAtLastWithBlankPage)
     return ret
Пример #5
0
 def run(self):
     e = self.engine
     if e:
         growl.msg(' '.join((
             i18n.tr("Activate Voiceroid+"),
             self.name,
         )))
         e.run()
     else:
         growl.warn(' '.join((
             i18n.tr("Cannot find Voiceroid+"),
             self.name,
         )))
Пример #6
0
 def createengine():
     from eztrans import eztrans
     ret = eztrans.create_engine()
     ok = ret.load()
     #import atexit
     #atexit.register(ret.destroy) # not needed by eztrans
     if ok:
         growl.msg(i18n.tr("ezTrans XP is loaded"))
     else:
         growl.error(
             i18n.
             tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                ).format(i18n.tr("ezTrans XP")))
     return ret
Пример #7
0
 def createengine():
     from lec import powertrans
     ret = powertrans.create_engine()
     ok = ret.load()
     #import atexit
     #atexit.register(ret.destroy)
     if ok:
         growl.msg(i18n.tr("LEC translator is loaded"))
     else:
         growl.error(
             i18n.
             tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                ).format(i18n.tr("LEC")))
     return ret
Пример #8
0
 def ecEngine(self):
     from dreye import dreyemt
     ret = dreyemt.create_engine('en')
     ok = ret.load()
     #import atexit
     #atexit.register(ret.destroy)
     if ok:
         growl.msg(i18n.tr("Dr.eye English-Chinese translator is loaded"))
     else:
         growl.error(
             i18n.
             tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                ).format(i18n.tr("Dr.eye")))
     return ret
Пример #9
0
 def confirmQuit(self):
     from Qt5.QtWidgets import QMessageBox
     yes = QMessageBox.Yes
     no = QMessageBox.No
     sel = QMessageBox.question(self.__d.rootWindow, u"Website Reader",
                                i18n.tr("Quit the Website Reader?"),
                                yes | no, no)
     if sel == yes:
         self.quit()
Пример #10
0
    def createengine():
        from jbeijing import jbeijing
        ret = jbeijing.create_engine()
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("JBeijing translator is loaded"))

            def _filter(path):
                return bool(path) and os.path.exists(path + '.dic')

            paths = jbeijing.userdic()
            paths.extend(config.JCUSERDIC_LOCATIONS)
            paths = filter(_filter, paths)
            paths = paths[:3]  # at most 3 dictionaries

            ok = ret.setUserDic(paths)

            def _tidy(path):
                path = os.path.dirname(path)
                d = os.path.basename(path)
                path = os.path.dirname(path)
                dd = os.path.basename(path)
                path = os.path.dirname(path)
                ddd = os.path.basename(path)
                return "* " + '/'.join((ddd, dd))

            if ok:
                dics = '<br/>'.join(imap(_tidy, paths))
                #dics = dics.replace('@Goodboyye','@goodboyye').replace('@Hdgdyl','@好大個的鴨梨').replace('@Zhugeqiu', '@諸葛秋')
                growl.msg('<br/>'.join(
                    (i18n.tr("Load user-defined dictionaries") + ":", dics)))
            else:
                dics = '<br/>'.join(imap(_tidy, jbeijing.userdic()))
                growl.error('<br/>'.join(
                    (i18n.tr("Failed to load user-defined dictionaries") + ":",
                     dics)))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(i18n.tr("JBeijing")))
        return ret
Пример #11
0
    def annotMenu(self):
        ret = QtWidgets.QMenu(self.q)

        ss = settings.global_()

        a = ret.addAction(i18n.tr("Display furigana"))
        a.setCheckable(True)
        a.setEnabled(self._jlpAvailable)
        a.setChecked(self._rubyEnabled)
        a.triggered[bool].connect(ss.setRubyEnabled)
        a.triggered[bool].connect(self._setRubyEnabled)
        a.triggered.connect(self._refreshAnnotAct)

        a = self.fullTranslationAct = ret.addAction(
            i18n.tr("Display translation"))
        a.setCheckable(True)
        a.setEnabled(self._translatorAvailable)
        a.setChecked(self._fullTranslationEnabled)
        a.triggered[bool].connect(ss.setFullTranslationEnabled)
        a.triggered[bool].connect(self._setFullTranslationEnabled)
        a.triggered.connect(self._refreshAnnotAct)

        a = self.translationTipAct = ret.addAction(
            i18n.tr("Popup translation when hover"))
        a.setCheckable(True)
        a.setEnabled(self._translatorAvailable)
        a.setChecked(self._translationTipEnabled)
        a.triggered[bool].connect(ss.setTranslationTipEnabled)
        a.triggered[bool].connect(self._setTranslationTipEnabled)
        a.triggered.connect(self._refreshAnnotAct)

        ret.addSeparator()

        a = self.ttsAct = ret.addAction(
            i18n.tr("Text-to-speech when click"))  # おんぷ
        a.setCheckable(True)
        a.setEnabled(self._ttsAvailable)
        a.setChecked(self._ttsEnabled)
        a.triggered[bool].connect(ss.setTtsEnabled)
        a.triggered[bool].connect(self._setTtsEnabled)
        a.setVisible(skos.WIN)  # only enabled on Windows
        a.triggered.connect(self._refreshAnnotAct)

        return ret
Пример #12
0
 def zunkoEngine(self):
     if not self._zunkoEngine:
         ss = settings.reader()
         eng = self._zunkoEngine = _ttsman.ZunkoEngine(
             path=ss.zunkoLocation())
         ss.zunkoLocationChanged.connect(eng.setPath)
         growl.msg(' '.join((
             i18n.tr("Load TTS"),
             eng.name,
         )))
     return self._zunkoEngine
Пример #13
0
 def getSapiEngine(self, key):
     ret = self._sapiEngines.get(key)
     if not ret:
         ret = _ttsman.SapiEngine(
             key=key,
             speed=self.getSpeed(key),
             pitch=self.getPitch(key),
         )
         if ret.isValid():
             growl.msg(' '.join((
                 i18n.tr("Load TTS"),
                 ret.name,
             )))
             self._sapiEngines[key] = ret
         else:
             growl.warn(' '.join((
                 i18n.tr("Failed to load TTS"),
                 key,
             )))
             ret = None
     return ret
Пример #14
0
 def zhtenEngine(self):
     from kingsoft import fastait
     ret = fastait.create_engine(fr='zht', to='en')
     ok = ret.load()
     #import atexit
     #atexit.register(ret.destroy)
     if ok:
         growl.msg(i18n.tr("FastAIT Chinese-English translator is loaded"))
     else:
         growl.error(
             i18n.
             tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                ).format(mytr_("FastAIT")))
     return ret
Пример #15
0
    def _speak(self, text, engine='', language='', verbose=True):
        """
    @param  text  unicode
    @param* engine  str
    @param* language  unicode
    @param* verbose  bool  whether warn on error
    """
        if not text:
            return

        eng = self.getEngine(engine) if engine else None
        if not eng and self.defaultEngineKey and self.defaultEngineKey != engine:
            eng = self.getEngine(self.defaultEngineKey)

        if not eng:
            if verbose:
                growl.warn(i18n.tr("TTS is not available in Preferences"))
            dprint("missing engine: %s" % (engine or self.defaultEngineKey))
            return
        if not eng.isValid():
            #if verbose:
            # Always warn
            growl.warn('<br/>'.join((
                i18n.tr("TTS is not available"),
                eng.name,
            )))
            dprint("invalid engine: %s" % (eng.key))
            return
        if language and language[:2] != eng.language[:2]:
            dprint("language mismatch: %s != %s" % (language, eng.language))
            return

        # Even if text is empty, trigger stop tts
        #if not text:
        #  return
        text = self._repairText(text, eng.key)
        eng.speak(text)
Пример #16
0
    def _createGestures(self):
        from qtgesture.gesture import MouseGesture as G
        self._addGesture((G.NoMatch, ), None, i18n.tr("No match"))

        self._addGesture(
            (G.Down, G.Right),
            partial(
                skevents.runlater,
                self.closeCurrentTab),  # close after existing the event loop
            i18n.tr("Close tab"))

        self._addGesture((G.Right, G.Left),
                         self.newTabAfterCurrentWithBlankPage,
                         i18n.tr("New tab"))
        self._addGesture((G.Left, G.Right), self.undoCloseTab,
                         i18n.tr("Undo close tab"))
        self._addGesture((G.Up, G.Left), self.previousTab,
                         i18n.tr("Previous tab"))
        self._addGesture((G.Up, G.Right), self.nextTab, i18n.tr("Next bab"))
        self._addGesture((G.Up, G.Down), self.refresh, i18n.tr("Refresh"))
        self._addGesture((G.Left, ), self.back, i18n.tr("Back"))
        self._addGesture((G.Right, ), self.forward, i18n.tr("Forward"))
        self._addGesture((G.Down, ), self.openHoveredLinkAfterCurrent,
                         i18n.tr("Open link in background tab"))
Пример #17
0
class JBeijingTranslator(OfflineMachineTranslator):
    key = 'jbeijing'  # override

    def __init__(self, **kwargs):
        super(JBeijingTranslator, self).__init__(**kwargs)
        self.engine = self.createengine()
        self._warned = False  # bool

    @staticmethod
    def createengine():
        from jbeijing import jbeijing
        ret = jbeijing.create_engine()
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("JBeijing translator is loaded"))

            def _filter(path):
                return bool(path) and os.path.exists(path + '.dic')

            paths = jbeijing.userdic()
            paths.extend(config.JCUSERDIC_LOCATIONS)
            paths = filter(_filter, paths)
            paths = paths[:3]  # at most 3 dictionaries

            ok = ret.setUserDic(paths)

            def _tidy(path):
                path = os.path.dirname(path)
                d = os.path.basename(path)
                path = os.path.dirname(path)
                dd = os.path.basename(path)
                path = os.path.dirname(path)
                ddd = os.path.basename(path)
                return "* " + '/'.join((ddd, dd))

            if ok:
                dics = '<br/>'.join(imap(_tidy, paths))
                #dics = dics.replace('@Goodboyye','@goodboyye').replace('@Hdgdyl','@好大個的鴨梨').replace('@Zhugeqiu', '@諸葛秋')
                growl.msg('<br/>'.join(
                    (i18n.tr("Load user-defined dictionaries") + ":", dics)))
            else:
                dics = '<br/>'.join(imap(_tidy, jbeijing.userdic()))
                growl.error('<br/>'.join(
                    (i18n.tr("Failed to load user-defined dictionaries") + ":",
                     dics)))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(i18n.tr("JBeijing")))
        return ret

    def warmup(self):
        """@reimp"""
        self.engine.warmup()

    def translate(self, text, to='zhs', fr='ja', async=False):
        """@reimp"""
        if fr != 'ja':
            return None, None, None
        simplified = to == 'zhs'
        to = 'zhs' if simplified else 'zht'
        repl = self.cache.get(text)
        if repl:
            return repl, to, self.key
        #with SkProfiler():
        repl = self._escapeText(text, to=to)
        if repl:
            repl = repl.replace('\n',
                                ' ')  # JBeijing cannot handle multiple lines
            try:
                #with SkProfiler():
                repl = self._translate(repl,
                                       self.engine.translate,
                                       async=async,
                                       simplified=simplified)
                if repl:
                    repl = wide2thin_digit(
                        repl)  # convert wide digits to thin digits
                    #with SkProfiler():
                    repl = self._unescapeTranslation(repl, to=to)
                    self.cache.update(text, repl)
                    return repl, to, self.key
            #except RuntimeError, e:
            except Exception, e:
                if self._warned:
                    self._warned = True
                    dwarn(e)
                    if not async:
                        growl.error(i18n.tr(
                            "Cannot load {0} for machine translation. Please check Preferences/Location"
                        ).format(i18n.tr("JBeijing")),
                                    async=async)
Пример #18
0
class FastAITTranslator(OfflineMachineTranslator):
    key = 'fastait'  # override

    def __init__(self, **kwargs):
        super(FastAITTranslator, self).__init__(**kwargs)
        self._warned = False  # bool
        self._mutex = QMutex()

    @memoizedproperty
    def jazhsEngine(self):
        from kingsoft import fastait
        ret = fastait.create_engine(fr='ja', to='zhs')
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("FastAIT Japanese-Chinese translator is loaded"))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(mytr_("FastAIT")))
        return ret

    @memoizedproperty
    def jazhtEngine(self):
        from kingsoft import fastait
        ret = fastait.create_engine(fr='ja', to='zht')
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("FastAIT Japanese-Chinese translator is loaded"))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(mytr_("FastAIT")))
        return ret

    @memoizedproperty
    def enzhsEngine(self):
        from kingsoft import fastait
        ret = fastait.create_engine(fr='en', to='zhs')
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("FastAIT English-Chinese translator is loaded"))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(mytr_("FastAIT")))
        return ret

    @memoizedproperty
    def enzhtEngine(self):
        from kingsoft import fastait
        ret = fastait.create_engine(fr='en', to='zht')
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("FastAIT English-Chinese translator is loaded"))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(mytr_("FastAIT")))
        return ret

    @memoizedproperty
    def zhsenEngine(self):
        from kingsoft import fastait
        ret = fastait.create_engine(fr='zhs', to='en')
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("FastAIT Chinese-English translator is loaded"))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(mytr_("FastAIT")))
        return ret

    @memoizedproperty
    def zhtenEngine(self):
        from kingsoft import fastait
        ret = fastait.create_engine(fr='zht', to='en')
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("FastAIT Chinese-English translator is loaded"))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(mytr_("FastAIT")))
        return ret

    def getEngine(self, fr, to):
        langs = fr + to
        if langs == 'jazhs':
            return self.jazhsEngine
        elif langs == 'jazht':
            return self.jazhtEngine
        elif langs == 'enzhs':
            return self.enzhsEngine
        elif langs == 'enzht':
            return self.enzhtEngine
        elif langs == 'zhsen':
            return self.zhsenEngine
        elif langs == 'zhten':
            return self.zhtenEngine

    # Ignored
    #def warmup(self):
    #  """@reimp"""
    #  self.ecEngine.warmup()
    #  self.jcEngine.warmup()

    #__fastait_repl_after = staticmethod(skstr.multireplacer({
    #  '[': u'【',
    #  ' ]': u'】',
    #}))
    def translate(self, text, to='zhs', fr='ja', async=False):
        """@reimp"""
        #async = True # force async
        repl = self.cache.get(text)
        if repl:
            return repl, to, self.key
        engine = self.getEngine(fr=fr, to=to)
        if engine:
            repl = self._escapeText(text, to=to)
            if repl:
                try:
                    repl = self._translate(repl,
                                           partial(self._synchronizedTranslate,
                                                   engine.translate),
                                           async=async,
                                           to=to,
                                           fr=fr)
                    if repl:
                        #sub = self._applySentenceTransformation(sub)
                        #sub = self.__fastait_repl_after(sub)
                        #sub = sub.replace(']', u'】')
                        repl = self._unescapeTranslation(repl, to=to)
                        self.cache.update(text, repl)
                        return repl, to, self.key
                #except RuntimeError, e:
                except Exception, e:
                    if not self._warned:
                        self._warned = True
                        dwarn(e)  # This might crash colorama TT
                        if not async:
                            growl.error(i18n.tr(
                                "Cannot load {0} for machine translation. Please check Preferences/Location"
                            ).format(i18n.tr("FastAIT")),
                                        async=async)
Пример #19
0
                    repl = wide2thin(
                        repl
                    )  #.replace(u". 。", ". ").replace(u"。", ". ").replace(u" 」", u"」").rstrip()
                    repl = self._unescapeTranslation(repl, to=to)
                    repl = repl.replace(u" 」",
                                        u"」")  # remove the trailing space
                    self.cache.update(text, repl)
                    return repl, to, self.key
            #except RuntimeError, e:
            except Exception, e:
                if not self._warned:
                    self._warned = True
                    dwarn(e)
                    if not async:
                        growl.error(i18n.tr(
                            "Cannot load {0} for machine translation. Please check Preferences/Location"
                        ).format(i18n.tr("ATLAS")),
                                    async=async)
        return None, None, None


class LecTranslator(OfflineMachineTranslator):
    key = 'lec'  # override
    splitsSentences = True

    #_DELIM_SET = _SENTENCE_SET # override
    #_DELIM_RE = _SENTENCE_RE # override

    def __init__(self, **kwargs):
        super(LecTranslator, self).__init__(**kwargs)
        self.engine = self.createengine()
Пример #20
0
class DreyeTranslator(OfflineMachineTranslator):
    key = 'dreye'  # override

    def __init__(self, **kwargs):
        super(DreyeTranslator, self).__init__(**kwargs)
        self._warned = False  # bool

    @memoizedproperty
    def jcEngine(self):
        from dreye import dreyemt
        ret = dreyemt.create_engine('ja')
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("Dr.eye Japanese-Chinese translator is loaded"))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(i18n.tr("Dr.eye")))
        return ret

    @memoizedproperty
    def ecEngine(self):
        from dreye import dreyemt
        ret = dreyemt.create_engine('en')
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("Dr.eye English-Chinese translator is loaded"))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(i18n.tr("Dr.eye")))
        return ret

    # Ignored
    #def warmup(self):
    #  """@reimp"""
    #  self.ecEngine.warmup()
    #  self.jcEngine.warmup()

    #__dreye_repl_after = staticmethod(skstr.multireplacer({
    #  '[': u'【',
    #  ' ]': u'】',
    #}))
    def translate(self, text, to='zhs', fr='ja', async=False):
        """@reimp"""
        if fr == 'zht':
            text = zht2zhs(text)
        engine = self.jcEngine if fr == 'ja' else self.ecEngine
        repl = self.cache.get(text)
        if repl:
            return repl, to, self.key
        repl = self._escapeText(text, to=to)
        if repl:
            try:
                repl = self._translate(repl,
                                       engine.translate,
                                       async=async,
                                       to=to,
                                       fr=fr)
                if repl:
                    if to != 'zhs':
                        repl = zhs2zht(repl)
                    #sub = self._applySentenceTransformation(sub)
                    #sub = self.__dreye_repl_after(sub)
                    #sub = sub.replace(']', u'】')
                    repl = self._unescapeTranslation(repl, to=to)
                    self.cache.update(text, repl)
                    return repl, to, self.key
            #except RuntimeError, e:
            except Exception, e:
                if not self._warned:
                    self._warned = True
                    dwarn(e)  # This might crash colorama TT
                    if not async:
                        growl.error(i18n.tr(
                            "Cannot load {0} for machine translation. Please check Preferences/Location"
                        ).format(i18n.tr("Dr.eye")),
                                    async=async)