This commit is contained in:
恍兮惚兮 2024-06-09 12:18:53 +08:00
parent 83b352da6d
commit 01d2354e45
30 changed files with 798 additions and 277 deletions

View File

@ -10,6 +10,7 @@ from myutils.config import (
savegametaged, savegametaged,
_TR, _TR,
_TRL, _TRL,
postprocessconfig,
globalconfig, globalconfig,
static_data, static_data,
) )
@ -20,9 +21,16 @@ from myutils.utils import (
str2rgba, str2rgba,
gamdidchangedtask, gamdidchangedtask,
titlechangedtask, titlechangedtask,
selectdebugfile,
targetmod, targetmod,
) )
from gui.inputdialog import noundictconfigdialog1, autoinitdialog from gui.codeacceptdialog import codeacceptdialog
from gui.inputdialog import (
noundictconfigdialog1,
autoinitdialog,
autoinitdialog_items,
postconfigdialog,
)
from gui.specialwidget import ( from gui.specialwidget import (
ScrollFlow, ScrollFlow,
chartwidget, chartwidget,
@ -47,6 +55,7 @@ from gui.usefulwidget import (
makesubtab_lazy, makesubtab_lazy,
tabadd_lazy, tabadd_lazy,
getsimpleswitch, getsimpleswitch,
threebuttons,
getspinbox, getspinbox,
selectcolor, selectcolor,
listediter, listediter,
@ -407,20 +416,8 @@ class browserdialog(saveposwindow):
self.tagswidget.addTags(items) self.tagswidget.addTags(items)
def startupnavi(self, exepath): def startupnavi(self, exepath):
for idx in range(1, 100): for idx in range(2, 100):
if idx == 1: if idx == 2:
if exepath:
hasvndb = bool(
savehook_new_data[exepath]["infopath"]
and os.path.exists(savehook_new_data[exepath]["infopath"])
)
if hasvndb:
navitarget = self.parsehtml(
savehook_new_data[exepath]["infopath"]
)
break
elif idx == 2:
if exepath: if exepath:
if len(savehook_new_data[exepath]["relationlinks"]): if len(savehook_new_data[exepath]["relationlinks"]):
navitarget = savehook_new_data[exepath]["relationlinks"][-1][1] navitarget = savehook_new_data[exepath]["relationlinks"][-1][1]
@ -568,6 +565,67 @@ def calculate_centered_rect(original_rect: QRect, size: QSize) -> QRect:
return new_rect return new_rect
def maybehavebutton(self, game, post):
if post == "_11":
savehook_new_data[game]["save_text_process_info"]["mypost"] = str(
uuid.uuid4()
).replace("-", "_")
return getcolorbutton(
globalconfig,
"",
callback=functools.partial(
selectdebugfile,
savehook_new_data[game]["save_text_process_info"]["mypost"],
ismypost=True,
),
icon="fa.gear",
constcolor="#FF69B4",
)
else:
if post not in postprocessconfig:
return
if post == "_remove_chaos":
return getcolorbutton(
globalconfig,
"",
icon="fa.gear",
constcolor="#FF69B4",
callback=lambda: codeacceptdialog(self),
)
elif "args" in postprocessconfig[post]:
if isinstance(list(postprocessconfig[post]["args"].values())[0], dict):
callback = functools.partial(
postconfigdialog,
self,
savehook_new_data[game]["save_text_process_info"][
"postprocessconfig"
][post]["args"],
postprocessconfig[post]["name"],
)
else:
items = autoinitdialog_items(
savehook_new_data[game]["save_text_process_info"][
"postprocessconfig"
][post]
)
callback = functools.partial(
autoinitdialog,
self,
postprocessconfig[post]["name"],
600,
items,
)
return getcolorbutton(
globalconfig,
"",
callback=callback,
icon="fa.gear",
constcolor="#FF69B4",
)
else:
return None
class dialog_setting_game_internal(QWidget): class dialog_setting_game_internal(QWidget):
def selectexe(self): def selectexe(self):
f = QFileDialog.getOpenFileName(directory=self.exepath) f = QFileDialog.getOpenFileName(directory=self.exepath)
@ -626,30 +684,47 @@ class dialog_setting_game_internal(QWidget):
functools.partial(savehook_new_data[exepath].__setitem__, "title") functools.partial(savehook_new_data[exepath].__setitem__, "title")
) )
titleedit.returnPressed.connect(_titlechange) titleedit.returnPressed.connect(_titlechange)
formLayout.addRow(_TR("标题"), titleedit)
formLayout.addRow(
_TR("标题"),
getboxlayout(
[
titleedit,
getcolorbutton(
"",
"",
_titlechange,
icon="fa.search",
constcolor="#FF69B4",
),
]
),
)
methodtab, do = makesubtab_lazy( methodtab, do = makesubtab_lazy(
_TRL( _TRL(
[ [
"启动", "启动",
"HOOK", "HOOK",
"文本处理",
"画廊", "画廊",
"标签", "标签",
"元数据", "元数据",
"统计", "统计",
"预翻译",
"语音", "语音",
"预翻译",
"存档备份", "存档备份",
] ]
), ),
[ [
functools.partial(self.doaddtab, self.starttab, exepath), functools.partial(self.doaddtab, self.starttab, exepath),
functools.partial(self.doaddtab, self.gethooktab, exepath), functools.partial(self.doaddtab, self.gethooktab, exepath),
functools.partial(self.doaddtab, self.gettextproc, exepath),
functools.partial(self.doaddtab, self.fengmiantab, exepath), functools.partial(self.doaddtab, self.fengmiantab, exepath),
functools.partial(self.doaddtab, self.getlabelsetting, exepath), functools.partial(self.doaddtab, self.getlabelsetting, exepath),
functools.partial(self.doaddtab, self.metadataorigin, exepath), functools.partial(self.doaddtab, self.metadataorigin, exepath),
functools.partial(self.doaddtab, self.getstatistic, exepath), functools.partial(self.doaddtab, self.getstatistic, exepath),
functools.partial(self.doaddtab, self.getpretranstab, exepath),
functools.partial(self.doaddtab, self.getttssetting, exepath), functools.partial(self.doaddtab, self.getttssetting, exepath),
functools.partial(self.doaddtab, self.getpretranstab, exepath),
functools.partial(self.doaddtab, self.getbackup, exepath), functools.partial(self.doaddtab, self.getbackup, exepath),
], ],
delay=True, delay=True,
@ -690,30 +765,41 @@ class dialog_setting_game_internal(QWidget):
vndbid.returnPressed.connect( vndbid.returnPressed.connect(
functools.partial(gamdidchangedtask, key, idname, exepath) functools.partial(gamdidchangedtask, key, idname, exepath)
) )
_vbox_internal = [
vndbid,
getcolorbutton(
"",
"",
functools.partial(self.openrefmainpage, key, idname, exepath),
icon="fa.chrome",
constcolor="#FF69B4",
),
getcolorbutton(
"",
"",
functools.partial(gamdidchangedtask, key, idname, exepath),
icon="fa.search",
constcolor="#FF69B4",
),
]
try:
__settting = targetmod[key].querysettingwindow
_vbox_internal.insert(
1,
getcolorbutton(
"",
"",
functools.partial(__settting, self),
icon="fa.gear",
constcolor="#FF69B4",
),
)
except:
pass
formLayout.addRow( formLayout.addRow(
key, key,
getboxlayout( getboxlayout(_vbox_internal),
[
vndbid,
getcolorbutton(
"",
"",
functools.partial(
self.openrefmainpage, key, idname, exepath
),
icon="fa.chrome",
constcolor="#FF69B4",
),
getcolorbutton(
"",
"",
functools.partial(gamdidchangedtask, key, idname, exepath),
icon="fa.search",
constcolor="#FF69B4",
),
]
),
) )
return _w return _w
@ -1068,24 +1154,171 @@ class dialog_setting_game_internal(QWidget):
) )
return _w return _w
def gettextproc(self, exepath):
_w = QWidget()
formLayout = QFormLayout()
_w.setLayout(formLayout)
__extra = QWidget()
def __function(_):
__extra.setEnabled(not _)
formLayout.addRow(
_TR("跟随默认"),
getsimpleswitch(
savehook_new_data[exepath],
"textproc_follow_default",
callback=__function,
),
)
__extra.setEnabled(not savehook_new_data[exepath]["textproc_follow_default"])
vbox = QVBoxLayout()
vbox.setContentsMargins(0, 0, 0, 0)
__extra.setLayout(vbox)
formLayout.addWidget(__extra)
model = QStandardItemModel()
model.setHorizontalHeaderLabels(_TRL(["使用", "预处理方法", "设置"]))
table = QTableView()
table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
table.setSelectionMode((QAbstractItemView.SelectionMode.SingleSelection))
table.setWordWrap(False)
table.setModel(model)
table.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
table.customContextMenuRequested.connect(self.__privatetextproc_showmenu)
self.__textprocinternaltable = table
self.__textprocinternalmodel = model
self.__privatetextproc_exe = exepath
for row, k in enumerate(
savehook_new_data[exepath]["save_text_process_info"]["rank"]
): # 2
self.__checkaddnewmethod(row, k)
vbox.addWidget(table)
buttons = threebuttons(btns=2, texts=_TRL(["添加行", "删除行"]))
buttons.btn1clicked.connect(self.__privatetextproc_btn1)
buttons.btn2clicked.connect(self.__privatetextproc_btn2)
vbox.addWidget(buttons)
return _w
def __privatetextproc_showmenu(self, p):
r = self.__textprocinternaltable.currentIndex().row()
if r < 0:
return
menu = QMenu(self.__textprocinternaltable)
remove = QAction(_TR("删除"))
up = QAction(_TR("上移"))
down = QAction(_TR("下移"))
menu.addAction(remove)
menu.addAction(up)
menu.addAction(down)
action = menu.exec(self.__textprocinternaltable.cursor().pos())
if action == remove:
self.__privatetextproc_btn2()
elif action == up:
self.__privatetextproc_moverank(-1)
elif action == down:
self.__privatetextproc_moverank(1)
def __privatetextproc_moverank(self, dy):
__row = self.__textprocinternaltable.currentIndex().row()
__list = savehook_new_data[self.__privatetextproc_exe][
"save_text_process_info"
]["rank"]
game = __list[__row]
idx1 = __list.index(game)
idx2 = (idx1 + dy) % len(__list)
__list.insert(idx2, __list.pop(idx1))
self.__textprocinternalmodel.removeRow(idx1)
self.__checkaddnewmethod(idx2, game)
self.__textprocinternaltable.setCurrentIndex(
self.__textprocinternalmodel.index(__row, 0)
)
def __checkaddnewmethod(self, row, _internal):
self.__textprocinternalmodel.insertRow(
row,
[
QStandardItem(),
QStandardItem(postprocessconfig[_internal]["name"]),
QStandardItem(),
],
)
__dict = savehook_new_data[self.__privatetextproc_exe][
"save_text_process_info"
]["postprocessconfig"]
if _internal not in __dict:
__dict[_internal] = postprocessconfig[_internal]
__dict[_internal]["use"] = True
btn = maybehavebutton(self, self.__privatetextproc_exe, _internal)
self.__textprocinternaltable.setIndexWidget(
self.__textprocinternalmodel.index(row, 0),
getsimpleswitch(__dict[_internal], "use"),
)
if btn:
self.__textprocinternaltable.setIndexWidget(
self.__textprocinternalmodel.index(row, 2),
btn,
)
def __privatetextproc_btn2(self):
row = self.__textprocinternaltable.currentIndex().row()
if row < 0:
return
self.__textprocinternalmodel.removeRow(row)
_dict = savehook_new_data[self.__privatetextproc_exe]["save_text_process_info"]
post = _dict["rank"][row]
_dict["rank"].pop(row)
if post in _dict["postprocessconfig"]:
_dict["postprocessconfig"].pop(post)
def __privatetextproc_btn1(self):
__viss = [
postprocessconfig[_internal]["name"] for _internal in postprocessconfig
]
def __callback(d):
__ = list(postprocessconfig.keys())[d["k"]]
__list = savehook_new_data[self.__privatetextproc_exe][
"save_text_process_info"
]["rank"]
if __ in __list:
return
__list.insert(0, __)
self.__checkaddnewmethod(0, __)
__d = {"k": 0}
autoinitdialog(
self,
_TR("预处理方法"),
400,
[
{
"type": "combo",
"name": _TR("预处理方法"),
"d": __d,
"k": "k",
"list": __viss,
},
{
"type": "okcancel",
"callback": functools.partial(__callback, __d),
},
],
)
def gethooktab(self, exepath): def gethooktab(self, exepath):
_w = QWidget() _w = QWidget()
formLayout = QFormLayout() formLayout = QFormLayout()
_w.setLayout(formLayout) _w.setLayout(formLayout)
formLayout.addRow(
_TR("代码页"),
getsimplecombobox(
_TRL(static_data["codepage_display"]),
savehook_new_data[exepath],
"codepage_index",
lambda x: gobject.baseobject.textsource.setsettings(),
),
)
formLayout.addRow(
_TR("移除非选定hook"),
getsimpleswitch(savehook_new_data[exepath], "removeuseless"),
)
formLayout.addRow( formLayout.addRow(
_TR("特殊码"), _TR("特殊码"),
@ -1100,14 +1333,120 @@ class dialog_setting_game_internal(QWidget):
_TR("插入特殊码延迟(ms)"), _TR("插入特殊码延迟(ms)"),
getspinbox(0, 1000000, savehook_new_data[exepath], "inserthooktimeout"), getspinbox(0, 1000000, savehook_new_data[exepath], "inserthooktimeout"),
) )
if ( __extraw = QWidget()
savehook_new_data[exepath]["use_saved_text_process"]
or "save_text_process_info" in savehook_new_data[exepath] def __function(_):
): __extraw.setEnabled(not _)
formLayout.addRow( try:
_TR("使用保存的文本处理流程"), gobject.baseobject.textsource.setsettings()
getsimpleswitch(savehook_new_data[exepath], "use_saved_text_process"), except:
) pass
formLayout.addRow(
_TR("跟随默认"),
getsimpleswitch(
savehook_new_data[exepath],
"hooksetting_follow_default",
callback=__function,
),
)
__extraw.setEnabled(
not savehook_new_data[exepath]["hooksetting_follow_default"]
)
for k in [
"codepage_index",
"removeuseless",
"direct_filterrepeat",
"textthreaddelay",
"maxBufferSize",
"maxHistorySize",
"filter_chaos_code",
"allow_set_text_name",
"use_yapi",
]:
if k not in savehook_new_data[exepath]["hooksetting_private"]:
savehook_new_data[exepath]["hooksetting_private"][k] = globalconfig[k]
formLayout.addWidget(__extraw)
formLayout2 = QFormLayout()
formLayout2.setContentsMargins(0, 0, 0, 0)
__extraw.setLayout(formLayout2)
formLayout2.addRow(
_TR("代码页"),
getsimplecombobox(
_TRL(static_data["codepage_display"]),
savehook_new_data[exepath]["hooksetting_private"],
"codepage_index",
lambda x: gobject.baseobject.textsource.setsettings(),
),
)
formLayout2.addRow(
_TR("过滤反复刷新的句子"),
getsimpleswitch(
savehook_new_data[exepath]["hooksetting_private"],
"direct_filterrepeat",
callback=lambda x: gobject.baseobject.textsource.setsettings(),
),
)
formLayout2.addRow(
_TR("移除非选定hook"),
getsimpleswitch(
savehook_new_data[exepath]["hooksetting_private"], "removeuseless"
),
)
formLayout2.addRow(
_TR("刷新延迟(ms)"),
getspinbox(
0,
10000,
savehook_new_data[exepath]["hooksetting_private"],
"textthreaddelay",
callback=lambda x: gobject.baseobject.textsource.setsettings(),
),
)
formLayout2.addRow(
_TR("最大缓冲区长度"),
getspinbox(
0,
1000000,
savehook_new_data[exepath]["hooksetting_private"],
"maxBufferSize",
callback=lambda x: gobject.baseobject.textsource.setsettings(),
),
)
formLayout2.addRow(
_TR("最大缓存文本长度"),
getspinbox(
0,
1000000000,
savehook_new_data[exepath]["hooksetting_private"],
"maxHistorySize",
callback=lambda x: gobject.baseobject.textsource.setsettings(),
),
)
formLayout2.addRow(
_TR("过滤包含乱码的文本行"),
getsimpleswitch(
savehook_new_data[exepath]["hooksetting_private"],
"filter_chaos_code",
),
)
formLayout2.addRow(
_TR("区分人名和文本"),
getsimpleswitch(
savehook_new_data[exepath]["hooksetting_private"],
"allow_set_text_name",
),
)
formLayout2.addRow(
_TR("使用YAPI注入"),
getsimpleswitch(
savehook_new_data[exepath]["hooksetting_private"],
"use_yapi",
),
)
return _w return _w
@ -2091,18 +2430,20 @@ class pixwrapper(QWidget):
self.visidx() self.visidx()
def visidx(self): def visidx(self):
if self.k and len(self.pixmaps) == 0: if len(self.pixmaps) == 0:
if not self.k:
return
pixmap = getExeIcon(self.k, False, cache=True) pixmap = getExeIcon(self.k, False, cache=True)
pixmap.setDevicePixelRatio(self.devicePixelRatioF()) pixmap.setDevicePixelRatio(self.devicePixelRatioF())
self.pixview.setPixmap(self.scalepix(pixmap)) self.pixview.setPixmap(self.scalepix(pixmap))
elif self.pixmapi < len(self.pixmaps): else:
pixmap = self.pixmaps[self.pixmapi] self.pixmapi = min(len(self.pixmaps) - 1, self.pixmapi)
pixmap_ = self.pixmaps[self.pixmapi]
savehook_new_data[self.k]["currentvisimage"] = pixmap pixmap = QPixmap.fromImage(QImage(pixmap_))
pixmap = QPixmap.fromImage(QImage(pixmap))
if pixmap is None or pixmap.isNull(): if pixmap is None or pixmap.isNull():
self.pixmaps.pop(self.pixmapi) self.pixmaps.pop(self.pixmapi)
return self.visidx() return self.visidx()
savehook_new_data[self.k]["currentvisimage"] = pixmap_
pixmap.setDevicePixelRatio(self.devicePixelRatioF()) pixmap.setDevicePixelRatio(self.devicePixelRatioF())
self.pixview.setPixmap(self.scalepix(pixmap)) self.pixview.setPixmap(self.scalepix(pixmap))

View File

@ -2,7 +2,14 @@ from qtsymbols import *
import functools, os, json import functools, os, json
import windows, gobject import windows, gobject
from myutils.utils import makehtml, getfilemd5 from myutils.utils import makehtml, getfilemd5
from myutils.config import globalconfig, _TR, _TRL, savehook_new_data, savehook_new_list from myutils.config import (
globalconfig,
_TR,
_TRL,
savehook_new_data,
savehook_new_list,
static_data,
)
from gui.pretransfile import sqlite2json2 from gui.pretransfile import sqlite2json2
from gui.codeacceptdialog import codeacceptdialog from gui.codeacceptdialog import codeacceptdialog
from gui.setting_textinput_ocr import getocrgrid from gui.setting_textinput_ocr import getocrgrid
@ -73,6 +80,22 @@ def gethookgrid(self):
), ),
], ],
[], [],
[
("代码页", 5),
(
D_getsimplecombobox(
_TRL(static_data["codepage_display"]),
globalconfig,
"codepage_index",
lambda x: gobject.baseobject.textsource.setsettings(),
),
8,
),
],
[
("移除非选定hook", 5),
(D_getsimpleswitch(globalconfig, "removeuseless"), 1),
],
[ [
("过滤反复刷新的句子", 5), ("过滤反复刷新的句子", 5),
(D_getsimpleswitch(globalconfig, "direct_filterrepeat"), 1), (D_getsimpleswitch(globalconfig, "direct_filterrepeat"), 1),
@ -116,7 +139,6 @@ def gethookgrid(self):
3, 3,
), ),
], ],
[],
[ [
("过滤包含乱码的文本行", 5), ("过滤包含乱码的文本行", 5),
(D_getsimpleswitch(globalconfig, "filter_chaos_code"), 1), (D_getsimpleswitch(globalconfig, "filter_chaos_code"), 1),
@ -131,7 +153,6 @@ def gethookgrid(self):
1, 1,
), ),
], ],
[],
[("区分人名和文本", 5), D_getsimpleswitch(globalconfig, "allow_set_text_name")], [("区分人名和文本", 5), D_getsimpleswitch(globalconfig, "allow_set_text_name")],
[("使用YAPI注入", 5), D_getsimpleswitch(globalconfig, "use_yapi")], [("使用YAPI注入", 5), D_getsimpleswitch(globalconfig, "use_yapi")],
] ]

View File

@ -1,7 +1,5 @@
from qtsymbols import * from qtsymbols import *
import functools, copy, os import functools
from traceback import print_exc
import gobject
from myutils.post import POSTSOLVE from myutils.post import POSTSOLVE
from myutils.utils import ( from myutils.utils import (
selectdebugfile, selectdebugfile,
@ -13,8 +11,6 @@ from myutils.config import (
postprocessconfig, postprocessconfig,
static_data, static_data,
_TRL, _TRL,
savehook_new_data,
_TR,
) )
from gui.codeacceptdialog import codeacceptdialog from gui.codeacceptdialog import codeacceptdialog
from gui.usefulwidget import ( from gui.usefulwidget import (
@ -32,40 +28,6 @@ from gui.inputdialog import (
) )
def savegameprocesstext():
try:
try:
with open("./userconfig/mypost.py", "r", encoding="utf8") as ff:
_mypost = ff.read()
os.makedirs("./userconfig/posts", exist_ok=True)
with open(
"./userconfig/posts/{}.py".format(gobject.baseobject.textsource.uuname),
"w",
encoding="utf8",
) as ff:
ff.write(_mypost)
except:
_mypost = None
ranklist = []
postargs = {}
for postitem in globalconfig["postprocess_rank"]:
if postitem not in postprocessconfig:
continue
if postprocessconfig[postitem]["use"]:
ranklist.append(postitem)
postargs[postitem] = copy.deepcopy(postprocessconfig[postitem])
exepath = gobject.baseobject.textsource.pname
savehook_new_data[exepath]["save_text_process_info"] = {
"postprocessconfig": postargs,
"rank": ranklist,
"mypost": gobject.baseobject.textsource.uuname,
}
if savehook_new_data[exepath]["use_saved_text_process"] == False:
savehook_new_data[exepath]["use_saved_text_process"] = True
except:
print_exc()
def delaysetcomparetext(self, s): def delaysetcomparetext(self, s):
try: try:
self.__fromtext.setPlainText(s) self.__fromtext.setPlainText(s)
@ -234,24 +196,7 @@ def setTab7_lazy(self, basel):
def ___(lay): def ___(lay):
vboxw, vbox = getvboxwidget() vboxw, vbox = getvboxwidget()
lay.addWidget(vboxw) lay.addWidget(vboxw)
_w = makescrollgrid(grids, vbox, True, savelist, savelay) makescrollgrid(grids, vbox, True, savelist, savelay)
_w.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
def showmenu(p: QPoint):
try:
gobject.baseobject.textsource.pname # 检查是否为texthook
menu = QMenu(_w)
save = QAction(_TR("保存当前游戏的文本处理流程"))
menu.addAction(save)
action = menu.exec(_w.cursor().pos())
if action == save:
savegameprocesstext()
except:
pass
_w.customContextMenuRequested.connect(showmenu)
vbox.addWidget(getcomparelayout(self)) vbox.addWidget(getcomparelayout(self))

View File

@ -892,22 +892,31 @@ class threebuttons(QWidget):
btn2clicked = pyqtSignal() btn2clicked = pyqtSignal()
btn3clicked = pyqtSignal() btn3clicked = pyqtSignal()
def __init__(self, btns=3): def __init__(self, btns=3, texts=None):
super().__init__() super().__init__()
layout = QHBoxLayout() layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0) layout.setContentsMargins(0, 0, 0, 0)
self.setLayout(layout) self.setLayout(layout)
button = QPushButton(self) button = QPushButton(self)
button.setText(_TR("添加行")) if texts:
button.setText(texts[0])
else:
button.setText(_TR("添加行"))
button.clicked.connect(self.btn1clicked) button.clicked.connect(self.btn1clicked)
button2 = QPushButton(self) button2 = QPushButton(self)
button2.setText(_TR("删除选中行")) if texts:
button2.setText(texts[1])
else:
button2.setText(_TR("删除行"))
button2.clicked.connect(self.btn2clicked) button2.clicked.connect(self.btn2clicked)
layout.addWidget(button) layout.addWidget(button)
layout.addWidget(button2) layout.addWidget(button2)
if btns == 3: if btns == 3:
button3 = QPushButton(self) button3 = QPushButton(self)
button3.setText(_TR("立即应用")) if texts:
button3.setText(texts[2])
else:
button3.setText(_TR("立即应用"))
button3.clicked.connect(self.btn3clicked) button3.clicked.connect(self.btn3clicked)
layout.addWidget(button3) layout.addWidget(button3)

View File

@ -17,6 +17,21 @@ class common:
def getidbytitle(title): def getidbytitle(title):
return None return None
@property
def config(self):
return self.config_all["args"]
@property
def config_all(self):
try:
return globalconfig["metadata"][self.typename]
except:
return {}
@property
def name(self):
return self.config_all.get("name", self.typename)
@property @property
def proxy(self): def proxy(self):
return getproxy(("metadata", self.typename)) return getproxy(("metadata", self.typename))

View File

@ -1,7 +1,11 @@
from myutils.metadata.abstract import common from metadata.abstract import common
from gui.inputdialog import autoinitdialog, autoinitdialog_items
class searcher(common): class searcher(common):
def querysettingwindow(self, parent):
items = autoinitdialog_items(self.config_all)
autoinitdialog(parent, self.name, 800, items)
def getidbytitle(self, title): def getidbytitle(self, title):
@ -36,7 +40,8 @@ class searcher(common):
"accept": "application/json", "accept": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
} }
if self.config["access-token"].strip() != "":
headers["Authorization"] = ("Bearer " + self.config["access-token"],)
response = self.proxysession.get( response = self.proxysession.get(
f"https://api.bgm.tv/v0/subjects/{sid}", headers=headers f"https://api.bgm.tv/v0/subjects/{sid}", headers=headers
) )
@ -59,7 +64,6 @@ class searcher(common):
return { return {
# "namemap": namemap, # "namemap": namemap,
"title": response["name_cn"], "title": response["name_cn"],
# "infopath": parsehtmlmethod(vndbdowloadinfo(vid)),
"imagepath_all": [imagepath], "imagepath_all": [imagepath],
"webtags": vndbtags, "webtags": vndbtags,
"developers": developers, "developers": developers,

View File

@ -2,7 +2,7 @@ import requests, re
from myutils.utils import simplehtmlparser from myutils.utils import simplehtmlparser
from myutils.metadata.abstract import common from metadata.abstract import common
class searcher(common): class searcher(common):
@ -115,7 +115,6 @@ class searcher(common):
return { return {
# "namemap": namemap, # "namemap": namemap,
"title": title, "title": title,
# "infopath": parsehtmlmethod(vndbdowloadinfo(vid)),
"imagepath_all": [self.dispatchdownloadtask(_) for _ in imags1 + imags2], "imagepath_all": [self.dispatchdownloadtask(_) for _ in imags1 + imags2],
"webtags": tags, "webtags": tags,
"developers": [devp], "developers": [devp],

View File

@ -0,0 +1,181 @@
import requests, re
from myutils.utils import simplehtmlparser
from metadata.abstract import common
class searcher(common):
def getidbytitle(self, title):
cookies = {
"top_pv_uid": "764317a4-3d99-46be-8f5a-6e6762b6059d",
"top_dummy": "d1776405-0683-4936-824a-d48d2660ccd2",
"guest_id": "DRNHXB5TDV9XVA__",
"ckcy": "1",
"mbox": "check#true#1717923986|session#1717923925784-847103#1717925786",
"is_intarnal": "true",
"__utma": "125690133.86996065.1717923926.1717923926.1717923926.1",
"__utmb": "125690133.0.10.1717923926",
"__utmc": "125690133",
"__utmz": "125690133.1717923926.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)",
"_gcl_au": "1.1.745157082.1717923927",
"rieSh3Ee_ga": "GA1.1.1543544133.1717923927",
"AMP_TOKEN": "%24NOT_FOUND",
"_dga": "GA1.3.86996065.1717923926",
"_dga_gid": "GA1.3.1715736403.1717923928",
"_dc_gtm_UA-48257133-2": "1",
"i3_ab": "93b99577-b74d-4fef-bba7-7ba426cf40ae",
"age_check_done": "1",
"dlsoft_check_item_history": "WyJuYXZlbF8wMDEzQDAiXQ%3D%3D",
"cklg": "ja",
"_yjsu_yjad": "1717923940.9d45754c-50f7-4219-8b50-e541815f4906",
"_dga": "GA1.4.86996065.1717923926",
"_dga_gid": "GA1.4.1715736403.1717923928",
"__rtbh.uid": "%7B%22eventType%22%3A%22uid%22%2C%22id%22%3A%22unknown%22%7D",
"rieSh3Ee_ga_KQYE0DE5JW": "GS1.1.1717923926.1.1.1717923942.0.0.405570256",
"cto_bundle": "yi6GA19QYzZmZHhXT0tWaFZZN2o4Y2NBb0lFSUFiWCUyQmJ3OWlTZ05VaWtEeXpoR201SnEyYnVIU3BqRENGeXJDN1VLUU5GOGxVRCUyRjVBa2dZUGFSc2kzSHNoa1FlUGx5Z2xoTElmTE5uc0l1WXpFclFGV1B0TiUyRldXT2ZaV0lXUEV5a2k4and0c2cxJTJGUDZCMWpNV0Q3bExiQktKZyUzRCUzRA",
"XSRF-TOKEN": "eyJpdiI6ImIyY21vbVJQZloxOUR3ZmJyaWhRdUE9PSIsInZhbHVlIjoiWTRaZ1VTOUw4UmFidnhvbWJkaU11SjZGRmljeWRiQ0cwODIybXI3T29VVmt2VXpub2dZdnBEUTFtN0pZa1BSeWZUQVhzOGR5UXlhVWxPUm1CN2Rwc3c9PSIsIm1hYyI6IjY5OTQ0ZjRmZjBhMGViZGRlN2VlMTQ2M2U3MDRiYjZlODllZWUyMDNlODg4YjQxOTA3ZmQyZDkzZWFhMjM0NmIiLCJ0YWciOiIifQ%3D%3D",
"laravel_session": "eyJpdiI6Ik41QzkzTkg1alBGVVVmeUdXOWpQWGc9PSIsInZhbHVlIjoia3lYNzVMOEZ3dm15SFNCb3RlYXNQTU9vZkZCeXBzK3BVOVF2dUY0d1c3QktQczVsU2ZRdTUxdkQ4VlBTcmdjdklQMHV3cFVsRVVcL3BCRGIybTNkVUhRPT0iLCJtYWMiOiJhYjkzMjNhZDg2OWI0ZjkyMTlmNzkzNTExOTlmZTBjNDU3NmJlZWUyYmM5ZTQ5NWI4MjAxZDdmNjZiZDA5NTJjIn0%3D",
"_dd_s": "logs=0&expire=1717924840754",
}
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "zh-CN,zh;q=0.9,ar;q=0.8,sq;q=0.7,ru;q=0.6",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Referer": "https://www.dmm.co.jp/",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-site",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"sec-ch-ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
}
response = self.proxysession.get(
f"https://dlsoft.dmm.co.jp/search/?floor=digital_pcgame&searchstr={title}&service=pcgame",
headers=headers,
cookies=cookies,
)
_id = re.search(
"https://pics.dmm.co.jp/digital/pcgame/(.*?)/", response.text
).groups()[0]
return _id
def refmainpage(self, _id):
return f"https://dlsoft.dmm.co.jp/detail/{_id}/"
def searchfordata(self, RJ):
cookies = {
"top_pv_uid": "764317a4-3d99-46be-8f5a-6e6762b6059d",
"top_dummy": "d1776405-0683-4936-824a-d48d2660ccd2",
"guest_id": "DRNHXB5TDV9XVA__",
"ckcy": "1",
"mbox": "check#true#1717923986|session#1717923925784-847103#1717925786",
"is_intarnal": "true",
"__utma": "125690133.86996065.1717923926.1717923926.1717923926.1",
"__utmb": "125690133.0.10.1717923926",
"__utmc": "125690133",
"__utmz": "125690133.1717923926.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)",
"_gcl_au": "1.1.745157082.1717923927",
"rieSh3Ee_ga": "GA1.1.1543544133.1717923927",
"AMP_TOKEN": "%24NOT_FOUND",
"_dga": "GA1.3.86996065.1717923926",
"_dga_gid": "GA1.3.1715736403.1717923928",
"_dc_gtm_UA-48257133-2": "1",
"i3_ab": "93b99577-b74d-4fef-bba7-7ba426cf40ae",
"age_check_done": "1",
"dlsoft_check_item_history": "WyJuYXZlbF8wMDEzQDAiXQ%3D%3D",
"cklg": "ja",
"_yjsu_yjad": "1717923940.9d45754c-50f7-4219-8b50-e541815f4906",
"_dga": "GA1.4.86996065.1717923926",
"_dga_gid": "GA1.4.1715736403.1717923928",
"__rtbh.uid": "%7B%22eventType%22%3A%22uid%22%2C%22id%22%3A%22unknown%22%7D",
"rieSh3Ee_ga_KQYE0DE5JW": "GS1.1.1717923926.1.1.1717923942.0.0.405570256",
"cto_bundle": "yi6GA19QYzZmZHhXT0tWaFZZN2o4Y2NBb0lFSUFiWCUyQmJ3OWlTZ05VaWtEeXpoR201SnEyYnVIU3BqRENGeXJDN1VLUU5GOGxVRCUyRjVBa2dZUGFSc2kzSHNoa1FlUGx5Z2xoTElmTE5uc0l1WXpFclFGV1B0TiUyRldXT2ZaV0lXUEV5a2k4and0c2cxJTJGUDZCMWpNV0Q3bExiQktKZyUzRCUzRA",
"XSRF-TOKEN": "eyJpdiI6ImIyY21vbVJQZloxOUR3ZmJyaWhRdUE9PSIsInZhbHVlIjoiWTRaZ1VTOUw4UmFidnhvbWJkaU11SjZGRmljeWRiQ0cwODIybXI3T29VVmt2VXpub2dZdnBEUTFtN0pZa1BSeWZUQVhzOGR5UXlhVWxPUm1CN2Rwc3c9PSIsIm1hYyI6IjY5OTQ0ZjRmZjBhMGViZGRlN2VlMTQ2M2U3MDRiYjZlODllZWUyMDNlODg4YjQxOTA3ZmQyZDkzZWFhMjM0NmIiLCJ0YWciOiIifQ%3D%3D",
"laravel_session": "eyJpdiI6Ik41QzkzTkg1alBGVVVmeUdXOWpQWGc9PSIsInZhbHVlIjoia3lYNzVMOEZ3dm15SFNCb3RlYXNQTU9vZkZCeXBzK3BVOVF2dUY0d1c3QktQczVsU2ZRdTUxdkQ4VlBTcmdjdklQMHV3cFVsRVVcL3BCRGIybTNkVUhRPT0iLCJtYWMiOiJhYjkzMjNhZDg2OWI0ZjkyMTlmNzkzNTExOTlmZTBjNDU3NmJlZWUyYmM5ZTQ5NWI4MjAxZDdmNjZiZDA5NTJjIn0%3D",
"_dd_s": "logs=0&expire=1717924840754",
}
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "zh-CN,zh;q=0.9,ar;q=0.8,sq;q=0.7,ru;q=0.6",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Referer": "https://www.dmm.co.jp/",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-site",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"sec-ch-ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
}
print(self.refmainpage(RJ))
response = self.proxysession.get(
self.refmainpage(RJ), headers=headers, cookies=cookies
)
title = re.search(
'<h1 class="productTitle__headline"(.*?)>(.*?)</h1>', response.text
).groups()[1]
print(title)
devp = re.findall(
"<li>([\\s\\S]*?)</li>",
response.text,
)[2]
print(devp)
devp = (
re.search("<a (.*?)>([\\s\\S]*?)</a>", devp)
.groups()[1]
.replace("\n", "")
.strip()
)
print(devp)
__text = response.text
tags = []
while True:
if __text.find('<tr class="contentsDetailBottom__tableRow">') == -1:
break
__text = __text[
__text.find('<tr class="contentsDetailBottom__tableRow">') :
]
tags = simplehtmlparser(
__text,
"tr",
'<tr class="contentsDetailBottom__tableRow">',
)
__text = __text[1:]
if "ジャンル" not in tags:
continue
tags = re.findall(">(.*?)</a>", tags)
break
inner = simplehtmlparser(
response.text,
"div",
'<div class="main-area-left">',
)
imags2 = [_[0] for _ in re.findall('<img src="(.*?)"(.*?)>', inner)]
print(imags2)
inner = simplehtmlparser(response.text, "div", '<div ref="product_slider_data"')
return {
# "namemap": namemap,
"title": title,
"imagepath_all": [
self.dispatchdownloadtask(_.replace("js-", "jp-")) for _ in imags2
],
"webtags": tags,
"developers": devp,
}

View File

@ -1,10 +1,9 @@
import time, requests, re, os import requests, re, os
from myutils.config import globalconfig, tryreadconfig, safesave from myutils.config import tryreadconfig, safesave
from threading import Thread
import gzip, json import gzip, json
import shutil import shutil
from myutils.metadata.abstract import common from metadata.abstract import common
def safegetvndbjson(proxy, url, json, getter): def safegetvndbjson(proxy, url, json, getter):
@ -216,39 +215,6 @@ def getvntagsbyid(proxy, vid):
return tags return tags
import re
def parsehtmlmethod(infopath):
with open(infopath, "r", encoding="utf8") as ff:
text = ff.read()
##隐藏横向滚动
text = text.replace("<body>", '<body style="overflow-x: hidden;">')
##删除header
text = re.sub("<header>([\\s\\S]*?)</header>", "", text)
text = re.sub("<footer>([\\s\\S]*?)</footer>", "", text)
text = re.sub('<article class="vnreleases"([\\s\\S]*?)</article>', "", text)
text = re.sub('<article class="vnstaff"([\\s\\S]*?)</article>', "", text)
text = re.sub('<article id="stats"([\\s\\S]*?)</article>', "", text)
text = re.sub("<nav>([\\s\\S]*?)</nav>", "", text)
text = re.sub('<p class="itemmsg">([\\s\\S]*?)</p>', "", text)
text = re.sub('<div id="vntags">([\\s\\S]*?)</div>', "", text)
text = re.sub('<div id="tagops">([\\s\\S]*?)</div>', "", text)
resavepath = infopath + "parsed.html"
if globalconfig["languageuse"] == 0:
text = re.sub(
'<a href="(.*?)" lang="ja-Latn" title="(.*?)">(.*?)</a>',
'<a href="\\1" lang="ja-Latn" title="\\3">\\2</a>',
text,
)
with open(resavepath, "w", encoding="utf8") as ff:
ff.write(text)
return resavepath
def gettagfromhtml(path): def gettagfromhtml(path):
if path and os.path.exists(path): if path and os.path.exists(path):
@ -302,11 +268,6 @@ class searcher(common):
return { return {
"namemap": namemap, "namemap": namemap,
"title": title, "title": title,
"infopath": parsehtmlmethod(
self.dispatchdownloadtask(
self.refmainpage(_vid), ishtml=True, delay=False
)
),
"imagepath_all": __, "imagepath_all": __,
"webtags": vndbtags, "webtags": vndbtags,
"developers": developers, "developers": developers,

View File

@ -1,5 +1,5 @@
import json import json
import os, time import os, time, uuid
from traceback import print_exc from traceback import print_exc
@ -60,6 +60,14 @@ ocrsetting = tryreadconfig("ocrsetting.json")
def getdefaultsavehook(gamepath, title=None): def getdefaultsavehook(gamepath, title=None):
default = { default = {
"hooksetting_follow_default": True,
"hooksetting_private": {}, # 显示时再加载缺省用global中的键
"textproc_follow_default": True,
"save_text_process_info": {
"postprocessconfig": {},
"rank": [],
# "mypost":
},
"localeswitcher": 0, "localeswitcher": 0,
"onloadautochangemode2": 0, "onloadautochangemode2": 0,
"onloadautoswitchsrclang": 0, "onloadautoswitchsrclang": 0,
@ -74,8 +82,6 @@ def getdefaultsavehook(gamepath, title=None):
"hook": [], "hook": [],
"inserthooktimeout": 0, "inserthooktimeout": 0,
"needinserthookcode": [], "needinserthookcode": [],
"removeuseless": False,
"codepage_index": 0,
# "allow_tts_auto_names": "",#->v4 # "allow_tts_auto_names": "",#->v4
"allow_tts_auto_names_v4": [], "allow_tts_auto_names_v4": [],
"tts_repair": False, "tts_repair": False,
@ -101,14 +107,16 @@ def getdefaultsavehook(gamepath, title=None):
# #
"vid": 0, "vid": 0,
"bgmsid": 0, "bgmsid": 0,
"dlsiteid": 'RJ', "dlsiteid": "RJ/VJXXXX",
"fanzaid": "",
"title": "", "title": "",
# "imagepath": None, # 封面->imagepath_all[0] # "imagepath": None, # 封面->imagepath_all[0]
# "imagepath_much2": [], # 截图->imagepath_all[1:] # "imagepath_much2": [], # 截图->imagepath_all[1:]
"imagepath_all": [], "imagepath_all": [],
"developers": [], "developers": [],
"webtags": [], # 标签 "webtags": [], # 标签
"infopath": None, # 离线存储的主页 # "infopath": None, # 离线存储的主页
} }
if title and len(title): if title and len(title):
default["title"] = title # metadata default["title"] = title # metadata

View File

@ -357,7 +357,7 @@ def POSTSOLVE(line):
try: try:
if "pname" in dir(gobject.baseobject.textsource): if "pname" in dir(gobject.baseobject.textsource):
exepath = gobject.baseobject.textsource.pname exepath = gobject.baseobject.textsource.pname
if savehook_new_data[exepath]["use_saved_text_process"]: if not savehook_new_data[exepath]["textproc_follow_default"]:
useranklist = savehook_new_data[exepath]["save_text_process_info"][ useranklist = savehook_new_data[exepath]["save_text_process_info"][
"rank" "rank"
] ]
@ -398,7 +398,7 @@ def POSTSOLVE(line):
if usedpostprocessconfig[postitem]["use"]: if usedpostprocessconfig[postitem]["use"]:
try: try:
_f = functions[postitem] _f = functions[postitem]
sig = inspect.signature(_f) sig = inspect.signature(_f)
np = len(sig.parameters) np = len(sig.parameters)
if np == 1: if np == 1:

View File

@ -98,21 +98,6 @@ class PriorityQueue:
searchvndbqueue = PriorityQueue() searchvndbqueue = PriorityQueue()
def checkinfo(gamepath):
return (savehook_new_data[gamepath]["infopath"] is None) or (
(savehook_new_data[gamepath]["infopath"][:4].lower() != "http")
and os.path.exists(savehook_new_data[gamepath]["infopath"]) == False
)
def checkvid(gamepath):
return checkinfo(gamepath) or (
(len(savehook_new_data[gamepath]["webtags"]) == 0)
and (len(savehook_new_data[gamepath]["developers"]) == 0)
)
def guessmaybetitle(gamepath): def guessmaybetitle(gamepath):
__t = [] __t = []
@ -145,8 +130,6 @@ def guessmaybetitle(gamepath):
targetmod = {} targetmod = {}
for k in globalconfig["metadata"]:
targetmod[k] = importlib.import_module(f"myutils.metadata.{k}").searcher(k)
def trysearchforid(gamepath, searchargs: list): def trysearchforid(gamepath, searchargs: list):
@ -181,8 +164,8 @@ def trysearchfordata(gamepath, arg):
try: try:
data = targetmod[key].searchfordata(vid) data = targetmod[key].searchfordata(vid)
except: except:
print_exc()
data = {} data = {}
infopath = data.get("infopath", None)
title = data.get("title", None) title = data.get("title", None)
namemap = data.get("namemap", None) namemap = data.get("namemap", None)
developers = data.get("developers", []) developers = data.get("developers", [])
@ -194,10 +177,16 @@ def trysearchfordata(gamepath, arg):
continue continue
if _ not in savehook_new_data[gamepath]["imagepath_all"]: if _ not in savehook_new_data[gamepath]["imagepath_all"]:
savehook_new_data[gamepath]["imagepath_all"].append(_) savehook_new_data[gamepath]["imagepath_all"].append(_)
if title and (not savehook_new_data[gamepath]["istitlesetted"]): if title:
savehook_new_data[gamepath]["title"] = title if not savehook_new_data[gamepath]["istitlesetted"]:
if infopath: savehook_new_data[gamepath]["title"] = title
savehook_new_data[gamepath]["infopath"] = infopath _vis = globalconfig["metadata"][key]["name"]
_url = targetmod[key].refmainpage(vid)
_urls = [_[1] for _ in savehook_new_data[gamepath]["relationlinks"]]
if _url not in _urls:
savehook_new_data[gamepath]["relationlinks"].append(
(_vis, targetmod[key].refmainpage(vid))
)
if namemap: if namemap:
savehook_new_data[gamepath]["namemap"] = namemap savehook_new_data[gamepath]["namemap"] = namemap
if len(webtags): if len(webtags):
@ -228,9 +217,6 @@ def everymethodsthread():
print_exc() print_exc()
threading.Thread(target=everymethodsthread).start()
def gamdidchangedtask(key, idname, gamepath): def gamdidchangedtask(key, idname, gamepath):
vid = savehook_new_data[gamepath][idname] vid = savehook_new_data[gamepath][idname]
if vid == "": if vid == "":
@ -256,8 +242,8 @@ def titlechangedtask(gamepath, title):
def checkifnewgame(targetlist, gamepath, title=None): def checkifnewgame(targetlist, gamepath, title=None):
isnew = gamepath in targetlist isnew = gamepath not in targetlist
if not isnew: if isnew:
targetlist.insert(0, gamepath) targetlist.insert(0, gamepath)
if gamepath not in savehook_new_data: if gamepath not in savehook_new_data:
savehook_new_data[gamepath] = getdefaultsavehook(gamepath, title) savehook_new_data[gamepath] = getdefaultsavehook(gamepath, title)
@ -368,9 +354,11 @@ class wavmp3player:
return durationms return durationms
def selectdebugfile(path): def selectdebugfile(path: str, ismypost=False):
if ismypost:
path = f"./userconfig/posts/{path}.py"
p = os.path.abspath((path)) p = os.path.abspath((path))
os.makedirs(os.path.dirname(p), exist_ok=True)
if os.path.exists(p) == False: if os.path.exists(p) == False:
with open(p, "w", encoding="utf8") as ff: with open(p, "w", encoding="utf8") as ff:
@ -385,7 +373,7 @@ class TS(basetrans):
return content return content
""" """
) )
elif path == "./userconfig/mypost.py": elif path == "./userconfig/mypost.py" or ismypost:
ff.write( ff.write(
""" """
def POSTSOLVE(line): def POSTSOLVE(line):
@ -740,3 +728,10 @@ class LRUCache:
if not _: if not _:
self.put(key) self.put(key)
return _ return _
for k in globalconfig["metadata"]:
targetmod[k] = importlib.import_module(f"metadata.{k}").searcher(k)
threading.Thread(target=everymethodsthread).start()

View File

@ -83,6 +83,21 @@ EmbedCallback = CFUNCTYPE(None, c_wchar_p, ThreadParam)
class texthook(basetext): class texthook(basetext):
@property
def config(self):
if savehook_new_data[self.pname]["hooksetting_follow_default"]:
return globalconfig
else:
class __shitdict(dict):
def __getitem__(self, key):
if key in self:
return super().__getitem__(key)
else:
return globalconfig[key]
return __shitdict(savehook_new_data[self.pname]["hooksetting_private"])
def __init__( def __init__(
self, pids, hwnd, pname, autostarthookcode=None, needinserthookcode=None self, pids, hwnd, pname, autostarthookcode=None, needinserthookcode=None
): ):
@ -90,6 +105,9 @@ class texthook(basetext):
autostarthookcode = [] autostarthookcode = []
if needinserthookcode is None: if needinserthookcode is None:
needinserthookcode = [] needinserthookcode = []
self.pname = pname
self.pids = pids
self.hwnd = hwnd
self.keepref = [] self.keepref = []
self.newline = Queue() self.newline = Queue()
self.newline_delaywait = Queue() self.newline_delaywait = Queue()
@ -102,15 +120,12 @@ class texthook(basetext):
self.selectinghook = None self.selectinghook = None
self.selectedhook = [] self.selectedhook = []
self.selectedhookidx = [] self.selectedhookidx = []
self.allow_set_text_name = globalconfig["allow_set_text_name"] self.allow_set_text_name = self.config["allow_set_text_name"]
self.pids = pids
self.connectedpids = [] self.connectedpids = []
self.pname = pname
self.hwnd = hwnd
self.runonce_line = "" self.runonce_line = ""
self.autostarthookcode = [self.deserial(__) for __ in autostarthookcode] self.autostarthookcode = [self.deserial(__) for __ in autostarthookcode]
self.isremoveuseless = savehook_new_data[self.pname]["removeuseless"] and len( self.isremoveuseless = self.config["removeuseless"] and len(
self.autostarthookcode self.autostarthookcode
) )
self.needinserthookcode = needinserthookcode self.needinserthookcode = needinserthookcode
@ -221,7 +236,7 @@ class texthook(basetext):
injectpids = [] injectpids = []
for pid in self.pids: for pid in self.pids:
if globalconfig["use_yapi"]: if self.config["use_yapi"]:
self.Luna_Inject(pid, os.path.abspath("./files/plugins/LunaHook")) self.Luna_Inject(pid, os.path.abspath("./files/plugins/LunaHook"))
else: else:
if self.Luna_CreatePipeAndCheck(pid): if self.Luna_CreatePipeAndCheck(pid):
@ -347,16 +362,16 @@ class texthook(basetext):
def setsettings(self): def setsettings(self):
self.Luna_Settings( self.Luna_Settings(
globalconfig["textthreaddelay"], self.config["textthreaddelay"],
globalconfig["direct_filterrepeat"], self.config["direct_filterrepeat"],
self.codepage(), self.codepage(),
globalconfig["maxBufferSize"], self.config["maxBufferSize"],
globalconfig["maxHistorySize"], self.config["maxHistorySize"],
) )
def codepage(self): def codepage(self):
try: try:
cpi = savehook_new_data[self.pname]["codepage_index"] cpi = self.config["codepage_index"]
cp = static_data["codepage_real"][cpi] cp = static_data["codepage_real"][cpi]
except: except:
cp = 932 cp = 932
@ -427,7 +442,7 @@ class texthook(basetext):
@threader @threader
def delaycollectallselectedoutput(self): def delaycollectallselectedoutput(self):
while True: while True:
time.sleep(globalconfig["textthreaddelay"] / 1000) time.sleep(self.config["textthreaddelay"] / 1000)
if self.newline_delaywait.empty(): if self.newline_delaywait.empty():
continue continue
@ -444,7 +459,7 @@ class texthook(basetext):
def handle_output(self, hc, hn, tp, output): def handle_output(self, hc, hn, tp, output):
if globalconfig["filter_chaos_code"] and checkchaos(output): if self.config["filter_chaos_code"] and checkchaos(output):
return False return False
key = (hc, hn.decode("utf8"), tp) key = (hc, hn.decode("utf8"), tp)

View File

@ -38,7 +38,17 @@
"downloadtasks": [], "downloadtasks": [],
"useproxy": true, "useproxy": true,
"target": "bgmsid", "target": "bgmsid",
"idtype": 0 "idtype": 0,
"args": {
"access-token": ""
}
},
"fanza": {
"name": "FanzaGames",
"downloadtasks": [],
"useproxy": true,
"target": "fanzaid",
"idtype": 1
} }
}, },
"relationlinks": [ "relationlinks": [
@ -171,8 +181,10 @@
500, 500,
500 500
], ],
"codepage_index": 0,
"removeuseless": false,
"vispolicy": 0, "vispolicy": 0,
"currvislistuid" : null, "currvislistuid": null,
"multiregion": false, "multiregion": false,
"rememberocrregions": false, "rememberocrregions": false,
"ocrregions": [], "ocrregions": [],

View File

@ -43,7 +43,6 @@
"越南语(CP1258)": "الفيتنامية ( cp1258 ) .", "越南语(CP1258)": "الفيتنامية ( cp1258 ) .",
"游戏失去焦点时窗口隐藏": "لعبة نافذة مخفية عندما يفقد التركيز", "游戏失去焦点时窗口隐藏": "لعبة نافذة مخفية عندما يفقد التركيز",
"选择游戏": "اختيار اللعبة", "选择游戏": "اختيار اللعبة",
"删除选中行": "حذف صف",
"百度": "بايدو .", "百度": "بايدو .",
"東北イタコ/东北伊达子": "شمال شرق イコ / شمال شرق عدن", "東北イタコ/东北伊达子": "شمال شرق イコ / شمال شرق عدن",
"琴葉茜": "كين يي تشيان", "琴葉茜": "كين يي تشيان",
@ -626,7 +625,6 @@
"片假名": "كاتاكانا", "片假名": "كاتاكانا",
"罗马音": "نغمة رومانية", "罗马音": "نغمة رومانية",
"日语注音方案": "نظام صوتي ياباني", "日语注音方案": "نظام صوتي ياباني",
"保存当前游戏的文本处理流程": "حفظ النص الحالي في اللعبة",
"使用保存的文本处理流程": "استخدام عملية حفظ النص", "使用保存的文本处理流程": "استخدام عملية حفظ النص",
"Sakura大模型": "ساكورا غراند موديل", "Sakura大模型": "ساكورا غراند موديل",
"Magpie路径": "ماغبي تريل", "Magpie路径": "ماغبي تريل",
@ -831,5 +829,8 @@
"显示的项目": "عرض البنود", "显示的项目": "عرض البنود",
"首位的": "أولا", "首位的": "أولا",
"指定的": "محدد", "指定的": "محدد",
"设为显示的项目": "عرض البند" "设为显示的项目": "عرض البند",
"跟随默认": "اتبع التقصير",
"删除行": "حذف صف",
"使用": "إستعمال"
} }

View File

@ -176,7 +176,6 @@
"記号": "記號", "記号": "記號",
"选择文件": "選擇檔案", "选择文件": "選擇檔案",
"缩放时禁用窗口大小调整": "縮放時禁用視窗大小調整", "缩放时禁用窗口大小调整": "縮放時禁用視窗大小調整",
"删除选中行": "删除選中行",
"图标": "圖標", "图标": "圖標",
"指示詞": "訓示詞", "指示詞": "訓示詞",
"動詞": "動詞", "動詞": "動詞",
@ -626,7 +625,6 @@
"片假名": "片假名", "片假名": "片假名",
"罗马音": "羅馬音", "罗马音": "羅馬音",
"日语注音方案": "日語注音方案", "日语注音方案": "日語注音方案",
"保存当前游戏的文本处理流程": "保存當前遊戲的文字處理流程",
"使用保存的文本处理流程": "使用保存的文字處理流程", "使用保存的文本处理流程": "使用保存的文字處理流程",
"Sakura大模型": "Sakura大模型", "Sakura大模型": "Sakura大模型",
"Magpie路径": "Magpie路徑", "Magpie路径": "Magpie路徑",
@ -831,5 +829,8 @@
"显示的项目": "顯示的項目", "显示的项目": "顯示的項目",
"首位的": "首位的", "首位的": "首位的",
"指定的": "指定的", "指定的": "指定的",
"设为显示的项目": "設為顯示的項目" "设为显示的项目": "設為顯示的項目",
"跟随默认": "跟隨默認",
"删除行": "删除行",
"使用": "使用"
} }

View File

@ -42,7 +42,6 @@
"自动朗读": "Automatic reading", "自动朗读": "Automatic reading",
"缩放时禁用窗口大小调整": "Disable window resizing when zooming", "缩放时禁用窗口大小调整": "Disable window resizing when zooming",
"导出sqlite文件为json文件": "Export sqlite file as json file", "导出sqlite文件为json文件": "Export sqlite file as json file",
"删除选中行": "Delete Selected Row",
"图标": "Icon", "图标": "Icon",
"游戏失去焦点时窗口隐藏": "The window is hidden when the game loses focus", "游戏失去焦点时窗口隐藏": "The window is hidden when the game loses focus",
"指示詞": "Deictic word", "指示詞": "Deictic word",
@ -626,7 +625,6 @@
"片假名": "Katakana", "片假名": "Katakana",
"罗马音": "Romanic sound", "罗马音": "Romanic sound",
"日语注音方案": "Japanese phonetic scheme", "日语注音方案": "Japanese phonetic scheme",
"保存当前游戏的文本处理流程": "Save the text processing process for the current game",
"使用保存的文本处理流程": "Using a saved text processing process", "使用保存的文本处理流程": "Using a saved text processing process",
"Sakura大模型": "Sakura Large Model", "Sakura大模型": "Sakura Large Model",
"Magpie路径": "Magpie Path", "Magpie路径": "Magpie Path",
@ -831,5 +829,8 @@
"显示的项目": "Displayed items", "显示的项目": "Displayed items",
"首位的": "First place", "首位的": "First place",
"指定的": "Designated", "指定的": "Designated",
"设为显示的项目": "Set as Displayed Project" "设为显示的项目": "Set as Displayed Project",
"跟随默认": "Follow default",
"删除行": "Delete Rows",
"使用": "apply"
} }

View File

@ -176,7 +176,6 @@
"記号": "Marca", "記号": "Marca",
"选择文件": "Seleccionar archivo", "选择文件": "Seleccionar archivo",
"缩放时禁用窗口大小调整": "Desactivar el ajuste de tamaño de la ventana al ampliar", "缩放时禁用窗口大小调整": "Desactivar el ajuste de tamaño de la ventana al ampliar",
"删除选中行": "Eliminar la línea seleccionada",
"图标": "Iconos", "图标": "Iconos",
"指示詞": "Instrucción", "指示詞": "Instrucción",
"動詞": "Verbos", "動詞": "Verbos",
@ -626,7 +625,6 @@
"片假名": "Seudónimo de película", "片假名": "Seudónimo de película",
"罗马音": "Acento Romano", "罗马音": "Acento Romano",
"日语注音方案": "Programa de fonética japonesa", "日语注音方案": "Programa de fonética japonesa",
"保存当前游戏的文本处理流程": "Guardar el proceso de procesamiento de texto del juego actual",
"使用保存的文本处理流程": "Usar el proceso de procesamiento de texto guardado", "使用保存的文本处理流程": "Usar el proceso de procesamiento de texto guardado",
"Sakura大模型": "Gran modelo Sakura", "Sakura大模型": "Gran modelo Sakura",
"Magpie路径": "Ruta magpie", "Magpie路径": "Ruta magpie",
@ -831,5 +829,8 @@
"显示的项目": "Los proyectos mostrados", "显示的项目": "Los proyectos mostrados",
"首位的": "Primero", "首位的": "Primero",
"指定的": "Designado", "指定的": "Designado",
"设为显示的项目": "Artículos configurados para mostrar" "设为显示的项目": "Artículos configurados para mostrar",
"跟随默认": "Sigue el predeterminado",
"删除行": "Eliminar filas",
"使用": "Uso"
} }

View File

@ -176,7 +176,6 @@
"記号": "Marque", "記号": "Marque",
"选择文件": "Sélectionner un fichier", "选择文件": "Sélectionner un fichier",
"缩放时禁用窗口大小调整": "Désactiver le redimensionnement de la fenêtre lors du zoom", "缩放时禁用窗口大小调整": "Désactiver le redimensionnement de la fenêtre lors du zoom",
"删除选中行": "Supprimer la ligne sélectionnée",
"图标": "Icônes", "图标": "Icônes",
"指示詞": "Mot indicateur", "指示詞": "Mot indicateur",
"動詞": "Verbes", "動詞": "Verbes",
@ -626,7 +625,6 @@
"片假名": "Nom du film", "片假名": "Nom du film",
"罗马音": "Voix romaine", "罗马音": "Voix romaine",
"日语注音方案": "Programme d'accent japonais", "日语注音方案": "Programme d'accent japonais",
"保存当前游戏的文本处理流程": "Enregistrer le processus de traitement de texte du jeu actuel",
"使用保存的文本处理流程": "Utiliser le processus de traitement de texte sauvegardé", "使用保存的文本处理流程": "Utiliser le processus de traitement de texte sauvegardé",
"Sakura大模型": "Sakura Grand Modèle", "Sakura大模型": "Sakura Grand Modèle",
"Magpie路径": "Le chemin Magpie", "Magpie路径": "Le chemin Magpie",
@ -831,5 +829,8 @@
"显示的项目": "Projets affichés", "显示的项目": "Projets affichés",
"首位的": "La première", "首位的": "La première",
"指定的": "Spécifié", "指定的": "Spécifié",
"设为显示的项目": "Les éléments à afficher" "设为显示的项目": "Les éléments à afficher",
"跟随默认": "Suivre par défaut",
"删除行": "Supprimer une ligne",
"使用": "Utilisation"
} }

View File

@ -170,7 +170,6 @@
"記号": "Simbolo", "記号": "Simbolo",
"选择文件": "Seleziona file", "选择文件": "Seleziona file",
"缩放时禁用窗口大小调整": "Disabilita il ridimensionamento delle finestre durante lo zoom", "缩放时禁用窗口大小调整": "Disabilita il ridimensionamento delle finestre durante lo zoom",
"删除选中行": "Elimina righe selezionate",
"图标": "icona", "图标": "icona",
"指示詞": "Parole dimostrative", "指示詞": "Parole dimostrative",
"動詞": "Verbi", "動詞": "Verbi",
@ -626,7 +625,6 @@
"片假名": "Katakana", "片假名": "Katakana",
"罗马音": "Suono romanico", "罗马音": "Suono romanico",
"日语注音方案": "Schema fonetico giapponese", "日语注音方案": "Schema fonetico giapponese",
"保存当前游戏的文本处理流程": "Salva il processo di elaborazione del testo per il gioco corrente",
"使用保存的文本处理流程": "Utilizzo di un processo di elaborazione del testo salvato", "使用保存的文本处理流程": "Utilizzo di un processo di elaborazione del testo salvato",
"Sakura大模型": "Modello Sakura Large", "Sakura大模型": "Modello Sakura Large",
"Magpie路径": "Percorso magpie", "Magpie路径": "Percorso magpie",
@ -831,5 +829,8 @@
"显示的项目": "Articoli visualizzati", "显示的项目": "Articoli visualizzati",
"首位的": "Primo posto", "首位的": "Primo posto",
"指定的": "Designato", "指定的": "Designato",
"设为显示的项目": "Imposta come progetto visualizzato" "设为显示的项目": "Imposta come progetto visualizzato",
"跟随默认": "Segui default",
"删除行": "Elimina righe",
"使用": "applicare"
} }

View File

@ -176,7 +176,6 @@
"記号": "記号", "記号": "記号",
"选择文件": "ファイルを選択", "选择文件": "ファイルを選択",
"缩放时禁用窗口大小调整": "ズーム時にウィンドウのサイズ変更を無効にする", "缩放时禁用窗口大小调整": "ズーム時にウィンドウのサイズ変更を無効にする",
"删除选中行": "選択した行を削除",
"图标": "アイコン", "图标": "アイコン",
"指示詞": "指示語", "指示詞": "指示語",
"動詞": "動詞", "動詞": "動詞",
@ -626,7 +625,6 @@
"片假名": "カタカナ", "片假名": "カタカナ",
"罗马音": "ローマ字", "罗马音": "ローマ字",
"日语注音方案": "日本語の表記方法", "日语注音方案": "日本語の表記方法",
"保存当前游戏的文本处理流程": "現在のゲームを保存するためのテキスト処理の流れ",
"使用保存的文本处理流程": "保存されたテキスト処理プロセスの使用", "使用保存的文本处理流程": "保存されたテキスト処理プロセスの使用",
"Sakura大模型": "Sakuraビッグモデル", "Sakura大模型": "Sakuraビッグモデル",
"Magpie路径": "Magpieパス", "Magpie路径": "Magpieパス",
@ -831,5 +829,8 @@
"显示的项目": "表示されるアイテム", "显示的项目": "表示されるアイテム",
"首位的": "トップ", "首位的": "トップ",
"指定的": "指定された", "指定的": "指定された",
"设为显示的项目": "表示する項目として設定" "设为显示的项目": "表示する項目として設定",
"跟随默认": "デフォルトに従う",
"删除行": "行の削除",
"使用": "使用"
} }

View File

@ -176,7 +176,6 @@
"記号": "기호", "記号": "기호",
"选择文件": "파일 선택", "选择文件": "파일 선택",
"缩放时禁用窗口大小调整": "확대 / 축소 시 창 크기 조정 비활성화", "缩放时禁用窗口大小调整": "확대 / 축소 시 창 크기 조정 비활성화",
"删除选中行": "선택한 행 삭제",
"图标": "아이콘", "图标": "아이콘",
"指示詞": "지시어", "指示詞": "지시어",
"動詞": "동사", "動詞": "동사",
@ -626,7 +625,6 @@
"片假名": "가명", "片假名": "가명",
"罗马音": "로마음", "罗马音": "로마음",
"日语注音方案": "일본어 주음 방안", "日语注音方案": "일본어 주음 방안",
"保存当前游戏的文本处理流程": "현재 게임의 텍스트 처리 프로세스 저장",
"使用保存的文本处理流程": "저장된 텍스트 프로세스 사용", "使用保存的文本处理流程": "저장된 텍스트 프로세스 사용",
"Sakura大模型": "Sakura 대형 모델", "Sakura大模型": "Sakura 대형 모델",
"Magpie路径": "Magpie 경로", "Magpie路径": "Magpie 경로",
@ -831,5 +829,8 @@
"显示的项目": "표시된 항목", "显示的项目": "표시된 항목",
"首位的": "수위의", "首位的": "수위의",
"指定的": "지정된", "指定的": "지정된",
"设为显示的项目": "표시할 항목으로 설정" "设为显示的项目": "표시할 항목으로 설정",
"跟随默认": "기본 따르기",
"删除行": "행 삭제",
"使用": "사용"
} }

View File

@ -176,7 +176,6 @@
"記号": "Symbol", "記号": "Symbol",
"选择文件": "Wybierz plik", "选择文件": "Wybierz plik",
"缩放时禁用窗口大小调整": "Wyłącz zmianę rozmiaru okna podczas powiększania", "缩放时禁用窗口大小调整": "Wyłącz zmianę rozmiaru okna podczas powiększania",
"删除选中行": "Usuń zaznaczone wiersze",
"图标": "Ikona", "图标": "Ikona",
"指示詞": "Słowa demonstracyjne", "指示詞": "Słowa demonstracyjne",
"動詞": "Czasowniki", "動詞": "Czasowniki",
@ -626,7 +625,6 @@
"片假名": "KatakanaName", "片假名": "KatakanaName",
"罗马音": "Dźwięk romański", "罗马音": "Dźwięk romański",
"日语注音方案": "Japoński schemat fonetyczny", "日语注音方案": "Japoński schemat fonetyczny",
"保存当前游戏的文本处理流程": "Zapisz proces przetwarzania tekstu dla bieżącej gry",
"使用保存的文本处理流程": "Korzystanie z zapisanego procesu przetwarzania tekstu", "使用保存的文本处理流程": "Korzystanie z zapisanego procesu przetwarzania tekstu",
"Sakura大模型": "Duży model Sakura", "Sakura大模型": "Duży model Sakura",
"Magpie路径": "Ścieżka dla Sraków", "Magpie路径": "Ścieżka dla Sraków",
@ -831,5 +829,8 @@
"显示的项目": "Wyświetlane elementy", "显示的项目": "Wyświetlane elementy",
"首位的": "Pierwsze miejsce", "首位的": "Pierwsze miejsce",
"指定的": "Wyznaczone", "指定的": "Wyznaczone",
"设为显示的项目": "Ustaw jako wyświetlany projekt" "设为显示的项目": "Ustaw jako wyświetlany projekt",
"跟随默认": "Postępuj zgodnie z domyślnym",
"删除行": "Usuń wiersze",
"使用": "stosować"
} }

View File

@ -176,7 +176,6 @@
"記号": "знак", "記号": "знак",
"选择文件": "Выбор файла", "选择文件": "Выбор файла",
"缩放时禁用窗口大小调整": "Отключить изменение размера окна при масштабировании", "缩放时禁用窗口大小调整": "Отключить изменение размера окна при масштабировании",
"删除选中行": "Удалить выделенную запись",
"图标": "Значки", "图标": "Значки",
"指示詞": "указательное слово", "指示詞": "указательное слово",
"動詞": "глагол", "動詞": "глагол",
@ -626,7 +625,6 @@
"片假名": "Фильм под псевдонимом", "片假名": "Фильм под псевдонимом",
"罗马音": "Римские согласные", "罗马音": "Римские согласные",
"日语注音方案": "Японская фонетическая программа", "日语注音方案": "Японская фонетическая программа",
"保存当前游戏的文本处理流程": "Сохранить процесс обработки текста текущей игры",
"使用保存的文本处理流程": "Использовать сохраненный процесс обработки текста", "使用保存的文本处理流程": "Использовать сохраненный процесс обработки текста",
"Sakura大模型": "Большая модель Sakura", "Sakura大模型": "Большая модель Sakura",
"Magpie路径": "Путь Magpie", "Magpie路径": "Путь Magpie",
@ -831,5 +829,8 @@
"显示的项目": "Показать проект", "显示的项目": "Показать проект",
"首位的": "Первый", "首位的": "Первый",
"指定的": "Назначено", "指定的": "Назначено",
"设为显示的项目": "Показать проект" "设为显示的项目": "Показать проект",
"跟随默认": "Следуйте по умолчанию",
"删除行": "Удалить строку",
"使用": "Использование"
} }

View File

@ -21,7 +21,6 @@
"不支持的键位": "คีย์บอร์ดไม่รองรับ", "不支持的键位": "คีย์บอร์ดไม่รองรับ",
"英语(CP437)": "ภาษาไทย (CP437)", "英语(CP437)": "ภาษาไทย (CP437)",
"工具按钮颜色": "สีปุ่มเครื่องมือ", "工具按钮颜色": "สีปุ่มเครื่องมือ",
"删除选中行": "ลบบรรทัดที่เลือก",
"模拟按键Enter": "ปุ่มอะนาล็อก Enter", "模拟按键Enter": "ปุ่มอะนาล็อก Enter",
"去除重复行": "ลบแถวที่ซ้ำกัน", "去除重复行": "ลบแถวที่ซ้ำกัน",
"有道": "วิถี", "有道": "วิถี",
@ -626,7 +625,6 @@
"片假名": "คาตาคานะ", "片假名": "คาตาคานะ",
"罗马音": "เสียงโรมัน", "罗马音": "เสียงโรมัน",
"日语注音方案": "โปรแกรมบันทึกเสียงภาษาญี่ปุ่น", "日语注音方案": "โปรแกรมบันทึกเสียงภาษาญี่ปุ่น",
"保存当前游戏的文本处理流程": "บันทึกกระบวนการประมวลผลข้อความสำหรับเกมปัจจุบัน",
"使用保存的文本处理流程": "ใช้กระบวนการประมวลผลข้อความที่บันทึกไว้", "使用保存的文本处理流程": "ใช้กระบวนการประมวลผลข้อความที่บันทึกไว้",
"Sakura大模型": "Sakura ใหญ่ แบบ", "Sakura大模型": "Sakura ใหญ่ แบบ",
"Magpie路径": "เส้นทาง Magpie", "Magpie路径": "เส้นทาง Magpie",
@ -831,5 +829,8 @@
"显示的项目": "รายการที่แสดง", "显示的项目": "รายการที่แสดง",
"首位的": "อันดับแรก", "首位的": "อันดับแรก",
"指定的": "ระบุ", "指定的": "ระบุ",
"设为显示的项目": "รายการที่ตั้งเป็นจอแสดงผล" "设为显示的项目": "รายการที่ตั้งเป็นจอแสดงผล",
"跟随默认": "ติดตามค่าเริ่มต้น",
"删除行": "ลบบรรทัด",
"使用": "การใช้"
} }

View File

@ -176,7 +176,6 @@
"記号": "Simbol", "記号": "Simbol",
"选择文件": "Dosya Seç", "选择文件": "Dosya Seç",
"缩放时禁用窗口大小调整": "Ulaştırırken pencere ölçüsünü değiştirmeyi etkinleştir", "缩放时禁用窗口大小调整": "Ulaştırırken pencere ölçüsünü değiştirmeyi etkinleştir",
"删除选中行": "Seçili satır sil",
"图标": "İşaretçi", "图标": "İşaretçi",
"指示詞": "Deixis", "指示詞": "Deixis",
"動詞": "Verbs", "動詞": "Verbs",
@ -626,7 +625,6 @@
"片假名": "KatakanaKCharselect unicode block name", "片假名": "KatakanaKCharselect unicode block name",
"罗马音": "Romanik sesi", "罗马音": "Romanik sesi",
"日语注音方案": "Japon fonetik taslağı", "日语注音方案": "Japon fonetik taslağı",
"保存当前游戏的文本处理流程": "Mektup işleme sürecini şu oyun için kaydet",
"使用保存的文本处理流程": "Kaydedilen metin işleme sürecini kullanılıyor", "使用保存的文本处理流程": "Kaydedilen metin işleme sürecini kullanılıyor",
"Sakura大模型": "Sakura Büyük Modeli", "Sakura大模型": "Sakura Büyük Modeli",
"Magpie路径": "Magpie Yolu", "Magpie路径": "Magpie Yolu",
@ -831,5 +829,8 @@
"显示的项目": "Gösterilen öğeler", "显示的项目": "Gösterilen öğeler",
"首位的": "İlk yer", "首位的": "İlk yer",
"指定的": "Tasarlanmış", "指定的": "Tasarlanmış",
"设为显示的项目": "Gösterilen Proje olarak ayarlayın" "设为显示的项目": "Gösterilen Proje olarak ayarlayın",
"跟随默认": "Öntanımlı takip et",
"删除行": "Satırları Sil",
"使用": "uygulama"
} }

View File

@ -170,7 +170,6 @@
"記号": "Символ", "記号": "Символ",
"选择文件": "Виберіть файл", "选择文件": "Виберіть файл",
"缩放时禁用窗口大小调整": "Вимкнути зміну розміру вікна під час масштабу", "缩放时禁用窗口大小调整": "Вимкнути зміну розміру вікна під час масштабу",
"删除选中行": "Вилучити вибрані рядки",
"图标": "Піктограма", "图标": "Піктограма",
"指示詞": "Демонстративні слова", "指示詞": "Демонстративні слова",
"動詞": "Дієслова", "動詞": "Дієслова",
@ -626,7 +625,6 @@
"片假名": "Катаканаzambia_ districts. kgm", "片假名": "Катаканаzambia_ districts. kgm",
"罗马音": "Романський звук", "罗马音": "Романський звук",
"日语注音方案": "Японська фонетична схема", "日语注音方案": "Японська фонетична схема",
"保存当前游戏的文本处理流程": "Зберегти процес обробки тексту для поточної гри",
"使用保存的文本处理流程": "Використання збереженого процесу обробки тексту", "使用保存的文本处理流程": "Використання збереженого процесу обробки тексту",
"Sakura大模型": "Великий модель Sakura", "Sakura大模型": "Великий модель Sakura",
"Magpie路径": "Шлях до Magpie", "Magpie路径": "Шлях до Magpie",
@ -831,5 +829,8 @@
"显示的项目": "Показані елементи", "显示的项目": "Показані елементи",
"首位的": "Перше місце", "首位的": "Перше місце",
"指定的": "Визначено", "指定的": "Визначено",
"设为显示的项目": "Встановити як показаний проект" "设为显示的项目": "Встановити як показаний проект",
"跟随默认": "Слідувати типово",
"删除行": "Вилучити рядки",
"使用": "застосовувати"
} }

View File

@ -176,7 +176,6 @@
"記号": "Đánh dấu", "記号": "Đánh dấu",
"选择文件": "Chọn tập tin", "选择文件": "Chọn tập tin",
"缩放时禁用窗口大小调整": "Tắt thay đổi kích cỡ cửa sổ khi phóng to", "缩放时禁用窗口大小调整": "Tắt thay đổi kích cỡ cửa sổ khi phóng to",
"删除选中行": "Xoá dòng đã chọn",
"图标": "Biểu tượng", "图标": "Biểu tượng",
"指示詞": "Từ chỉ dẫn", "指示詞": "Từ chỉ dẫn",
"動詞": "Động từ", "動詞": "Động từ",
@ -626,7 +625,6 @@
"片假名": "Katakana", "片假名": "Katakana",
"罗马音": "Tiếng La Mã", "罗马音": "Tiếng La Mã",
"日语注音方案": "Chương trình chú thích tiếng Nhật", "日语注音方案": "Chương trình chú thích tiếng Nhật",
"保存当前游戏的文本处理流程": "Lưu luồng xử lý văn bản của trò chơi hiện tại",
"使用保存的文本处理流程": "Sử dụng quy trình xử lý văn bản đã lưu", "使用保存的文本处理流程": "Sử dụng quy trình xử lý văn bản đã lưu",
"Sakura大模型": "Sakura Lớn Mô hình", "Sakura大模型": "Sakura Lớn Mô hình",
"Magpie路径": "Đường Magpie", "Magpie路径": "Đường Magpie",
@ -831,5 +829,8 @@
"显示的项目": "Mục hiển thị", "显示的项目": "Mục hiển thị",
"首位的": "Đầu tiên", "首位的": "Đầu tiên",
"指定的": "Đã xác định", "指定的": "Đã xác định",
"设为显示的项目": "Mục được đặt làm Hiển thị" "设为显示的项目": "Mục được đặt làm Hiển thị",
"跟随默认": "Theo mặc định",
"删除行": "Xoá dòng",
"使用": "Sử dụng"
} }

View File

@ -21,7 +21,7 @@
"不支持的键位": "", "不支持的键位": "",
"英语(CP437)": "", "英语(CP437)": "",
"工具按钮颜色": "", "工具按钮颜色": "",
"删除选中行": "", "删除行": "",
"模拟按键Enter": "", "模拟按键Enter": "",
"去除重复行": "", "去除重复行": "",
"有道": "", "有道": "",
@ -626,7 +626,6 @@
"片假名": "", "片假名": "",
"罗马音": "", "罗马音": "",
"日语注音方案": "", "日语注音方案": "",
"保存当前游戏的文本处理流程": "",
"使用保存的文本处理流程": "", "使用保存的文本处理流程": "",
"Sakura大模型": "", "Sakura大模型": "",
"Magpie路径": "", "Magpie路径": "",
@ -831,5 +830,7 @@
"显示的项目": "", "显示的项目": "",
"首位的": "", "首位的": "",
"指定的": "", "指定的": "",
"设为显示的项目": "" "设为显示的项目": "",
"跟随默认": "",
"使用": ""
} }

View File

@ -28,8 +28,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/version)
include(generate_product_version) include(generate_product_version)
set(VERSION_MAJOR 3) set(VERSION_MAJOR 3)
set(VERSION_MINOR 5) set(VERSION_MINOR 6)
set(VERSION_PATCH 1) set(VERSION_PATCH 0)
add_library(pch pch.cpp) add_library(pch pch.cpp)
target_precompile_headers(pch PUBLIC pch.h) target_precompile_headers(pch PUBLIC pch.h)