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"curl -LO {LocaleRe}")
subprocess.run(f"7z x {LocaleRe.split('/')[-1]} -oLR") subprocess.run(f"7z x {LocaleRe.split('/')[-1]} -oLR")
os.makedirs( os.makedirs(
f"{rootDir}/files/plugins/Locale_Remulator", rf"{rootDir}\files\plugins\Locale\Locale_Remulator.1.5.4",
exist_ok=True, exist_ok=True,
) )
for _dir, _, _fs in os.walk("LR"): for _dir, _, _fs in os.walk("LR"):
for f in _fs: 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( shutil.move(
os.path.join(_dir, f), 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"curl -LO {mylinks['mecab.zip']}")
subprocess.run(f"7z x mecab.zip -oALL") subprocess.run(f"7z x mecab.zip -oALL")
move_directory_contents("ALL/ALL", f"{rootDir}/files/plugins") move_directory_contents("ALL/ALL", f"{rootDir}/files/plugins")
def downloadmecabxp(): def downloadmecabxp():
os.chdir(rootDir + "\\temp") os.chdir(rootDir + "\\temp")
subprocess.run(f"curl -LO {mylinks['mecab_xp.zip']}") subprocess.run(f"curl -LO {mylinks['mecab_xp.zip']}")
subprocess.run(f"7z x mecab_xp.zip -oALL") subprocess.run(f"7z x mecab_xp.zip -oALL")
move_directory_contents("ALL/ALL", f"{rootDir}/files/plugins") move_directory_contents("ALL/ALL", f"{rootDir}/files/plugins")
def downloadmapie(): def downloadmapie():
os.chdir(rootDir + "\\temp") os.chdir(rootDir + "\\temp")
subprocess.run(f"curl -LO {mylinks['magpie.zip']}") subprocess.run(f"curl -LO {mylinks['magpie.zip']}")
@ -140,13 +149,23 @@ def downloadLocaleEmulator():
os.chdir(rootDir + "\\temp") os.chdir(rootDir + "\\temp")
subprocess.run(f"curl -LO {localeEmulatorFile}") subprocess.run(f"curl -LO {localeEmulatorFile}")
subprocess.run(f"7z x {localeEmulatorFile.split('/')[-1]} -oLocaleEmulator") subprocess.run(f"7z x {localeEmulatorFile.split('/')[-1]} -oLocaleEmulator")
shutil.move(
"LocaleEmulator/LoaderDll.dll", os.makedirs(
f"{rootDir}/files/plugins/LoaderDll.dll", 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( shutil.move(
"LocaleEmulator/LocaleEmulator.dll", os.path.join(_dir, f),
f"{rootDir}/files/plugins/LocaleEmulator.dll", rf"{rootDir}\files\plugins\Locale\Locale.Emulator.2.5.0.1",
) )
@ -154,14 +173,13 @@ def downloadNtlea():
os.chdir(rootDir + "\\temp") os.chdir(rootDir + "\\temp")
subprocess.run(f"curl -LO {ntleaFile}") subprocess.run(f"curl -LO {ntleaFile}")
subprocess.run(f"7z x {ntleaFile.split('/')[-1]} -ontlea") subprocess.run(f"7z x {ntleaFile.split('/')[-1]} -ontlea")
shutil.move(
"ntlea/x86/ntleai.dll", os.makedirs(
f"{rootDir}/files/plugins/NTLEAS/ntleai.dll", rf"{rootDir}\files\plugins\Locale\ntleas046_x64",
) exist_ok=True,
shutil.move(
"ntlea/x64/ntleak.dll",
f"{rootDir}/files/plugins/NTLEAS/ntleak.dll",
) )
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(): def downloadCurl():

3
.gitmodules vendored
View File

@ -10,9 +10,6 @@
[submodule "src/plugins/libs/tinymp3"] [submodule "src/plugins/libs/tinymp3"]
path = cpp/libs/tinymp3 path = cpp/libs/tinymp3
url = https://github.com/HIllya51/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"] [submodule "src/plugins/libs/Clipper2"]
path = cpp/libs/Clipper2 path = cpp/libs/Clipper2
url = https://github.com/AngusJohnson/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) if(IS_LUNAHOOK)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/minhook ${CMAKE_BINARY_DIR}/minhook) add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/minhook ${CMAKE_BINARY_DIR}/minhook)
else() 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) # 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) # target_include_directories(Detours PUBLIC ${CMAKE_CURRENT_LIST_DIR}/Detours/src)
add_library(wil INTERFACE) add_library(wil INTERFACE)
target_include_directories(wil INTERFACE ${CMAKE_CURRENT_LIST_DIR}/wil/include) target_include_directories(wil INTERFACE ${CMAKE_CURRENT_LIST_DIR}/wil/include)

View File

@ -11,13 +11,13 @@ generate_product_version(
VERSION_PATCH ${VERSION_PATCH} 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) if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
add_executable(shareddllproxy ${shareddllproxy_common}) add_executable(shareddllproxy ${shareddllproxy_common})
else() 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) add_subdirectory(voiceroid2)
endif() endif()
@ -28,6 +28,6 @@ if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
set_target_properties(shareddllproxy PROPERTIES OUTPUT_NAME "shareddllproxy64") set_target_properties(shareddllproxy PROPERTIES OUTPUT_NAME "shareddllproxy64")
else() else()
target_precompile_headers(voiceroid2 REUSE_FROM pch) 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") set_target_properties(shareddllproxy PROPERTIES OUTPUT_NAME "shareddllproxy32")
endif() endif()

View File

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

View File

@ -1,18 +1,9 @@
import windows, os, winsharedutils, re, functools import windows, os, winsharedutils, re, functools
from qtsymbols import * from qtsymbols import *
from myutils.config import savehook_new_data, get_launchpath, globalconfig, get_platform from myutils.config import savehook_new_data, get_launchpath, globalconfig, get_platform
from gui.usefulwidget import ( from gui.usefulwidget import getlineedit, getsimplecombobox, getsimplepatheditor
getlineedit, from traceback import print_exc
getsimplecombobox, import xml.etree.ElementTree as ET
getspinbox,
getsimpleswitch,
SuperCombo,
getspinbox,
SplitLine,
getsimplepatheditor,
clearlayout,
)
from gui.dynalang import LFormLayout
class Launcher: class Launcher:
@ -52,107 +43,90 @@ class LEbase(Launcher):
self.runX(execheck3264, usearg, dirpath, config) self.runX(execheck3264, usearg, dirpath, config)
class settingxx: class le_internal(LEbase):
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):
name = "Locale Emulator" name = "Locale Emulator"
id = "le" id = "le"
use_which = "le_use_which"
default = dict( default = dict(
LCID=0x11, CodePage=932, RedirectRegistry=False, HookUILanguageAPI=False 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): def profiles(self, config):
_Names = [] _Names = []
_Guids = [] _Guids = []
_run_as_admins = []
exe = config.get("gamepath", None) exe = config.get("gamepath", None)
def parseone(xmlpath): def parseone(xmlpath):
Names, Guids = [], [] Names, Guids, run_as_admins = [], [], []
with open(xmlpath, "r", encoding="utf8") as ff: with open(xmlpath, "r", encoding="utf8") as ff:
for Name, Guid in re.findall('Name="(.*?)" Guid="(.*?)"', ff.read()): root = ET.fromstring(ff.read())
Names.append(Name) profiles = root.find("Profiles").findall("Profile")
Guids.append(Guid)
return Names, Guids
finds = [ for profile in profiles:
os.path.join( Names.append(profile.attrib.get("Name"))
os.path.dirname(globalconfig.get("le_extra_path", "")), "LEConfig.xml" 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: if exe:
finds.append(exe + ".le.config") finds.append(exe + ".le.config")
for f in finds: for f in finds:
try: try:
Names, Guids = parseone(f) Names, Guids, run_as_admins = parseone(f)
_Guids += Guids _Guids += Guids
_Names += Names _Names += Names
_run_as_admins += run_as_admins
except: except:
pass pass
return _Names, _Guids return _Names, _Guids, _run_as_admins
def runXX(self, exe, usearg, dirpath, config): def runX(self, exe, usearg, dirpath, config):
LEProc = globalconfig.get("le_extra_path", "") LEProc = self.getlrpath()
if not LEProc: prof = self.profiles(config)
return prof_ = self.profiles({})
guids = self.profiles(config)[1]
guids_ = self.profiles({})[1]
guid = config.get("leguid", None) guid = config.get("leguid", None)
if guid not in guids: if guid not in prof[1]:
guid = guids[0] guid = prof[1][0]
if guid in guids_: if guid in prof_[1]:
arg = '"{}" -runas {} {}'.format(LEProc, guid, usearg) idx = prof_[1].index(guid)
admin = prof_[2][idx]
arg = "-runas {} {}".format(guid, usearg)
else: else:
# 程序的配置运行 # 程序的配置运行
arg = '"{}" -run {}'.format(LEProc, usearg) arg = "-run {}".format(usearg)
windows.CreateProcess( admin = False
windows.ShellExecute(
None, None,
"runas" if admin else "open",
LEProc,
arg, arg,
None,
None,
False,
0,
None,
dirpath, dirpath,
windows.STARTUPINFO(), windows.SW_SHOWNORMAL,
) )
def reselect(self, config, Guids, path): def reselect(self, config, Guids, path):
globalconfig["le_extra_path"] = path globalconfig["le_extra_path"] = path
Names, _Guids = self.profiles(config) Names, _Guids, _ = self.profiles(config)
self.__profiles.clear() self.__profiles.clear()
self.__profiles.addItems(Names) self.__profiles.addItems(Names)
Guids.clear() Guids.clear()
Guids.extend(_Guids) Guids.extend(_Guids)
def settingX(self, layout, config): def setting(self, layout, config):
Names, Guids = self.profiles(config) Names, Guids, _ = self.profiles(config)
self.__profiles = getsimplecombobox(Names, config, "leguid", internal=Guids) self.__profiles = getsimplecombobox(Names, config, "leguid", internal=Guids)
layout.addRow( layout.addRow(
"路径", "路径",
@ -176,59 +150,12 @@ class le_internal(LEbase, settingxx):
continue continue
config[k] = v 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", "")) class NTLEAS64(LEbase):
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):
name = "Ntleas" name = "Ntleas"
id = "ntleas" id = "ntleas"
bit = 6 bit = 6
bit64 = True bit64 = True
use_which = "ntleas_use_which"
default = dict(LCID=0x411, CodePage=932, TimeZone=540) default = dict(LCID=0x411, CodePage=932, TimeZone=540)
def loaddf(self, config): def loaddf(self, config):
@ -238,82 +165,40 @@ class NTLEAS64(LEbase, settingxx):
continue continue
config[k] = v 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): def runX(self, exe, usearg, dirpath, config):
if config.get(self.use_which, 0) == 0: LEProc = os.path.join(
os.path.dirname(self.getlrpath()),
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", "")),
["x86", "x64"][self.bit64], ["x86", "x64"][self.bit64],
"ntleas.exe", "ntleas.exe",
) )
def runXX(self, exe, usearg, dirpath, config):
LEProc = self.__path()
if not LEProc: if not LEProc:
return return
arg = '"{}" {} {}'.format( arg = "{} {}".format(
LEProc,
usearg, usearg,
config.get("ntleasparam", '"C932" "L1041" "FMS PGothic" "P4"'), config.get("ntleasparam", '"C932" "L1041" "FMS PGothic" "P4"'),
) )
windows.CreateProcess( windows.ShellExecute(
None, None,
"open",
LEProc,
arg, arg,
None,
None,
False,
0,
None,
dirpath, dirpath,
windows.STARTUPINFO(), windows.SW_SHOWNORMAL,
) )
def reselect(self, path): def reselect(self, path):
globalconfig["ntleas_extra_path"] = path globalconfig["ntleas_extra_path"] = path
def settingX(self, layout, config): def setting(self, layout, config):
if "ntleasparam" not in config: if "ntleasparam" not in config:
config["ntleasparam"] = '"C932" "L1041" "FMS PGothic" "P4"' config["ntleasparam"] = '"C932" "L1041" "FMS PGothic" "P4"'
layout.addRow( layout.addRow(
@ -337,10 +222,9 @@ class NTLEAS32(NTLEAS64):
bit64 = False bit64 = False
class lr_internal(LEbase, settingxx): class lr_internal(LEbase):
name = "Locale Remulator" name = "Locale Remulator"
id = "lr" id = "lr"
use_which = "lr_use_which"
default = dict(LCID=0x411, CodePage=932, TimeZone=540, HookIME=False, HookLCID=True) default = dict(LCID=0x411, CodePage=932, TimeZone=540, HookIME=False, HookLCID=True)
def loaddf(self, config): def loaddf(self, config):
@ -350,100 +234,69 @@ class lr_internal(LEbase, settingxx):
continue continue
config[k] = v 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): def profiles(self, config):
Names, Guids = [], [] Names, Guids = [], []
run_as_admins = []
try: try:
with open( with open(
os.path.join( os.path.join(
os.path.dirname(globalconfig.get("lr_extra_path", "")), os.path.dirname(self.getlrpath()),
"LRConfig.xml", "LRConfig.xml",
), ),
"r", "r",
encoding="utf8", encoding="utf8",
) as ff: ) as ff:
for Name, Guid in re.findall('Name="(.*?)" Guid="(.*?)"', ff.read()): root = ET.fromstring(ff.read())
Names.append(Name) profiles = root.find("Profiles").findall("Profile")
Guids.append(Guid)
except:
pass
return Names, Guids
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", "") LEProc = globalconfig.get("lr_extra_path", "")
if not LEProc: if not (LEProc and os.path.exists(LEProc)):
return LEProc = os.path.abspath(
guids = self.profiles(config)[1] "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) guid = config.get("lrguid", None)
if guid not in guids: if guid not in prof[1]:
guid = guids[0] guid = prof[1][0]
arg = '"{}" {} {}'.format(LEProc, guid, usearg) idx = prof[1].index(guid)
windows.CreateProcess( admin = prof[2][idx]
None, windows.ShellExecute(
arg,
None,
None,
False,
0,
None, None,
"runas" if admin else "open",
LEProc,
"{} {}".format(guid, usearg),
dirpath, dirpath,
windows.STARTUPINFO(), windows.SW_SHOWNORMAL,
) )
def reselect(self, config, Guids, path): def reselect(self, config, Guids, path):
globalconfig["lr_extra_path"] = path globalconfig["lr_extra_path"] = path
Names, _Guids = self.profiles(config) Names, _Guids, _ = self.profiles(config)
self.__profiles.clear() self.__profiles.clear()
self.__profiles.addItems(Names) self.__profiles.addItems(Names)
Guids.clear() Guids.clear()
Guids.extend(_Guids) Guids.extend(_Guids)
def settingX(self, layout, config): def setting(self, layout, config):
Names, Guids = self.profiles(config) Names, Guids, _ = self.profiles(config)
self.__profiles = getsimplecombobox(Names, config, "lrguid", internal=Guids) self.__profiles = getsimplecombobox(Names, config, "lrguid", internal=Guids)
layout.addRow( layout.addRow(
"路径", "路径",

View File

@ -1448,14 +1448,8 @@
"shared": [ "shared": [
"./files/plugins/shareddllproxy32.exe", "./files/plugins/shareddllproxy32.exe",
"./files/plugins/shareddllproxy64.exe", "./files/plugins/shareddllproxy64.exe",
"./files/plugins/LoaderDll.dll",
"./files/plugins/LocaleEmulator.dll",
"./files/plugins/hookmagpie.dll", "./files/plugins/hookmagpie.dll",
"./files/plugins/Magpie/Magpie.Core.exe", "./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/LunaHook32.dll",
"./files/plugins/LunaHook/LunaHost32.dll", "./files/plugins/LunaHook/LunaHost32.dll",
"./files/plugins/LunaHook/LunaHook64.dll", "./files/plugins/LunaHook/LunaHook64.dll",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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