This commit is contained in:
恍兮惚兮 2024-10-16 15:24:38 +08:00
parent 8c7ceeb112
commit 615ba9691a
12 changed files with 85 additions and 29 deletions

1
.gitignore vendored
View File

@ -43,3 +43,4 @@ LunaTranslator/run3832.bat
LunaTranslator/logs LunaTranslator/logs
LunaTranslator/LunaTranslator/.vscode/settings.json LunaTranslator/LunaTranslator/.vscode/settings.json
.vscode/settings.json .vscode/settings.json
LunaTranslator/translation_record

View File

@ -13,7 +13,13 @@ from myutils.utils import (
makehtml, makehtml,
loadpostsettingwindowmethod_maybe, loadpostsettingwindowmethod_maybe,
) )
from myutils.hwnd import mouseselectwindow, grabwindow, getExeIcon, getcurrexe from myutils.hwnd import (
mouseselectwindow,
grabwindow,
getExeIcon,
getcurrexe,
hwndratex,
)
from gui.setting_about import doupdate from gui.setting_about import doupdate
from gui.dialog_memory import dialog_memory from gui.dialog_memory import dialog_memory
from gui.textbrowser import Textbrowser from gui.textbrowser import Textbrowser
@ -252,8 +258,8 @@ class TranslatorWindow(resizableframeless):
move_signal = pyqtSignal(QPoint) move_signal = pyqtSignal(QPoint)
closesignal = pyqtSignal() closesignal = pyqtSignal()
hotkeyuse_selectprocsignal = pyqtSignal() hotkeyuse_selectprocsignal = pyqtSignal()
changeshowhiderawsig=pyqtSignal() changeshowhiderawsig = pyqtSignal()
changeshowhidetranssig=pyqtSignal() changeshowhidetranssig = pyqtSignal()
@threader @threader
def tracewindowposthread(self): def tracewindowposthread(self):
@ -284,11 +290,12 @@ class TranslatorWindow(resizableframeless):
if not rect: if not rect:
lastpos = None lastpos = None
continue continue
rate = hwndratex(hwnd)
rect = QRect( rect = QRect(
int(rect[0] / self.devicePixelRatioF()), int(rect[0] / rate),
int(rect[1] / self.devicePixelRatioF()), int(rect[1] / rate),
int((rect[2] - rect[0]) / self.devicePixelRatioF()), int((rect[2] - rect[0]) / rate),
int((rect[3] - rect[1]) / self.devicePixelRatioF()), int((rect[3] - rect[1]) / rate),
) )
if not lastpos: if not lastpos:
lastpos = rect lastpos = rect

View File

@ -266,11 +266,16 @@ def safepixmap(bs):
return pixmap return pixmap
def hwndratex(hwnd):
_dpi = windows.GetDpiForWindow(hwnd)
mdpi = winsharedutils.GetMonitorDpiScaling(hwnd)
return mdpi / _dpi
def gdi_screenshot(x1, y1, x2, y2, hwnd=None): def gdi_screenshot(x1, y1, x2, y2, hwnd=None):
if hwnd: if hwnd:
_r = QApplication.instance().devicePixelRatio() rate = hwndratex(hwnd)
_dpi = windows.GetDpiForWindow(hwnd) x1, y1, x2, y2 = (int(_ / rate) for _ in (x1, y1, x2, y2))
x1, y1, x2, y2 = (int(_ * _dpi / 96 / _r) for _ in (x1, y1, x2, y2))
bs = winsharedutils.gdi_screenshot(x1, y1, x2, y2, hwnd) bs = winsharedutils.gdi_screenshot(x1, y1, x2, y2, hwnd)
return safepixmap(bs) return safepixmap(bs)

View File

@ -369,7 +369,7 @@ class basetrans(commonbase):
if not checktutukufunction(): if not checktutukufunction():
# 检查请求队列是否空,请求队列有新的请求,则放弃当前请求。但对于内嵌翻译请求,不可以放弃。 # 检查请求队列是否空,请求队列有新的请求,则放弃当前请求。但对于内嵌翻译请求,不可以放弃。
continue continue
if self.using_gpt_dict: if self.transtype == "pre" or self.using_gpt_dict:
gpt_dict = None gpt_dict = None
contentraw = contentsolved contentraw = contentsolved
for _ in optimization_params: for _ in optimization_params:

View File

@ -36,6 +36,9 @@ class TS(basetrans):
) )
def translate(self, content): def translate(self, content):
query = json.loads(content)
content = query["contentraw"]
self.checkfilechanged( self.checkfilechanged(
self.unsafegetcurrentgameconfig(), self.config["sqlitefile"] self.unsafegetcurrentgameconfig(), self.config["sqlitefile"]
) )

View File

@ -115,6 +115,8 @@ class TS(basetrans):
return "\n".join(collect) return "\n".join(collect)
def translate(self, content: str): def translate(self, content: str):
query = json.loads(content)
content = query["contentraw"]
self.checkfilechanged( self.checkfilechanged(
self.unsafegetcurrentgameconfig(), tuple(self.config["jsonfile"]) self.unsafegetcurrentgameconfig(), tuple(self.config["jsonfile"])
) )

View File

@ -57,20 +57,21 @@ class TS(basetrans):
gpt_dict_raw_text = "\n".join(gpt_dict_text_list) gpt_dict_raw_text = "\n".join(gpt_dict_text_list)
return gpt_dict_raw_text return gpt_dict_raw_text
def appendcontext(self, message, contextnum): def _gpt_common_parse_context_2(self, messages, context, contextnum, ja=False):
for _i in range(min(len(self.context) // 2, contextnum)):
i = len(self.context) // 2 - min(len(self.context) // 2, contextnum) + _i
message.append(self.context[i * 2])
message.append(self.context[i * 2 + 1])
def _gpt_common_parse_context_2(self, messages, context, contextnum):
msgs = [] msgs = []
self._gpt_common_parse_context(msgs, context, contextnum) self._gpt_common_parse_context(msgs, context, contextnum)
__ja, __zh = [], [] __ja, __zh = [], []
for i, _ in enumerate(msgs): for i, _ in enumerate(msgs):
[__ja, __zh][i % 2 == 0].append(_.strip()) [__zh, __ja][i % 2 == 0].append(_.strip())
messages.append({"role": "assistant", "content": "\n".join(__zh)}) if __ja:
if ja:
messages.append(
{
"role": "user",
"content": "将下面的日文文本翻译成中文:" + "\n".join(__ja),
}
)
messages.append({"role": "assistant", "content": "\n".join(__zh)})
def make_messages(self, query, gpt_dict=None): def make_messages(self, query, gpt_dict=None):
contextnum = ( contextnum = (
@ -111,7 +112,7 @@ class TS(basetrans):
"content": "你是一个轻小说翻译模型,可以流畅通顺地以日本轻小说的风格将日文翻译成简体中文,并联系上下文正确使用人称代词,不擅自添加原文中没有的代词。", "content": "你是一个轻小说翻译模型,可以流畅通顺地以日本轻小说的风格将日文翻译成简体中文,并联系上下文正确使用人称代词,不擅自添加原文中没有的代词。",
} }
] ]
self._gpt_common_parse_context_2(messages, self.context, contextnum) self._gpt_common_parse_context_2(messages, self.context, contextnum, True)
gpt_dict_raw_text = self.make_gpt_dict_text(gpt_dict) gpt_dict_raw_text = self.make_gpt_dict_text(gpt_dict)
if gpt_dict_raw_text: if gpt_dict_raw_text:
content = ( content = (

View File

@ -19,7 +19,7 @@ from ctypes import (
CFUNCTYPE, CFUNCTYPE,
c_long, c_long,
) )
from ctypes.wintypes import WORD, HWND, DWORD, RECT from ctypes.wintypes import WORD, HWND, DWORD, RECT, UINT
import gobject import gobject
utilsdll = CDLL(gobject.GetDllpath(("winsharedutils32.dll", "winsharedutils64.dll"))) utilsdll = CDLL(gobject.GetDllpath(("winsharedutils32.dll", "winsharedutils64.dll")))
@ -354,3 +354,8 @@ def encodemp3(wav):
if len(ret): if len(ret):
return ret[0] return ret[0]
return None return None
GetMonitorDpiScaling = utilsdll.GetMonitorDpiScaling
GetMonitorDpiScaling.argtypes = (HWND,)
GetMonitorDpiScaling.restype = UINT

View File

@ -1121,7 +1121,7 @@
"frequency_penalty": 0, "frequency_penalty": 0,
"fix_degeneration": false, "fix_degeneration": false,
"流式输出": true, "流式输出": true,
"prompt_version": 0, "prompt_version": 2,
"s": "" "s": ""
}, },
"argstype": { "argstype": {

View File

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

View File

@ -13,7 +13,7 @@ generate_product_version(
add_library(tinymp3 ../libs/tinymp3/shine_mp3.c) add_library(tinymp3 ../libs/tinymp3/shine_mp3.c)
add_library(winsharedutils MODULE mp3enc.cpp webview2_extra.cpp AreoAcrylic.cpp screenshot.cpp ../implsapi.cpp hwnd.cpp globalmessagelistener.cpp theme.cpp version.cpp otsu.cpp clipboard.cpp lnk.cpp dllmain.cpp levenshtein.cpp muteprocess.cpp sapi_dll.cpp simplemecab.cpp SimpleBrowser.cpp MWebBrowser.cpp icon.cpp ${versioninfo}) add_library(winsharedutils MODULE mp3enc.cpp webview2_extra.cpp AreoAcrylic.cpp screenshot.cpp ../implsapi.cpp hwnd.cpp globalmessagelistener.cpp theme.cpp version.cpp otsu.cpp clipboard.cpp lnk.cpp dllmain.cpp levenshtein.cpp muteprocess.cpp sapi_dll.cpp simplemecab.cpp SimpleBrowser.cpp MWebBrowser.cpp icon.cpp ${versioninfo})
target_precompile_headers(winsharedutils REUSE_FROM pch) target_precompile_headers(winsharedutils REUSE_FROM pch)
target_link_libraries(winsharedutils tinymp3) target_link_libraries(winsharedutils tinymp3 Shcore)
if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
set_target_properties(winsharedutils PROPERTIES OUTPUT_NAME "winsharedutils64") set_target_properties(winsharedutils PROPERTIES OUTPUT_NAME "winsharedutils64")
else() else()

View File

@ -1,5 +1,5 @@
#include "define.h" #include "define.h"
#include <shellscalingapi.h>
DECLARE void showintab(HWND hwnd, bool show, bool tool) DECLARE void showintab(HWND hwnd, bool show, bool tool)
{ {
// WS_EX_TOOLWINDOW可以立即生效WS_EX_APPWINDOW必须切换焦点才生效。但是WS_EX_TOOLWINDOW会改变窗口样式因此只对无边框窗口使用。 // WS_EX_TOOLWINDOW可以立即生效WS_EX_APPWINDOW必须切换焦点才生效。但是WS_EX_TOOLWINDOW会改变窗口样式因此只对无边框窗口使用。
@ -95,4 +95,36 @@ DECLARE void getprocesses(void (*cb)(DWORD, const wchar_t *))
cb(pe32.th32ProcessID, pe32.szExeFile); cb(pe32.th32ProcessID, pe32.szExeFile);
} while (Process32Next(hSnapshot, &pe32)); } while (Process32Next(hSnapshot, &pe32));
} }
} }
DECLARE UINT GetMonitorDpiScaling(HWND hwnd)
{
HMONITOR hMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
if (!hMonitor)
return 96;
auto pGetDpiForMonitor = (HRESULT(*)(HMONITOR, MONITOR_DPI_TYPE, UINT *, UINT *))GetProcAddress(GetModuleHandleA("Shcore.dll"), "GetDpiForMonitor");
if (pGetDpiForMonitor)
{
UINT dpiX = 0;
UINT dpiY = 0;
HRESULT hr = pGetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY);
if (FAILED(hr))
return 96;
else
return dpiX;
}
else
{
MONITORINFOEX info;
info.cbSize = sizeof(MONITORINFOEX);
if (!GetMonitorInfo(hMonitor, &info))
return 96;
HDC hdc = GetDC(NULL);
HDC hdcMonitor = CreateCompatibleDC(hdc);
HDC hdcMonitorScreen = CreateIC(TEXT("DISPLAY"), info.szDevice, NULL, 0);
int dpiX = GetDeviceCaps(hdcMonitorScreen, LOGPIXELSX);
DeleteDC(hdcMonitor);
DeleteDC(hdcMonitorScreen);
ReleaseDC(NULL, hdc);
return dpiX;
}
}