This commit is contained in:
恍兮惚兮 2024-11-30 08:45:58 +08:00
parent 7812e10585
commit 54670ea45c
28 changed files with 143 additions and 348 deletions

View File

@ -90,15 +90,21 @@ def downloadlr():
subprocess.run(f"curl -LO {LocaleRe}")
subprocess.run(f"7z x {LocaleRe.split('/')[-1]} -oLR")
os.makedirs(
f"{rootDir}/files/plugins/Locale_Remulator",
rf"{rootDir}\files\plugins\Locale\Locale_Remulator.1.5.4",
exist_ok=True,
)
for _dir, _, _fs in os.walk("LR"):
for f in _fs:
if f in ["LRHookx64.dll", "LRHookx32.dll"]:
if f in [
"LRHookx64.dll",
"LRHookx32.dll",
"LRConfig.xml",
"LRProc.exe",
"LRSubMenus.dll",
]:
shutil.move(
os.path.join(_dir, f),
f"{rootDir}/files/plugins/Locale_Remulator",
rf"{rootDir}\files\plugins\Locale\Locale_Remulator.1.5.4",
)
@ -123,12 +129,15 @@ def downloadmecab():
subprocess.run(f"curl -LO {mylinks['mecab.zip']}")
subprocess.run(f"7z x mecab.zip -oALL")
move_directory_contents("ALL/ALL", f"{rootDir}/files/plugins")
def downloadmecabxp():
os.chdir(rootDir + "\\temp")
subprocess.run(f"curl -LO {mylinks['mecab_xp.zip']}")
subprocess.run(f"7z x mecab_xp.zip -oALL")
move_directory_contents("ALL/ALL", f"{rootDir}/files/plugins")
def downloadmapie():
os.chdir(rootDir + "\\temp")
subprocess.run(f"curl -LO {mylinks['magpie.zip']}")
@ -140,28 +149,37 @@ def downloadLocaleEmulator():
os.chdir(rootDir + "\\temp")
subprocess.run(f"curl -LO {localeEmulatorFile}")
subprocess.run(f"7z x {localeEmulatorFile.split('/')[-1]} -oLocaleEmulator")
shutil.move(
"LocaleEmulator/LoaderDll.dll",
f"{rootDir}/files/plugins/LoaderDll.dll",
)
shutil.move(
"LocaleEmulator/LocaleEmulator.dll",
f"{rootDir}/files/plugins/LocaleEmulator.dll",
os.makedirs(
rf"{rootDir}\files\plugins\Locale\Locale.Emulator.2.5.0.1",
exist_ok=True,
)
for _dir, _, _fs in os.walk("LocaleEmulator"):
for f in _fs:
if f in [
"LoaderDll.dll",
"LocaleEmulator.dll",
"LEProc.exe",
"LEConfig.xml",
"LECommonLibrary.dll",
]:
shutil.move(
os.path.join(_dir, f),
rf"{rootDir}\files\plugins\Locale\Locale.Emulator.2.5.0.1",
)
def downloadNtlea():
os.chdir(rootDir + "\\temp")
subprocess.run(f"curl -LO {ntleaFile}")
subprocess.run(f"7z x {ntleaFile.split('/')[-1]} -ontlea")
shutil.move(
"ntlea/x86/ntleai.dll",
f"{rootDir}/files/plugins/NTLEAS/ntleai.dll",
)
shutil.move(
"ntlea/x64/ntleak.dll",
f"{rootDir}/files/plugins/NTLEAS/ntleak.dll",
os.makedirs(
rf"{rootDir}\files\plugins\Locale\ntleas046_x64",
exist_ok=True,
)
shutil.copytree("ntlea/x86", rf"{rootDir}\files\plugins\Locale\ntleas046_x64\x86")
shutil.copytree("ntlea/x64", rf"{rootDir}\files\plugins\Locale\ntleas046_x64\x64")
def downloadCurl():

3
.gitmodules vendored
View File

@ -10,9 +10,6 @@
[submodule "src/plugins/libs/tinymp3"]
path = cpp/libs/tinymp3
url = https://github.com/HIllya51/tinymp3
[submodule "src/plugins/libs/Detours"]
path = cpp/libs/Detours
url = https://github.com/microsoft/Detours
[submodule "src/plugins/libs/Clipper2"]
path = cpp/libs/Clipper2
url = https://github.com/AngusJohnson/Clipper2

@ -1 +0,0 @@
Subproject commit e4bfd6b03e50de46b47abfbd1e46b384f0c5f833

View File

@ -6,8 +6,8 @@ option(IS_LUNAHOOK "IS_LUNAHOOK" OFF)
if(IS_LUNAHOOK)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/minhook ${CMAKE_BINARY_DIR}/minhook)
else()
add_library(Detours ${CMAKE_CURRENT_LIST_DIR}/Detours/src/creatwth.cpp ${CMAKE_CURRENT_LIST_DIR}/Detours/src/detours.cpp ${CMAKE_CURRENT_LIST_DIR}/Detours/src/modules.cpp ${CMAKE_CURRENT_LIST_DIR}/Detours/src/disasm.cpp)
target_include_directories(Detours PUBLIC ${CMAKE_CURRENT_LIST_DIR}/Detours/src)
# add_library(Detours ${CMAKE_CURRENT_LIST_DIR}/Detours/src/creatwth.cpp ${CMAKE_CURRENT_LIST_DIR}/Detours/src/detours.cpp ${CMAKE_CURRENT_LIST_DIR}/Detours/src/modules.cpp ${CMAKE_CURRENT_LIST_DIR}/Detours/src/disasm.cpp)
# target_include_directories(Detours PUBLIC ${CMAKE_CURRENT_LIST_DIR}/Detours/src)
add_library(wil INTERFACE)
target_include_directories(wil INTERFACE ${CMAKE_CURRENT_LIST_DIR}/wil/include)

View File

@ -11,13 +11,13 @@ generate_product_version(
VERSION_PATCH ${VERSION_PATCH}
)
set(shareddllproxy_common shareddllproxy.cpp dllinject.cpp ntleas.cpp aspatch.cpp update.cpp ${versioninfo})
set(shareddllproxy_common shareddllproxy.cpp dllinject.cpp aspatch.cpp update.cpp ${versioninfo})
if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
add_executable(shareddllproxy ${shareddllproxy_common})
else()
add_executable(shareddllproxy ${shareddllproxy_common} Atlas.cpp eztrans.cpp dreye.cpp jbj7.cpp kingsoft.cpp le.cpp neospeech.cpp ../implsapi.cpp LR.cpp)
add_executable(shareddllproxy ${shareddllproxy_common} Atlas.cpp eztrans.cpp dreye.cpp jbj7.cpp kingsoft.cpp neospeech.cpp ../implsapi.cpp)
add_subdirectory(voiceroid2)
endif()
@ -28,6 +28,6 @@ if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
set_target_properties(shareddllproxy PROPERTIES OUTPUT_NAME "shareddllproxy64")
else()
target_precompile_headers(voiceroid2 REUSE_FROM pch)
target_link_libraries(shareddllproxy nlohmann Mfplat mfuuid voiceroid2 Detours)
target_link_libraries(shareddllproxy nlohmann Mfplat mfuuid voiceroid2)
set_target_properties(shareddllproxy PROPERTIES OUTPUT_NAME "shareddllproxy32")
endif()

View File

@ -1,17 +1,14 @@
#pragma comment(linker, "/subsystem:windows /entry:wmainCRTStartup")
int dllinjectwmain(int argc, wchar_t *argv[]);
int ntleaswmain(int argc, wchar_t *wargv[]);
int updatewmain(int argc, wchar_t *wargv[]);
bool checkisapatch();
#ifndef _WIN64
// int mainmp3(int argc, wchar_t *argv[]);
int LRwmain(int argc, wchar_t *argv[]);
int jbjwmain(int argc, wchar_t *argv[]);
int dreyewmain(int argc, wchar_t *argv[]);
int kingsoftwmain(int argc, wchar_t *argv[]);
int voiceroid2wmain(int argc, wchar_t *argv[]);
int lewmain(int argc, wchar_t *argv[]);
int neospeech(int argc, wchar_t *argv[]);
int neospeechlist(int argc, wchar_t *argv[]);
int eztrans(int argc, wchar_t *argv[]);
@ -62,13 +59,10 @@ int wmain(int argc, wchar_t *argv[])
typedef int (*wmaint)(int, wchar_t **);
std::map<std::wstring, wmaint> fm = {
{L"dllinject", dllinjectwmain},
{L"ntleas", ntleaswmain},
{L"listpm", listprocessmodule},
{L"update", updatewmain},
#ifndef _WIN64
// {L"mainmp3", mainmp3},
{L"LR", LRwmain},
{L"le", lewmain},
{L"jbj7", jbjwmain},
{L"dreye", dreyewmain},
{L"kingsoft", kingsoftwmain},

View File

@ -1,18 +1,9 @@
import windows, os, winsharedutils, re, functools
from qtsymbols import *
from myutils.config import savehook_new_data, get_launchpath, globalconfig, get_platform
from gui.usefulwidget import (
getlineedit,
getsimplecombobox,
getspinbox,
getsimpleswitch,
SuperCombo,
getspinbox,
SplitLine,
getsimplepatheditor,
clearlayout,
)
from gui.dynalang import LFormLayout
from gui.usefulwidget import getlineedit, getsimplecombobox, getsimplepatheditor
from traceback import print_exc
import xml.etree.ElementTree as ET
class Launcher:
@ -52,107 +43,90 @@ class LEbase(Launcher):
self.runX(execheck3264, usearg, dirpath, config)
class settingxx:
use_which = ...
def switchidx(self, lay1, lay2, call1, call2, config, idx):
clearlayout(lay1)
clearlayout(lay2)
config[self.use_which] = idx
(call1, call2)[1 - idx](lay1, config)
def settingxx(self, layout, config, call1, call2):
switch = SuperCombo()
switch.addItems(["外部", "内置"])
lay1 = LFormLayout()
lay2 = LFormLayout()
layout.addRow("优先使用", switch)
layout.addRow(SplitLine())
layout.addRow(lay1)
layout.addRow(lay2)
switch.setCurrentIndex(config.get(self.use_which, 0))
switch.currentIndexChanged.connect(
functools.partial(self.switchidx, lay1, lay2, call1, call2, config)
)
switch.currentIndexChanged.emit(switch.currentIndex())
class le_internal(LEbase, settingxx):
class le_internal(LEbase):
name = "Locale Emulator"
id = "le"
use_which = "le_use_which"
default = dict(
LCID=0x11, CodePage=932, RedirectRegistry=False, HookUILanguageAPI=False
)
def getlrpath(self):
LEProc = globalconfig.get("le_extra_path", "")
if not (LEProc and os.path.exists(LEProc)):
LEProc = os.path.abspath(
"files/plugins/Locale/Locale.Emulator.2.5.0.1/LEProc.exe"
)
return LEProc
def profiles(self, config):
_Names = []
_Guids = []
_run_as_admins = []
exe = config.get("gamepath", None)
def parseone(xmlpath):
Names, Guids = [], []
Names, Guids, run_as_admins = [], [], []
with open(xmlpath, "r", encoding="utf8") as ff:
for Name, Guid in re.findall('Name="(.*?)" Guid="(.*?)"', ff.read()):
Names.append(Name)
Guids.append(Guid)
return Names, Guids
root = ET.fromstring(ff.read())
profiles = root.find("Profiles").findall("Profile")
finds = [
os.path.join(
os.path.dirname(globalconfig.get("le_extra_path", "")), "LEConfig.xml"
)
]
for profile in profiles:
Names.append(profile.attrib.get("Name"))
Guids.append(profile.attrib.get("Guid"))
run_as_admins.append(
profile.find("RunAsAdmin").text.lower() == "true"
)
return Names, Guids, run_as_admins
finds = [os.path.join(os.path.dirname(self.getlrpath()), "LEConfig.xml")]
if exe:
finds.append(exe + ".le.config")
for f in finds:
try:
Names, Guids = parseone(f)
Names, Guids, run_as_admins = parseone(f)
_Guids += Guids
_Names += Names
_run_as_admins += run_as_admins
except:
pass
return _Names, _Guids
return _Names, _Guids, _run_as_admins
def runXX(self, exe, usearg, dirpath, config):
LEProc = globalconfig.get("le_extra_path", "")
if not LEProc:
return
guids = self.profiles(config)[1]
guids_ = self.profiles({})[1]
def runX(self, exe, usearg, dirpath, config):
LEProc = self.getlrpath()
prof = self.profiles(config)
prof_ = self.profiles({})
guid = config.get("leguid", None)
if guid not in guids:
guid = guids[0]
if guid in guids_:
arg = '"{}" -runas {} {}'.format(LEProc, guid, usearg)
if guid not in prof[1]:
guid = prof[1][0]
if guid in prof_[1]:
idx = prof_[1].index(guid)
admin = prof_[2][idx]
arg = "-runas {} {}".format(guid, usearg)
else:
# 程序的配置运行
arg = '"{}" -run {}'.format(LEProc, usearg)
windows.CreateProcess(
arg = "-run {}".format(usearg)
admin = False
windows.ShellExecute(
None,
"runas" if admin else "open",
LEProc,
arg,
None,
None,
False,
0,
None,
dirpath,
windows.STARTUPINFO(),
windows.SW_SHOWNORMAL,
)
def reselect(self, config, Guids, path):
globalconfig["le_extra_path"] = path
Names, _Guids = self.profiles(config)
Names, _Guids, _ = self.profiles(config)
self.__profiles.clear()
self.__profiles.addItems(Names)
Guids.clear()
Guids.extend(_Guids)
def settingX(self, layout, config):
Names, Guids = self.profiles(config)
def setting(self, layout, config):
Names, Guids, _ = self.profiles(config)
self.__profiles = getsimplecombobox(Names, config, "leguid", internal=Guids)
layout.addRow(
"路径",
@ -176,59 +150,12 @@ class le_internal(LEbase, settingxx):
continue
config[k] = v
def runX(self, exe, usearg, dirpath, config):
if config.get(self.use_which, 0) == 0:
valid = os.path.exists(globalconfig.get("le_extra_path", ""))
if valid:
return self.runXX(exe, usearg, dirpath, config)
shareddllproxy = os.path.abspath("./files/plugins/shareddllproxy32")
def _get(k):
return config.get("LE_" + k, self.default[k])
param = '{ANSICodePage} {OEMCodePage} {LCID} "{dirname}" {RedirectRegistry} {HookUILanguageAPI}'.format(
LCID=_get("LCID"),
OEMCodePage=_get("CodePage"),
ANSICodePage=_get("CodePage"),
dirname=dirpath,
RedirectRegistry=int(_get("RedirectRegistry")),
HookUILanguageAPI=int(_get("HookUILanguageAPI")),
)
windows.CreateProcess(
None,
'"{}" {} {} {}'.format(shareddllproxy, "le", param, usearg),
None,
None,
False,
0,
None,
dirpath,
windows.STARTUPINFO(),
)
def setting(self, layout, config):
self.settingxx(layout, config, self.setting1, self.settingX)
def setting1(self, layout, config):
self.loaddf(config)
layout.addRow("LCID", getspinbox(0, 0xFFFFF, config, "LE_LCID"))
layout.addRow("CodePage", getspinbox(0, 0xFFFFF, config, "LE_CodePage"))
layout.addRow(
"RedirectRegistry", getsimpleswitch(config, "LE_RedirectRegistry")
)
layout.addRow(
"HookUILanguageAPI", getsimpleswitch(config, "LE_HookUILanguageAPI")
)
class NTLEAS64(LEbase, settingxx):
class NTLEAS64(LEbase):
name = "Ntleas"
id = "ntleas"
bit = 6
bit64 = True
use_which = "ntleas_use_which"
default = dict(LCID=0x411, CodePage=932, TimeZone=540)
def loaddf(self, config):
@ -238,82 +165,40 @@ class NTLEAS64(LEbase, settingxx):
continue
config[k] = v
def getlrpath(self):
LEProc = globalconfig.get("ntleas_extra_path", "")
if not (LEProc and os.path.exists(LEProc)):
LEProc = os.path.abspath(
"files/plugins/Locale/ntleas046_x64/_no_use_for_dir"
)
return LEProc
def runX(self, exe, usearg, dirpath, config):
if config.get(self.use_which, 0) == 0:
valid = os.path.exists(self.__path())
if valid:
return self.runXX(exe, usearg, dirpath, config)
shareddllproxy = os.path.abspath(
("./files/plugins/shareddllproxy32", "./files/plugins/shareddllproxy64")[
self.bit == 6
]
)
def _get(k):
return config.get("NT_" + k, self.default[k])
param = "{dwCompOption} {dwCodePage} {dwLCID} {dwTimeZone}".format(
dwCompOption=0,
dwCodePage=_get("CodePage"),
dwLCID=_get("LCID"),
dwTimeZone=-_get("TimeZone"),
)
windows.CreateProcess(
None,
'"{}" {} {} {}'.format(shareddllproxy, "ntleas", param, usearg),
None,
None,
False,
0,
None,
dirpath,
windows.STARTUPINFO(),
)
def setting1(self, layout, config):
self.loaddf(config)
layout.addRow("LCID", getspinbox(0, 0xFFFFF, config, "NT_LCID"))
layout.addRow("CodePage", getspinbox(0, 0xFFFFF, config, "NT_CodePage"))
layout.addRow("TimeZone", getspinbox(0, 0xFFFFF, config, "NT_TimeZone"))
def setting(self, layout, config):
self.settingxx(layout, config, self.setting1, self.settingX)
def __path(self):
return os.path.join(
os.path.dirname(globalconfig.get("ntleas_extra_path", "")),
LEProc = os.path.join(
os.path.dirname(self.getlrpath()),
["x86", "x64"][self.bit64],
"ntleas.exe",
)
def runXX(self, exe, usearg, dirpath, config):
LEProc = self.__path()
if not LEProc:
return
arg = '"{}" {} {}'.format(
LEProc,
arg = "{} {}".format(
usearg,
config.get("ntleasparam", '"C932" "L1041" "FMS PGothic" "P4"'),
)
windows.CreateProcess(
windows.ShellExecute(
None,
"open",
LEProc,
arg,
None,
None,
False,
0,
None,
dirpath,
windows.STARTUPINFO(),
windows.SW_SHOWNORMAL,
)
def reselect(self, path):
globalconfig["ntleas_extra_path"] = path
def settingX(self, layout, config):
def setting(self, layout, config):
if "ntleasparam" not in config:
config["ntleasparam"] = '"C932" "L1041" "FMS PGothic" "P4"'
layout.addRow(
@ -337,10 +222,9 @@ class NTLEAS32(NTLEAS64):
bit64 = False
class lr_internal(LEbase, settingxx):
class lr_internal(LEbase):
name = "Locale Remulator"
id = "lr"
use_which = "lr_use_which"
default = dict(LCID=0x411, CodePage=932, TimeZone=540, HookIME=False, HookLCID=True)
def loaddf(self, config):
@ -350,100 +234,69 @@ class lr_internal(LEbase, settingxx):
continue
config[k] = v
def runX(self, exe, usearg, dirpath, config):
if config.get(self.use_which, 0) == 0:
valid = os.path.exists(globalconfig.get("lr_extra_path", ""))
if valid:
return self.runXX(exe, usearg, dirpath, config)
shareddllproxy = os.path.abspath("./files/plugins/shareddllproxy32")
def _get(k):
return config.get("LR_" + k, self.default[k])
param = "{CodePage} {LCID} {Bias} {HookIME} {HookLCID}".format(
LCID=_get("LCID"),
CodePage=_get("CodePage"),
Bias=_get("TimeZone"),
HookIME=int(_get("HookIME")),
HookLCID=int(_get("HookLCID")),
)
windows.CreateProcess(
None,
'"{}" {} {} {}'.format(shareddllproxy, "LR", param, usearg),
None,
None,
False,
0,
None,
dirpath,
windows.STARTUPINFO(),
)
def setting(self, layout, config):
self.settingxx(layout, config, self.setting1, self.settingX)
def setting1(self, layout, config):
self.loaddf(config)
layout.addRow("LCID", getspinbox(0, 0xFFFFF, config, "LR_LCID"))
layout.addRow("CodePage", getspinbox(0, 0xFFFFF, config, "LR_CodePage"))
layout.addRow("TimeZone", getspinbox(0, 0xFFFFF, config, "LR_TimeZone"))
layout.addRow("HookIME", getsimpleswitch(config, "LR_HookIME"))
layout.addRow("HookLCID", getsimpleswitch(config, "LR_HookLCID"))
def profiles(self, config):
Names, Guids = [], []
run_as_admins = []
try:
with open(
os.path.join(
os.path.dirname(globalconfig.get("lr_extra_path", "")),
os.path.dirname(self.getlrpath()),
"LRConfig.xml",
),
"r",
encoding="utf8",
) as ff:
for Name, Guid in re.findall('Name="(.*?)" Guid="(.*?)"', ff.read()):
Names.append(Name)
Guids.append(Guid)
except:
pass
return Names, Guids
root = ET.fromstring(ff.read())
profiles = root.find("Profiles").findall("Profile")
def runXX(self, exe, usearg, dirpath, config):
for profile in profiles:
Names.append(profile.attrib.get("Name"))
Guids.append(profile.attrib.get("Guid"))
run_as_admins.append(
profile.find("RunAsAdmin").text.lower() == "true"
)
except:
print_exc()
return Names, Guids, run_as_admins
def getlrpath(self):
LEProc = globalconfig.get("lr_extra_path", "")
if not LEProc:
return
guids = self.profiles(config)[1]
if not (LEProc and os.path.exists(LEProc)):
LEProc = os.path.abspath(
"files/plugins/Locale/Locale_Remulator.1.5.4/LRProc.exe"
)
return LEProc
def runX(self, exe, usearg, dirpath, config):
LEProc = self.getlrpath()
prof = self.profiles(config)
guid = config.get("lrguid", None)
if guid not in guids:
guid = guids[0]
arg = '"{}" {} {}'.format(LEProc, guid, usearg)
windows.CreateProcess(
None,
arg,
None,
None,
False,
0,
if guid not in prof[1]:
guid = prof[1][0]
idx = prof[1].index(guid)
admin = prof[2][idx]
windows.ShellExecute(
None,
"runas" if admin else "open",
LEProc,
"{} {}".format(guid, usearg),
dirpath,
windows.STARTUPINFO(),
windows.SW_SHOWNORMAL,
)
def reselect(self, config, Guids, path):
globalconfig["lr_extra_path"] = path
Names, _Guids = self.profiles(config)
Names, _Guids, _ = self.profiles(config)
self.__profiles.clear()
self.__profiles.addItems(Names)
Guids.clear()
Guids.extend(_Guids)
def settingX(self, layout, config):
Names, Guids = self.profiles(config)
def setting(self, layout, config):
Names, Guids, _ = self.profiles(config)
self.__profiles = getsimplecombobox(Names, config, "lrguid", internal=Guids)
layout.addRow(
"路径",

View File

@ -1448,14 +1448,8 @@
"shared": [
"./files/plugins/shareddllproxy32.exe",
"./files/plugins/shareddllproxy64.exe",
"./files/plugins/LoaderDll.dll",
"./files/plugins/LocaleEmulator.dll",
"./files/plugins/hookmagpie.dll",
"./files/plugins/Magpie/Magpie.Core.exe",
"./files/plugins/Locale_Remulator/LRHookx32.dll",
"./files/plugins/Locale_Remulator/LRHookx64.dll",
"./files/plugins/NTLEAS/ntleak.dll",
"./files/plugins/NTLEAS/ntleai.dll",
"./files/plugins/LunaHook/LunaHook32.dll",
"./files/plugins/LunaHook/LunaHost32.dll",
"./files/plugins/LunaHook/LunaHook64.dll",

View File

@ -1,7 +1,6 @@
{
"桜乃そら": "そそそ",
"封面": "تغطية",
"内置": "مدمجة",
"获取失败": "الحصول على فشل",
"助動詞": "فعل مساعد",
"添加行": "إضافة صف",
@ -657,8 +656,6 @@
"删除图片文件": "حذف ملف الصورة",
"启动方式": "طريقة البدء",
"直接启动": "بدء التشغيل مباشرة",
"优先使用": "الأولوية في استخدام",
"外部": "خارجي .",
"不添加辞书": "لا إضافة القاموس",
"识别方向": "تحديد الاتجاه",
"横向": "بشكل مستعرض",

View File

@ -179,7 +179,6 @@
"移动": "移動",
"显示移动按钮": "顯示移動按鈕",
"设置Token": "設定 Token",
"内置": "內建",
"该功能可能会导致游戏崩溃!": "該功能可能會導致遊戲崩潰!",
"警告": "警告",
"文字更新分析": "文字更新分析",
@ -657,8 +656,6 @@
"删除图片文件": "刪除圖片檔案",
"启动方式": "啟動方式",
"直接启动": "直接啟動",
"优先使用": "優先使用",
"外部": "外部",
"不添加辞书": "不新增辭書",
"识别方向": "識別方向",
"横向": "橫向",

View File

@ -360,7 +360,6 @@
"空白": "prázdné",
"替换为": "Nahradit tím",
"琴葉葵": "Qinye Kui.",
"内置": "vestavěné",
"连接超时": "Časový limit připojení",
"说明": "vysvětlit",
"处理": "rukojeť",
@ -657,8 +656,6 @@
"删除图片文件": "Smazat obrázkové soubory",
"启动方式": "Metoda spuštění",
"直接启动": "Přímo spustit",
"优先使用": "priorita použití",
"外部": "externí",
"不添加辞书": "Nepřidávat slovník",
"识别方向": "Určit směr",
"横向": "příčná",

View File

@ -360,7 +360,6 @@
"空白": "blank",
"替换为": "Ersetzen durch",
"琴葉葵": "Qinye Kui.",
"内置": "eingebaut",
"连接超时": "Verbindungszeitüberschreitung",
"说明": "erklären",
"处理": "Handle",
@ -657,8 +656,6 @@
"删除图片文件": "Bilddateien löschen",
"启动方式": "Startmethode",
"直接启动": "Direkt starten",
"优先使用": "Priorität der Verwendung",
"外部": "extern",
"不添加辞书": "Kein Wörterbuch hinzufügen",
"识别方向": "Richtung bestimmen",
"横向": "quer",

View File

@ -179,7 +179,6 @@
"移动": "Move",
"显示移动按钮": "Show Move Button",
"设置Token": "Set Token",
"内置": "Built-in",
"该功能可能会导致游戏崩溃!": "This feature may cause the game to crash!",
"警告": "Warning",
"文字更新分析": "Text Update Analysis",
@ -657,8 +656,6 @@
"删除图片文件": "Delete image files",
"启动方式": "Startup method",
"直接启动": "Directly start",
"优先使用": "priority of use",
"外部": "external",
"不添加辞书": "Do not add a dictionary",
"识别方向": "Identify direction",
"横向": "transverse",

View File

@ -179,7 +179,6 @@
"移动": "Mover",
"显示移动按钮": "Muestra el botón mover",
"设置Token": "Establecer Token",
"内置": "Incorporado",
"该功能可能会导致游戏崩溃!": "¡¡ esta función puede causar un colapso del juego!",
"警告": "Aviso",
"文字更新分析": "Análisis de actualización de texto",
@ -657,8 +656,6 @@
"删除图片文件": "Eliminar archivos de imagen",
"启动方式": "Modo de arranque",
"直接启动": "Arranque directo",
"优先使用": "Uso prioritario",
"外部": "Exterior",
"不添加辞书": "Sin agregar diccionarios",
"识别方向": "Identificar la dirección",
"横向": "Horizontal",

View File

@ -179,7 +179,6 @@
"移动": "Mobile",
"显示移动按钮": "Afficher le bouton mobile",
"设置Token": "Configurer token",
"内置": "Intégré",
"该功能可能会导致游戏崩溃!": "Cette fonctionnalité peut provoquer un crash du jeu!",
"警告": "Avertissement",
"文字更新分析": "Analyse des mises à jour textuelles",
@ -657,8 +656,6 @@
"删除图片文件": "Supprimer un fichier image",
"启动方式": "Mode de démarrage",
"直接启动": "Démarrage direct",
"优先使用": "Utilisation prioritaire",
"外部": "Extérieur",
"不添加辞书": "Pas d'ajout de discours",
"识别方向": "Identification des directions",
"横向": "Latéralement",

View File

@ -174,7 +174,6 @@
"编辑": "modifica",
"移动": "Sposta",
"设置Token": "Imposta gettone",
"内置": "integrato",
"该功能可能会导致游戏崩溃!": "Questa funzione può causare il crash del gioco!",
"警告": "avviso",
"文字更新分析": "Analisi dell'aggiornamento del testo",
@ -657,8 +656,6 @@
"删除图片文件": "Elimina file immagine",
"启动方式": "Metodo di avvio",
"直接启动": "Avvia direttamente",
"优先使用": "priorità d'uso",
"外部": "esterno",
"不添加辞书": "Non aggiungere un dizionario",
"识别方向": "Identifica la direzione",
"横向": "trasversale",

View File

@ -179,7 +179,6 @@
"移动": "移動",
"显示移动按钮": "移動ボタンを表示",
"设置Token": "トークンの設定",
"内置": "組み込み",
"该功能可能会导致游戏崩溃!": "この機能はゲームをクラッシュさせる可能性があります!",
"警告": "に警告",
"文字更新分析": "テキスト更新解析",
@ -657,8 +656,6 @@
"删除图片文件": "画像ファイルを削除",
"启动方式": "起動モード",
"直接启动": "ダイレクトスタート",
"优先使用": "優先的に使用",
"外部": "外部",
"不添加辞书": "辞書を追加しない",
"识别方向": "方向を識別する",
"横向": "横方向",

View File

@ -179,7 +179,6 @@
"移动": "이동",
"显示移动按钮": "이동 버튼 표시",
"设置Token": "Token 설정",
"内置": "내장형",
"该功能可能会导致游戏崩溃!": "이 기능은 게임 충돌을 일으킬 수 있습니다!",
"警告": "경고",
"文字更新分析": "텍스트 업데이트 분석",
@ -657,8 +656,6 @@
"删除图片文件": "그림 파일 삭제",
"启动方式": "시작 방법",
"直接启动": "직접 시작",
"优先使用": "우선 사용",
"外部": "외부",
"不添加辞书": "사서 를 넣지 않다",
"识别方向": "방향 식별",
"横向": "가로",

View File

@ -360,7 +360,6 @@
"空白": "blanco",
"替换为": "Vervangen door",
"琴葉葵": "Qinye Kui.",
"内置": "ingebouwd",
"连接超时": "verbinding timeout",
"说明": "uitleggen",
"处理": "handgreep",
@ -657,8 +656,6 @@
"删除图片文件": "Afbeeldingsbestanden verwijderen",
"启动方式": "Opstartmethode",
"直接启动": "Direct starten",
"优先使用": "prioriteit van het gebruik",
"外部": "extern",
"不添加辞书": "Geen woordenboek toevoegen",
"识别方向": "Identificeer richting",
"横向": "dwars",

View File

@ -179,7 +179,6 @@
"移动": "ruchy",
"显示移动按钮": "Pokaż przycisk ruchu",
"设置Token": "Ustaw token",
"内置": "wbudowany",
"该功能可能会导致游戏崩溃!": "Ta funkcja może spowodować awarię gry!",
"警告": "ostrzeżenie",
"文字更新分析": "Analiza aktualizacji tekstu",
@ -657,8 +656,6 @@
"删除图片文件": "Usuń pliki obrazów",
"启动方式": "Metoda uruchomienia",
"直接启动": "Bezpośredni start",
"优先使用": "priorytet stosowania",
"外部": "zewnętrzne",
"不添加辞书": "Nie dodawaj słownika",
"识别方向": "Określić kierunek",
"横向": "poprzeczne",

View File

@ -360,7 +360,6 @@
"空白": "em branco",
"替换为": "Substituir por",
"琴葉葵": "Qinye Kui",
"内置": "embutido",
"连接超时": "Tempo limite da ligação",
"说明": "explicar",
"处理": "alça",
@ -657,8 +656,6 @@
"删除图片文件": "Apagar os ficheiros de imagem",
"启动方式": "Método de arranque",
"直接启动": "Iniciar directamente",
"优先使用": "prioridade de utilização",
"外部": "externo",
"不添加辞书": "Não adicionar um dicionário",
"识别方向": "Identificar a direcção",
"横向": "transversal",

View File

@ -179,7 +179,6 @@
"移动": "Переместить",
"显示移动按钮": "Показать кнопку перемещения",
"设置Token": "Настройка Token",
"内置": "Встроенные",
"该功能可能会导致游戏崩溃!": "Эта функция может привести к сбою игры!",
"警告": "предупреждение",
"文字更新分析": "Анализ текстовых обновлений",
@ -657,8 +656,6 @@
"删除图片文件": "Удалить файл изображения",
"启动方式": "Режим запуска",
"直接启动": "Прямой запуск",
"优先使用": "Приоритетное использование",
"外部": "Внешний",
"不添加辞书": "Не добавлять слова",
"识别方向": "Распознать направление",
"横向": "Горизонтальный",

View File

@ -360,7 +360,6 @@
"空白": "tomt",
"替换为": "Ersätt med",
"琴葉葵": "Qinye Kui",
"内置": "inbyggd",
"连接超时": "Tidsfri anslutning",
"说明": "förklara",
"处理": "handtag",
@ -657,8 +656,6 @@
"删除图片文件": "Ta bort bildfiler",
"启动方式": "Startmetod",
"直接启动": "Starta direkt",
"优先使用": "prioritet för användning",
"外部": "extern",
"不添加辞书": "Lägg inte till en ordlista",
"识别方向": "Identifiera riktning",
"横向": "tvärgående",

View File

@ -358,7 +358,6 @@
"空白": "ว่างเปล่า",
"替换为": "แทนที่ด้วย",
"琴葉葵": "ดอกทานตะวัน",
"内置": "สร้างขึ้นใน",
"连接超时": "หมดเวลาการเชื่อมต่อ",
"说明": "คำแนะนำ",
"处理": "การประมวลผล",
@ -657,8 +656,6 @@
"删除图片文件": "ลบไฟล์รูปภาพ",
"启动方式": "วิธีการเริ่มต้น",
"直接启动": "เริ่มต้นโดยตรง",
"优先使用": "ใช้ลำดับความสำคัญ",
"外部": "ภายนอก",
"不添加辞书": "ไม่เพิ่มสำนวน",
"识别方向": "ระบุทิศทาง",
"横向": "แนวนอน",

View File

@ -179,7 +179,6 @@
"移动": "hareket et",
"显示移动按钮": "Taşıma Düğmesini Göster",
"设置Token": "Token ayarlayın",
"内置": "in şa edilmiş",
"该功能可能会导致游戏崩溃!": "Bu fonksiyon oyunu mahvedebilir!",
"警告": "uyarı",
"文字更新分析": "Metin güncelleştirme analizi",
@ -657,8 +656,6 @@
"删除图片文件": "Resim dosyalarını sil",
"启动方式": "Başlangıç yöntemi",
"直接启动": "Direkten başla",
"优先使用": "kullanımın önceliği",
"外部": "dış",
"不添加辞书": "Sözlük eklemeyin",
"识别方向": "Doğru belirle",
"横向": "transverse",

View File

@ -174,7 +174,6 @@
"编辑": "редагувати",
"移动": "пересунути",
"设置Token": "Встановити позначку",
"内置": "вбудований",
"该功能可能会导致游戏崩溃!": "Ця можливість може призвести до аварії гри!",
"警告": "попередження",
"文字更新分析": "Аналіз оновлення тексту",
@ -657,8 +656,6 @@
"删除图片文件": "Вилучити файли зображення",
"启动方式": "Метод запуску",
"直接启动": "Прямо запустити",
"优先使用": "пріоритет використання",
"外部": "зовнішній",
"不添加辞书": "Не додавати словник",
"识别方向": "Визначити напрямок",
"横向": "transverse",

View File

@ -179,7 +179,6 @@
"移动": "Di chuyển",
"显示移动按钮": "Hiện nút di chuyển",
"设置Token": "Thiết lập Token",
"内置": "Được xây dựng trong",
"该功能可能会导致游戏崩溃!": "Tính năng này có thể gây ra sự cố trò chơi!",
"警告": "Cảnh báo",
"文字更新分析": "Phân tích cập nhật văn bản",
@ -657,8 +656,6 @@
"删除图片文件": "Xoá tập tin ảnh",
"启动方式": "Cách bắt đầu",
"直接启动": "Khởi động trực tiếp",
"优先使用": "Ưu tiên sử dụng",
"外部": "Bên ngoài",
"不添加辞书": "Không thêm từ điển",
"识别方向": "Xác định hướng",
"横向": "Phong cảnh",

View File

@ -366,7 +366,6 @@
"空白": "",
"替换为": "",
"琴葉葵": "",
"内置": "",
"连接超时": "",
"起始地址": "",
"说明": "",
@ -668,8 +667,6 @@
"删除图片文件": "",
"启动方式": "",
"直接启动": "",
"优先使用": "",
"外部": "",
"不添加辞书": "",
"识别方向": "",
"横向": "",