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,
_TR,
_TRL,
postprocessconfig,
globalconfig,
static_data,
)
@ -20,9 +21,16 @@ from myutils.utils import (
str2rgba,
gamdidchangedtask,
titlechangedtask,
selectdebugfile,
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 (
ScrollFlow,
chartwidget,
@ -47,6 +55,7 @@ from gui.usefulwidget import (
makesubtab_lazy,
tabadd_lazy,
getsimpleswitch,
threebuttons,
getspinbox,
selectcolor,
listediter,
@ -407,20 +416,8 @@ class browserdialog(saveposwindow):
self.tagswidget.addTags(items)
def startupnavi(self, exepath):
for idx in range(1, 100):
if idx == 1:
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:
for idx in range(2, 100):
if idx == 2:
if exepath:
if len(savehook_new_data[exepath]["relationlinks"]):
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
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):
def selectexe(self):
f = QFileDialog.getOpenFileName(directory=self.exepath)
@ -626,30 +684,47 @@ class dialog_setting_game_internal(QWidget):
functools.partial(savehook_new_data[exepath].__setitem__, "title")
)
titleedit.returnPressed.connect(_titlechange)
formLayout.addRow(_TR("标题"), titleedit)
formLayout.addRow(
_TR("标题"),
getboxlayout(
[
titleedit,
getcolorbutton(
"",
"",
_titlechange,
icon="fa.search",
constcolor="#FF69B4",
),
]
),
)
methodtab, do = makesubtab_lazy(
_TRL(
[
"启动",
"HOOK",
"文本处理",
"画廊",
"标签",
"元数据",
"统计",
"预翻译",
"语音",
"预翻译",
"存档备份",
]
),
[
functools.partial(self.doaddtab, self.starttab, 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.getlabelsetting, exepath),
functools.partial(self.doaddtab, self.metadataorigin, 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.getpretranstab, exepath),
functools.partial(self.doaddtab, self.getbackup, exepath),
],
delay=True,
@ -690,18 +765,12 @@ class dialog_setting_game_internal(QWidget):
vndbid.returnPressed.connect(
functools.partial(gamdidchangedtask, key, idname, exepath)
)
formLayout.addRow(
key,
getboxlayout(
[
_vbox_internal = [
vndbid,
getcolorbutton(
"",
"",
functools.partial(
self.openrefmainpage, key, idname, exepath
),
functools.partial(self.openrefmainpage, key, idname, exepath),
icon="fa.chrome",
constcolor="#FF69B4",
),
@ -713,8 +782,25 @@ class dialog_setting_game_internal(QWidget):
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(
key,
getboxlayout(_vbox_internal),
)
return _w
def fengmiantab(self, exepath):
@ -1068,24 +1154,171 @@ class dialog_setting_game_internal(QWidget):
)
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):
_w = QWidget()
formLayout = QFormLayout()
_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(
_TR("特殊码"),
@ -1100,14 +1333,120 @@ class dialog_setting_game_internal(QWidget):
_TR("插入特殊码延迟(ms)"),
getspinbox(0, 1000000, savehook_new_data[exepath], "inserthooktimeout"),
)
if (
savehook_new_data[exepath]["use_saved_text_process"]
or "save_text_process_info" in savehook_new_data[exepath]
):
__extraw = QWidget()
def __function(_):
__extraw.setEnabled(not _)
try:
gobject.baseobject.textsource.setsettings()
except:
pass
formLayout.addRow(
_TR("使用保存的文本处理流程"),
getsimpleswitch(savehook_new_data[exepath], "use_saved_text_process"),
_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
@ -2091,18 +2430,20 @@ class pixwrapper(QWidget):
self.visidx()
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.setDevicePixelRatio(self.devicePixelRatioF())
self.pixview.setPixmap(self.scalepix(pixmap))
elif self.pixmapi < len(self.pixmaps):
pixmap = self.pixmaps[self.pixmapi]
savehook_new_data[self.k]["currentvisimage"] = pixmap
pixmap = QPixmap.fromImage(QImage(pixmap))
else:
self.pixmapi = min(len(self.pixmaps) - 1, self.pixmapi)
pixmap_ = self.pixmaps[self.pixmapi]
pixmap = QPixmap.fromImage(QImage(pixmap_))
if pixmap is None or pixmap.isNull():
self.pixmaps.pop(self.pixmapi)
return self.visidx()
savehook_new_data[self.k]["currentvisimage"] = pixmap_
pixmap.setDevicePixelRatio(self.devicePixelRatioF())
self.pixview.setPixmap(self.scalepix(pixmap))

View File

@ -2,7 +2,14 @@ from qtsymbols import *
import functools, os, json
import windows, gobject
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.codeacceptdialog import codeacceptdialog
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),
(D_getsimpleswitch(globalconfig, "direct_filterrepeat"), 1),
@ -116,7 +139,6 @@ def gethookgrid(self):
3,
),
],
[],
[
("过滤包含乱码的文本行", 5),
(D_getsimpleswitch(globalconfig, "filter_chaos_code"), 1),
@ -131,7 +153,6 @@ def gethookgrid(self):
1,
),
],
[],
[("区分人名和文本", 5), D_getsimpleswitch(globalconfig, "allow_set_text_name")],
[("使用YAPI注入", 5), D_getsimpleswitch(globalconfig, "use_yapi")],
]

View File

@ -1,7 +1,5 @@
from qtsymbols import *
import functools, copy, os
from traceback import print_exc
import gobject
import functools
from myutils.post import POSTSOLVE
from myutils.utils import (
selectdebugfile,
@ -13,8 +11,6 @@ from myutils.config import (
postprocessconfig,
static_data,
_TRL,
savehook_new_data,
_TR,
)
from gui.codeacceptdialog import codeacceptdialog
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):
try:
self.__fromtext.setPlainText(s)
@ -234,24 +196,7 @@ def setTab7_lazy(self, basel):
def ___(lay):
vboxw, vbox = getvboxwidget()
lay.addWidget(vboxw)
_w = 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)
makescrollgrid(grids, vbox, True, savelist, savelay)
vbox.addWidget(getcomparelayout(self))

View File

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

View File

@ -17,6 +17,21 @@ class common:
def getidbytitle(title):
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
def proxy(self):
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):
def querysettingwindow(self, parent):
items = autoinitdialog_items(self.config_all)
autoinitdialog(parent, self.name, 800, items)
def getidbytitle(self, title):
@ -36,7 +40,8 @@ class searcher(common):
"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",
}
if self.config["access-token"].strip() != "":
headers["Authorization"] = ("Bearer " + self.config["access-token"],)
response = self.proxysession.get(
f"https://api.bgm.tv/v0/subjects/{sid}", headers=headers
)
@ -59,7 +64,6 @@ class searcher(common):
return {
# "namemap": namemap,
"title": response["name_cn"],
# "infopath": parsehtmlmethod(vndbdowloadinfo(vid)),
"imagepath_all": [imagepath],
"webtags": vndbtags,
"developers": developers,

View File

@ -2,7 +2,7 @@ import requests, re
from myutils.utils import simplehtmlparser
from myutils.metadata.abstract import common
from metadata.abstract import common
class searcher(common):
@ -115,7 +115,6 @@ class searcher(common):
return {
# "namemap": namemap,
"title": title,
# "infopath": parsehtmlmethod(vndbdowloadinfo(vid)),
"imagepath_all": [self.dispatchdownloadtask(_) for _ in imags1 + imags2],
"webtags": tags,
"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
from myutils.config import globalconfig, tryreadconfig, safesave
from threading import Thread
import requests, re, os
from myutils.config import tryreadconfig, safesave
import gzip, json
import shutil
from myutils.metadata.abstract import common
from metadata.abstract import common
def safegetvndbjson(proxy, url, json, getter):
@ -216,39 +215,6 @@ def getvntagsbyid(proxy, vid):
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):
if path and os.path.exists(path):
@ -302,11 +268,6 @@ class searcher(common):
return {
"namemap": namemap,
"title": title,
"infopath": parsehtmlmethod(
self.dispatchdownloadtask(
self.refmainpage(_vid), ishtml=True, delay=False
)
),
"imagepath_all": __,
"webtags": vndbtags,
"developers": developers,

View File

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

View File

@ -357,7 +357,7 @@ def POSTSOLVE(line):
try:
if "pname" in dir(gobject.baseobject.textsource):
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"][
"rank"
]

View File

@ -98,21 +98,6 @@ class 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):
__t = []
@ -145,8 +130,6 @@ def guessmaybetitle(gamepath):
targetmod = {}
for k in globalconfig["metadata"]:
targetmod[k] = importlib.import_module(f"myutils.metadata.{k}").searcher(k)
def trysearchforid(gamepath, searchargs: list):
@ -181,8 +164,8 @@ def trysearchfordata(gamepath, arg):
try:
data = targetmod[key].searchfordata(vid)
except:
print_exc()
data = {}
infopath = data.get("infopath", None)
title = data.get("title", None)
namemap = data.get("namemap", None)
developers = data.get("developers", [])
@ -194,10 +177,16 @@ def trysearchfordata(gamepath, arg):
continue
if _ not in savehook_new_data[gamepath]["imagepath_all"]:
savehook_new_data[gamepath]["imagepath_all"].append(_)
if title and (not savehook_new_data[gamepath]["istitlesetted"]):
if title:
if not savehook_new_data[gamepath]["istitlesetted"]:
savehook_new_data[gamepath]["title"] = title
if infopath:
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:
savehook_new_data[gamepath]["namemap"] = namemap
if len(webtags):
@ -228,9 +217,6 @@ def everymethodsthread():
print_exc()
threading.Thread(target=everymethodsthread).start()
def gamdidchangedtask(key, idname, gamepath):
vid = savehook_new_data[gamepath][idname]
if vid == "":
@ -256,8 +242,8 @@ def titlechangedtask(gamepath, title):
def checkifnewgame(targetlist, gamepath, title=None):
isnew = gamepath in targetlist
if not isnew:
isnew = gamepath not in targetlist
if isnew:
targetlist.insert(0, gamepath)
if gamepath not in savehook_new_data:
savehook_new_data[gamepath] = getdefaultsavehook(gamepath, title)
@ -368,9 +354,11 @@ class wavmp3player:
return durationms
def selectdebugfile(path):
def selectdebugfile(path: str, ismypost=False):
if ismypost:
path = f"./userconfig/posts/{path}.py"
p = os.path.abspath((path))
os.makedirs(os.path.dirname(p), exist_ok=True)
if os.path.exists(p) == False:
with open(p, "w", encoding="utf8") as ff:
@ -385,7 +373,7 @@ class TS(basetrans):
return content
"""
)
elif path == "./userconfig/mypost.py":
elif path == "./userconfig/mypost.py" or ismypost:
ff.write(
"""
def POSTSOLVE(line):
@ -740,3 +728,10 @@ class LRUCache:
if not _:
self.put(key)
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):
@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__(
self, pids, hwnd, pname, autostarthookcode=None, needinserthookcode=None
):
@ -90,6 +105,9 @@ class texthook(basetext):
autostarthookcode = []
if needinserthookcode is None:
needinserthookcode = []
self.pname = pname
self.pids = pids
self.hwnd = hwnd
self.keepref = []
self.newline = Queue()
self.newline_delaywait = Queue()
@ -102,15 +120,12 @@ class texthook(basetext):
self.selectinghook = None
self.selectedhook = []
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.pname = pname
self.hwnd = hwnd
self.runonce_line = ""
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.needinserthookcode = needinserthookcode
@ -221,7 +236,7 @@ class texthook(basetext):
injectpids = []
for pid in self.pids:
if globalconfig["use_yapi"]:
if self.config["use_yapi"]:
self.Luna_Inject(pid, os.path.abspath("./files/plugins/LunaHook"))
else:
if self.Luna_CreatePipeAndCheck(pid):
@ -347,16 +362,16 @@ class texthook(basetext):
def setsettings(self):
self.Luna_Settings(
globalconfig["textthreaddelay"],
globalconfig["direct_filterrepeat"],
self.config["textthreaddelay"],
self.config["direct_filterrepeat"],
self.codepage(),
globalconfig["maxBufferSize"],
globalconfig["maxHistorySize"],
self.config["maxBufferSize"],
self.config["maxHistorySize"],
)
def codepage(self):
try:
cpi = savehook_new_data[self.pname]["codepage_index"]
cpi = self.config["codepage_index"]
cp = static_data["codepage_real"][cpi]
except:
cp = 932
@ -427,7 +442,7 @@ class texthook(basetext):
@threader
def delaycollectallselectedoutput(self):
while True:
time.sleep(globalconfig["textthreaddelay"] / 1000)
time.sleep(self.config["textthreaddelay"] / 1000)
if self.newline_delaywait.empty():
continue
@ -444,7 +459,7 @@ class texthook(basetext):
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
key = (hc, hn.decode("utf8"), tp)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -176,7 +176,6 @@
"記号": "Marque",
"选择文件": "Sélectionner un fichier",
"缩放时禁用窗口大小调整": "Désactiver le redimensionnement de la fenêtre lors du zoom",
"删除选中行": "Supprimer la ligne sélectionnée",
"图标": "Icônes",
"指示詞": "Mot indicateur",
"動詞": "Verbes",
@ -626,7 +625,6 @@
"片假名": "Nom du film",
"罗马音": "Voix romaine",
"日语注音方案": "Programme d'accent japonais",
"保存当前游戏的文本处理流程": "Enregistrer le processus de traitement de texte du jeu actuel",
"使用保存的文本处理流程": "Utiliser le processus de traitement de texte sauvegardé",
"Sakura大模型": "Sakura Grand Modèle",
"Magpie路径": "Le chemin Magpie",
@ -831,5 +829,8 @@
"显示的项目": "Projets affichés",
"首位的": "La première",
"指定的": "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",
"选择文件": "Seleziona file",
"缩放时禁用窗口大小调整": "Disabilita il ridimensionamento delle finestre durante lo zoom",
"删除选中行": "Elimina righe selezionate",
"图标": "icona",
"指示詞": "Parole dimostrative",
"動詞": "Verbi",
@ -626,7 +625,6 @@
"片假名": "Katakana",
"罗马音": "Suono romanico",
"日语注音方案": "Schema fonetico giapponese",
"保存当前游戏的文本处理流程": "Salva il processo di elaborazione del testo per il gioco corrente",
"使用保存的文本处理流程": "Utilizzo di un processo di elaborazione del testo salvato",
"Sakura大模型": "Modello Sakura Large",
"Magpie路径": "Percorso magpie",
@ -831,5 +829,8 @@
"显示的项目": "Articoli visualizzati",
"首位的": "Primo posto",
"指定的": "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ビッグモデル",
"Magpie路径": "Magpieパス",
@ -831,5 +829,8 @@
"显示的项目": "表示されるアイテム",
"首位的": "トップ",
"指定的": "指定された",
"设为显示的项目": "表示する項目として設定"
"设为显示的项目": "表示する項目として設定",
"跟随默认": "デフォルトに従う",
"删除行": "行の削除",
"使用": "使用"
}

View File

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

View File

@ -176,7 +176,6 @@
"記号": "Symbol",
"选择文件": "Wybierz plik",
"缩放时禁用窗口大小调整": "Wyłącz zmianę rozmiaru okna podczas powiększania",
"删除选中行": "Usuń zaznaczone wiersze",
"图标": "Ikona",
"指示詞": "Słowa demonstracyjne",
"動詞": "Czasowniki",
@ -626,7 +625,6 @@
"片假名": "KatakanaName",
"罗马音": "Dźwięk romański",
"日语注音方案": "Japoński schemat fonetyczny",
"保存当前游戏的文本处理流程": "Zapisz proces przetwarzania tekstu dla bieżącej gry",
"使用保存的文本处理流程": "Korzystanie z zapisanego procesu przetwarzania tekstu",
"Sakura大模型": "Duży model Sakura",
"Magpie路径": "Ścieżka dla Sraków",
@ -831,5 +829,8 @@
"显示的项目": "Wyświetlane elementy",
"首位的": "Pierwsze miejsce",
"指定的": "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",
"Magpie路径": "Путь Magpie",
@ -831,5 +829,8 @@
"显示的项目": "Показать проект",
"首位的": "Первый",
"指定的": "Назначено",
"设为显示的项目": "Показать проект"
"设为显示的项目": "Показать проект",
"跟随默认": "Следуйте по умолчанию",
"删除行": "Удалить строку",
"使用": "Использование"
}

View File

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

View File

@ -176,7 +176,6 @@
"記号": "Simbol",
"选择文件": "Dosya Seç",
"缩放时禁用窗口大小调整": "Ulaştırırken pencere ölçüsünü değiştirmeyi etkinleştir",
"删除选中行": "Seçili satır sil",
"图标": "İşaretçi",
"指示詞": "Deixis",
"動詞": "Verbs",
@ -626,7 +625,6 @@
"片假名": "KatakanaKCharselect unicode block name",
"罗马音": "Romanik sesi",
"日语注音方案": "Japon fonetik taslağı",
"保存当前游戏的文本处理流程": "Mektup işleme sürecini şu oyun için kaydet",
"使用保存的文本处理流程": "Kaydedilen metin işleme sürecini kullanılıyor",
"Sakura大模型": "Sakura Büyük Modeli",
"Magpie路径": "Magpie Yolu",
@ -831,5 +829,8 @@
"显示的项目": "Gösterilen öğeler",
"首位的": "İlk yer",
"指定的": "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",
"罗马音": "Романський звук",
"日语注音方案": "Японська фонетична схема",
"保存当前游戏的文本处理流程": "Зберегти процес обробки тексту для поточної гри",
"使用保存的文本处理流程": "Використання збереженого процесу обробки тексту",
"Sakura大模型": "Великий модель Sakura",
"Magpie路径": "Шлях до Magpie",
@ -831,5 +829,8 @@
"显示的项目": "Показані елементи",
"首位的": "Перше місце",
"指定的": "Визначено",
"设为显示的项目": "Встановити як показаний проект"
"设为显示的项目": "Встановити як показаний проект",
"跟随默认": "Слідувати типово",
"删除行": "Вилучити рядки",
"使用": "застосовувати"
}

View File

@ -176,7 +176,6 @@
"記号": "Đánh dấu",
"选择文件": "Chọn tập tin",
"缩放时禁用窗口大小调整": "Tắt thay đổi kích cỡ cửa sổ khi phóng to",
"删除选中行": "Xoá dòng đã chọn",
"图标": "Biểu tượng",
"指示詞": "Từ chỉ dẫn",
"動詞": "Động từ",
@ -626,7 +625,6 @@
"片假名": "Katakana",
"罗马音": "Tiếng La Mã",
"日语注音方案": "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",
"Sakura大模型": "Sakura Lớn Mô hình",
"Magpie路径": "Đường Magpie",
@ -831,5 +829,8 @@
"显示的项目": "Mục hiển thị",
"首位的": "Đầu tiên",
"指定的": "Đã 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)": "",
"工具按钮颜色": "",
"删除选中行": "",
"删除行": "",
"模拟按键Enter": "",
"去除重复行": "",
"有道": "",
@ -626,7 +626,6 @@
"片假名": "",
"罗马音": "",
"日语注音方案": "",
"保存当前游戏的文本处理流程": "",
"使用保存的文本处理流程": "",
"Sakura大模型": "",
"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)
set(VERSION_MAJOR 3)
set(VERSION_MINOR 5)
set(VERSION_PATCH 1)
set(VERSION_MINOR 6)
set(VERSION_PATCH 0)
add_library(pch pch.cpp)
target_precompile_headers(pch PUBLIC pch.h)