LunaTranslator/py/LunaTranslator/LunaTranslator_main.py
恍兮惚兮 8807005d45 .
2024-11-19 17:31:43 +08:00

258 lines
7.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys, os
def dopathexists(file: str):
import windows
if not file:
return False
if not file.strip():
return False
file = windows.check_maybe_unc_file(file)
if not file:
return False
return bool(windows.PathFileExists(os.path.abspath(file)))
def overridepathexists():
# win7上如果假如没有D盘然后os.path.exists("D:/...")就会弹窗说不存在D盘
os.path.exists = dopathexists
def prepareqtenv():
import windows
from myutils.config import get_platform
# win7 no vcredist2015
windows.addenvpath("./files/runtime/")
if get_platform() != "xp":
windows.LoadLibraryW("./files/runtime/PyQt5/Qt5/bin/Qt5Core.dll")
else:
windows.addenvpath("./files/runtime/Lib/site-packages/PyQt5")
windows.LoadLibraryW("./files/runtime/Lib/site-packages/PyQt5/Qt5Core.dll")
from qtsymbols import QApplication, isqt5, Qt, QFont, QLocale
overridepathexists()
if isqt5:
# 中文字符下不能自动加载
if get_platform() != "xp":
plgs = "./files/runtime/PyQt5/Qt5/plugins"
else:
plgs = "./files/runtime/Lib/site-packages/PyQt5/plugins"
if os.path.exists(plgs):
QApplication.addLibraryPath(plgs)
if get_platform() != "xp":
QApplication.setAttribute(Qt.ApplicationAttribute.AA_EnableHighDpiScaling)
QApplication.setAttribute(Qt.ApplicationAttribute.AA_UseHighDpiPixmaps)
if os.path.exists("./files/runtime/PyQt5/Qt5/bin/Qt5WebEngineCore.dll"):
# maybe use qwebengine
QApplication.setAttribute(Qt.ApplicationAttribute.AA_ShareOpenGLContexts)
if not isqt5:
# devtool
QApplication.setAttribute(
Qt.ApplicationAttribute.AA_DontCreateNativeWidgetSiblings
)
if get_platform() != "xp":
QApplication.setHighDpiScaleFactorRoundingPolicy(
Qt.HighDpiScaleFactorRoundingPolicy.PassThrough
)
font = QFont()
font.setStyleStrategy(QFont.StyleStrategy.PreferAntialias)
font.setHintingPreference(QFont.HintingPreference.PreferFullHinting)
# 必须PreferFullHinting不能PreferNoHinting否则阿拉伯语显示不出来
QApplication.setFont(font)
QLocale.setDefault(QLocale(QLocale.Language.C, QLocale.Country.AnyCountry))
# 香港地区数字乱码
def loadmainui():
import gobject
from LunaTranslator import MAINUI
gobject.baseobject = MAINUI()
gobject.baseobject.loadui()
# gobject.baseobject.urlprotocol()
def checklang():
from myutils.config import globalconfig, oldlanguage, static_data
from qtsymbols import (
QDialog,
pyqtSignal,
Qt,
QFont,
QComboBox,
QVBoxLayout,
QPushButton,
)
import qtawesome
class languageset(QDialog):
getnewsentencesignal = pyqtSignal(str)
getnewtranssignal = pyqtSignal(str, str)
showsignal = pyqtSignal()
def __init__(self):
super(languageset, self).__init__(None, Qt.WindowType.WindowStaysOnTopHint)
self.setWindowIcon(qtawesome.icon("fa.language"))
self.setMinimumSize(400, 100)
self.setWindowTitle("语言设置 LanguageSetting")
font = QFont()
font.setFamily("Arial")
font.setPointSize(20)
self.setFont(font)
self.current = "zh"
language_listcombox = QComboBox()
inner, vis = [_[1] for _ in static_data["language_list_show"]], [
_[0] for _ in static_data["language_list_show"]
]
language_listcombox.addItems(vis)
language_listcombox.currentIndexChanged.connect(
lambda x: setattr(self, "current", inner[x])
)
vb = QVBoxLayout(self)
vb.addWidget(language_listcombox)
bt = QPushButton("OK")
vb.addWidget(bt)
bt.clicked.connect(self.accept)
if "languageuse2" in globalconfig:
return
if globalconfig["language_setted_2.4.5"]:
# 新版改成新的index无关的语言设置
globalconfig["languageuse2"] = oldlanguage[globalconfig["languageuse"]]
globalconfig["tgtlang4"] = oldlanguage[globalconfig["tgtlang3"]]
globalconfig["srclang4"] = oldlanguage[globalconfig["srclang3"]]
return
x = languageset()
x.exec()
globalconfig["language_setted_2.4.5"] = True
globalconfig["languageuse2"] = x.current
globalconfig["tgtlang4"] = x.current
def checkintegrity():
from myutils.config import _TR, static_data, get_platform
from qtsymbols import QMessageBox
js = static_data["checkintegrity"]
flist = js["shared"]
plat = get_platform()
if plat == "xp":
flist = js["xp"]
else:
flist += js[plat]
collect = []
for f in flist:
if os.path.exists(f) == False:
collect.append(os.path.normpath(os.path.abspath(f)))
if len(collect):
msg = QMessageBox()
msg.setText(
_TR("找不到重要组件:")
+ "\n"
+ "\n".join(collect)
+ "\n"
+ _TR("请重新下载并关闭杀毒软件后重试")
)
msg.setWindowTitle(_TR("错误"))
msg.exec()
os._exit(0)
def checkpermission():
from myutils.config import _TR, saveallconfig
from qtsymbols import QMessageBox
try:
saveallconfig(test=True)
# 先写一遍试试,免得到最后配置半天白瞎。
except PermissionError:
msg = QMessageBox()
msg.setText(_TR("权限不足,请以管理员权限运行!"))
msg.setWindowTitle(_TR("错误"))
msg.exec()
os._exit(0)
def switchdir():
dirname = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.chdir(dirname)
sys.path.insert(1, "./")
sys.path.insert(1, "./userconfig")
# 0 是当前目录
# 后面的是系统库或runtime
# 由于自动更新不会删除runtime下可能有历史遗留的同名文件被优先导入
import shutil
# 远古版本的遗留文件,同名导入冲突
try:
shutil.rmtree("./LunaTranslator/requests")
except:
pass
def urlprotocol():
import argparse, gobject, sys
from urllib.parse import urlsplit
from traceback import print_exc
parser = argparse.ArgumentParser()
parser.add_argument("--URLProtocol", required=False)
try:
args = parser.parse_args()
URLProtocol: str = args.URLProtocol
if URLProtocol:
print(URLProtocol)
result = urlsplit(URLProtocol)
netloc = result.netloc.lower()
if netloc == "bangumioauth":
# code=xxx
bangumioauth = gobject.getcachedir("bangumioauth")
with open(bangumioauth, "w", encoding="utf8") as ff:
ff.write(result.query[5:])
os._exit(0)
except Exception:
print_exc()
def is64_bit_os():
import ctypes
is64bit = ctypes.c_bool()
handle = ctypes.windll.kernel32.GetCurrentProcess()
success = ctypes.windll.kernel32.IsWow64Process(handle, ctypes.byref(is64bit))
return (success and is64bit).value
def disablestdio():
import platform
if (int(platform.version().split(".")[0]) <= 6) and (not is64_bit_os()):
# win7 32位有时候print会谜之报错PermissionError WinError 31
sys.stdout = None
sys.stderr = None
if __name__ == "__main__":
disablestdio()
switchdir()
prepareqtenv()
from qtsymbols import QApplication
app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)
checklang()
checkintegrity()
checkpermission()
urlprotocol()
loadmainui()
app.exit(app.exec())