diff --git a/.github/scripts/build_lunatranslator.py b/.github/scripts/build_lunatranslator.py index bb07036d..07201055 100644 --- a/.github/scripts/build_lunatranslator.py +++ b/.github/scripts/build_lunatranslator.py @@ -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(): diff --git a/.gitmodules b/.gitmodules index de5760a9..5f68ef5a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 diff --git a/cpp/libs/Detours b/cpp/libs/Detours deleted file mode 160000 index e4bfd6b0..00000000 --- a/cpp/libs/Detours +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e4bfd6b03e50de46b47abfbd1e46b384f0c5f833 diff --git a/cpp/libs/libs.cmake b/cpp/libs/libs.cmake index 7524a73a..6a1833e3 100644 --- a/cpp/libs/libs.cmake +++ b/cpp/libs/libs.cmake @@ -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) diff --git a/cpp/shareddllproxy/CMakeLists.txt b/cpp/shareddllproxy/CMakeLists.txt index cddc745a..6a425732 100644 --- a/cpp/shareddllproxy/CMakeLists.txt +++ b/cpp/shareddllproxy/CMakeLists.txt @@ -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() \ No newline at end of file diff --git a/cpp/shareddllproxy/shareddllproxy.cpp b/cpp/shareddllproxy/shareddllproxy.cpp index c2b24cd4..f9867c70 100644 --- a/cpp/shareddllproxy/shareddllproxy.cpp +++ b/cpp/shareddllproxy/shareddllproxy.cpp @@ -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 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}, diff --git a/py/LunaTranslator/myutils/localetools.py b/py/LunaTranslator/myutils/localetools.py index 91d5161b..fde20a9b 100644 --- a/py/LunaTranslator/myutils/localetools.py +++ b/py/LunaTranslator/myutils/localetools.py @@ -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( "路径", diff --git a/py/files/defaultconfig/static_data.json b/py/files/defaultconfig/static_data.json index f631c78b..6aa670ad 100644 --- a/py/files/defaultconfig/static_data.json +++ b/py/files/defaultconfig/static_data.json @@ -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", diff --git a/py/files/lang/ar.json b/py/files/lang/ar.json index cf527255..8553c88e 100644 --- a/py/files/lang/ar.json +++ b/py/files/lang/ar.json @@ -1,7 +1,6 @@ { "桜乃そら": "そそそ", "封面": "تغطية", - "内置": "مدمجة", "获取失败": "الحصول على فشل", "助動詞": "فعل مساعد", "添加行": "إضافة صف", @@ -657,8 +656,6 @@ "删除图片文件": "حذف ملف الصورة", "启动方式": "طريقة البدء", "直接启动": "بدء التشغيل مباشرة", - "优先使用": "الأولوية في استخدام", - "外部": "خارجي .", "不添加辞书": "لا إضافة القاموس", "识别方向": "تحديد الاتجاه", "横向": "بشكل مستعرض", diff --git a/py/files/lang/cht.json b/py/files/lang/cht.json index c5337849..6542861a 100644 --- a/py/files/lang/cht.json +++ b/py/files/lang/cht.json @@ -179,7 +179,6 @@ "移动": "移動", "显示移动按钮": "顯示移動按鈕", "设置Token": "設定 Token", - "内置": "內建", "该功能可能会导致游戏崩溃!": "該功能可能會導致遊戲崩潰!", "警告": "警告", "文字更新分析": "文字更新分析", @@ -657,8 +656,6 @@ "删除图片文件": "刪除圖片檔案", "启动方式": "啟動方式", "直接启动": "直接啟動", - "优先使用": "優先使用", - "外部": "外部", "不添加辞书": "不新增辭書", "识别方向": "識別方向", "横向": "橫向", diff --git a/py/files/lang/cs.json b/py/files/lang/cs.json index 4ec72a1c..c62b3f2e 100644 --- a/py/files/lang/cs.json +++ b/py/files/lang/cs.json @@ -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á", diff --git a/py/files/lang/de.json b/py/files/lang/de.json index d0d683f2..317d2715 100644 --- a/py/files/lang/de.json +++ b/py/files/lang/de.json @@ -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", diff --git a/py/files/lang/en.json b/py/files/lang/en.json index 7a7cedc3..ed736f2f 100644 --- a/py/files/lang/en.json +++ b/py/files/lang/en.json @@ -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", diff --git a/py/files/lang/es.json b/py/files/lang/es.json index 13c469aa..dc56d905 100644 --- a/py/files/lang/es.json +++ b/py/files/lang/es.json @@ -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", diff --git a/py/files/lang/fr.json b/py/files/lang/fr.json index e3ef9871..e260cfa3 100644 --- a/py/files/lang/fr.json +++ b/py/files/lang/fr.json @@ -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", diff --git a/py/files/lang/it.json b/py/files/lang/it.json index 445e01ef..7f41b74b 100644 --- a/py/files/lang/it.json +++ b/py/files/lang/it.json @@ -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", diff --git a/py/files/lang/ja.json b/py/files/lang/ja.json index 11dea65e..c4a3af59 100644 --- a/py/files/lang/ja.json +++ b/py/files/lang/ja.json @@ -179,7 +179,6 @@ "移动": "移動", "显示移动按钮": "移動ボタンを表示", "设置Token": "トークンの設定", - "内置": "組み込み", "该功能可能会导致游戏崩溃!": "この機能はゲームをクラッシュさせる可能性があります!", "警告": "に警告", "文字更新分析": "テキスト更新解析", @@ -657,8 +656,6 @@ "删除图片文件": "画像ファイルを削除", "启动方式": "起動モード", "直接启动": "ダイレクトスタート", - "优先使用": "優先的に使用", - "外部": "外部", "不添加辞书": "辞書を追加しない", "识别方向": "方向を識別する", "横向": "横方向", diff --git a/py/files/lang/ko.json b/py/files/lang/ko.json index f5e37189..8e15b4b6 100644 --- a/py/files/lang/ko.json +++ b/py/files/lang/ko.json @@ -179,7 +179,6 @@ "移动": "이동", "显示移动按钮": "이동 버튼 표시", "设置Token": "Token 설정", - "内置": "내장형", "该功能可能会导致游戏崩溃!": "이 기능은 게임 충돌을 일으킬 수 있습니다!", "警告": "경고", "文字更新分析": "텍스트 업데이트 분석", @@ -657,8 +656,6 @@ "删除图片文件": "그림 파일 삭제", "启动方式": "시작 방법", "直接启动": "직접 시작", - "优先使用": "우선 사용", - "外部": "외부", "不添加辞书": "사서 를 넣지 않다", "识别方向": "방향 식별", "横向": "가로", diff --git a/py/files/lang/nl.json b/py/files/lang/nl.json index e9e00bf7..03a0127f 100644 --- a/py/files/lang/nl.json +++ b/py/files/lang/nl.json @@ -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", diff --git a/py/files/lang/pl.json b/py/files/lang/pl.json index 6cb08191..a665119f 100644 --- a/py/files/lang/pl.json +++ b/py/files/lang/pl.json @@ -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", diff --git a/py/files/lang/pt.json b/py/files/lang/pt.json index af889a2b..2816fe9b 100644 --- a/py/files/lang/pt.json +++ b/py/files/lang/pt.json @@ -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", diff --git a/py/files/lang/ru.json b/py/files/lang/ru.json index 4c0351c2..0a4812ef 100644 --- a/py/files/lang/ru.json +++ b/py/files/lang/ru.json @@ -179,7 +179,6 @@ "移动": "Переместить", "显示移动按钮": "Показать кнопку перемещения", "设置Token": "Настройка Token", - "内置": "Встроенные", "该功能可能会导致游戏崩溃!": "Эта функция может привести к сбою игры!", "警告": "предупреждение", "文字更新分析": "Анализ текстовых обновлений", @@ -657,8 +656,6 @@ "删除图片文件": "Удалить файл изображения", "启动方式": "Режим запуска", "直接启动": "Прямой запуск", - "优先使用": "Приоритетное использование", - "外部": "Внешний", "不添加辞书": "Не добавлять слова", "识别方向": "Распознать направление", "横向": "Горизонтальный", diff --git a/py/files/lang/sv.json b/py/files/lang/sv.json index 9f5dd31c..353b6345 100644 --- a/py/files/lang/sv.json +++ b/py/files/lang/sv.json @@ -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", diff --git a/py/files/lang/th.json b/py/files/lang/th.json index 82a4b934..71262fa4 100644 --- a/py/files/lang/th.json +++ b/py/files/lang/th.json @@ -358,7 +358,6 @@ "空白": "ว่างเปล่า", "替换为": "แทนที่ด้วย", "琴葉葵": "ดอกทานตะวัน", - "内置": "สร้างขึ้นใน", "连接超时": "หมดเวลาการเชื่อมต่อ", "说明": "คำแนะนำ", "处理": "การประมวลผล", @@ -657,8 +656,6 @@ "删除图片文件": "ลบไฟล์รูปภาพ", "启动方式": "วิธีการเริ่มต้น", "直接启动": "เริ่มต้นโดยตรง", - "优先使用": "ใช้ลำดับความสำคัญ", - "外部": "ภายนอก", "不添加辞书": "ไม่เพิ่มสำนวน", "识别方向": "ระบุทิศทาง", "横向": "แนวนอน", diff --git a/py/files/lang/tr.json b/py/files/lang/tr.json index 9a7c1e9a..5a7ffdf0 100644 --- a/py/files/lang/tr.json +++ b/py/files/lang/tr.json @@ -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", diff --git a/py/files/lang/uk.json b/py/files/lang/uk.json index b2615d3d..596ce98e 100644 --- a/py/files/lang/uk.json +++ b/py/files/lang/uk.json @@ -174,7 +174,6 @@ "编辑": "редагувати", "移动": "пересунути", "设置Token": "Встановити позначку", - "内置": "вбудований", "该功能可能会导致游戏崩溃!": "Ця можливість може призвести до аварії гри!", "警告": "попередження", "文字更新分析": "Аналіз оновлення тексту", @@ -657,8 +656,6 @@ "删除图片文件": "Вилучити файли зображення", "启动方式": "Метод запуску", "直接启动": "Прямо запустити", - "优先使用": "пріоритет використання", - "外部": "зовнішній", "不添加辞书": "Не додавати словник", "识别方向": "Визначити напрямок", "横向": "transverse", diff --git a/py/files/lang/vi.json b/py/files/lang/vi.json index 2e662afa..794e12b4 100644 --- a/py/files/lang/vi.json +++ b/py/files/lang/vi.json @@ -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", diff --git a/py/files/lang/zh.json b/py/files/lang/zh.json index e6dd4f2b..f81ec45c 100644 --- a/py/files/lang/zh.json +++ b/py/files/lang/zh.json @@ -366,7 +366,6 @@ "空白": "", "替换为": "", "琴葉葵": "", - "内置": "", "连接超时": "", "起始地址": "", "说明": "", @@ -668,8 +667,6 @@ "删除图片文件": "", "启动方式": "", "直接启动": "", - "优先使用": "", - "外部": "", "不添加辞书": "", "识别方向": "", "横向": "",