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
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
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)
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
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, )))
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
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
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
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()
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 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
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
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
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 _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)
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"))
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)
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)
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()
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)