From 6220335f63474a9f121aee5c40aa778079787874 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 8 Oct 2026 18:47:14 +0200 Subject: [PATCH] Fix: Decode GBK dialog/toolbar text on non-Chinese systems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MBCS dialog templates are decoded with the system ANSI code page, so on non-Chinese systems the GBK template strings turn into "?" before TranslateDialog can read them. Set those strings explicitly in OnInitDialog (PluginSettings save/close, the three Advanced dialogs, the file-manager search buttons/checkboxes, and Trigger Settings) so they are re-decoded with the thread locale. Also fix the language-selection dialog and the toolbar "Lang/语言" button: the language dialog's template is built as WCHAR strings but created through the ANSI path, so its title, label, and buttons are set explicitly in OnInitDialog (AppendString stays on CP_ACP), with the title looked up via _TR("切换语言") and set through SetWindowTextW after an explicit GBK conversion; new en_US ("Switch Language") and zh_TW ("切換語言") translations accompany it. The toolbar button is set through the Unicode TB_SETBUTTONINFOW message after an explicit GBK conversion. Add en_US/zh_TW translations for the experimental-features context menu items. Co-Authored-By: deepseek-v4-pro --- server/2015Remote/2015Remote.rc | Bin 177482 -> 178156 bytes server/2015Remote/2015RemoteDlg.cpp | 12 ++++++- server/2015Remote/CFileSpeedDlg.h | 13 +++++++- server/2015Remote/CPreviewLevelsDlg.h | 20 +++++++++++- server/2015Remote/LangManager.h | 17 +++++++--- server/2015Remote/PluginSettingsDlg.cpp | 4 +++ server/2015Remote/QualityLevelsDlg.h | 22 ++++++++++++- server/2015Remote/TriggerSettingsDlg.cpp | 7 +++++ server/2015Remote/file/CFileManagerDlg.cpp | 9 ++++++ server/2015Remote/lang/en_US.ini | 3 ++ server/2015Remote/lang/zh_TW.ini | 3 ++ server/2015Remote/resource.h | 35 ++++++++++++++++++++- 12 files changed, 136 insertions(+), 9 deletions(-) diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 031f1dd88a3b14d959eefe922827a47652c33b98..b32effda82e03f55abfbd2ebb9d6009b08cb39c4 100644 GIT binary patch delta 1149 zcma)+IZFdk5Xa}A6hazN6i?z2#6~3>k5&{n8jLZ~Rf!@igp`7X5k&AnP@>|APPVYO z5fsGNiM8Mduo7Dl^a}`1f>*QQ6>nMI{$}3so7sm~-`l%y{RZm`{4tO6k|;%JoGi7r zfG2MtK~XYkQbv?)8GY3M`~E%8P8KF#ETXo-oeoo+#`$p($s#GIWa$C2Xo!srW}4iy z^~p{KX_PsGbgMhoFZnDQlTBM>a>)`>E$;B&IfE**gd>j@YpAkiT{fgHS8%GAw^NO* z;y{n>;`2j9RB!_^y?}0&-NcKh$OR9{&Bde$GFzze2I6`}kSqfJsr}4iw$(jjf+oaQ zz6dQ!a(V|T!yW$TjM~Vcpgcp=!-+lgD*rC((V`P z`vKB=Y?l(7^LlJIi^yR$cZ@Ka+)w&r^ZEnTz*Wkt+s>^Hv zqBKfVg2_>}`ccjVwJwI$M|uy~pf(BjV=W(uKIw#>u|_C^W@^J|Ebe1gEq T>U1;TZJ}cO-hsMzJUew?n(yIl delta 318 zcmaF!p6k>ru7)j)4F%h06)@glp8Up~XZo}f#<uFTOkg>VK1Pr2a#f5TVD9#w8pbIQmRmhzA4JKzNkAn|O^kjJuEP{Y zuWhZ2)0n28OK0TSzN4K{0`3Br=@F%jB4C3Hx*21@j4#~~OQ!=Z_1J!-hf$6Z>;|CC zX<*iLprsz$@ANY&fw|l|42BE_3_1+v4Cd1xRx;Xd&zZ<51JMI?N)Chtbj1Wlkf*kP qn#!oeJb7On&vvbuj2j>(GRUTK+ diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index f88aa76..5edac3f 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1427,7 +1427,17 @@ VOID CMy2015RemoteDlg::CreateToolBar() m_ToolBar.SetButtonText(11, _TR("生成服务端")); m_ToolBar.SetButtonText(12, _TR("搜索")); m_ToolBar.SetButtonText(13, _TR("帮助")); - m_ToolBar.SetButtonText(14, _T("Lang/语言")); + // 按钮 14 "Lang/语言" 含 GBK 中文:comctl32 的 ANSI 消息按系统 ACP 解码,非中文系统会乱码, + // 故改用 Unicode 消息 + 显式 GBK(936)→Unicode 转换设置(与 TranslateListHeader 同法)。 + { + WCHAR wLabel[64] = { 0 }; + MultiByteToWideChar(936, 0, _T("Lang/语言"), -1, wLabel, 64); + TBBUTTONINFOW tbi = { 0 }; + tbi.cbSize = sizeof(tbi); + tbi.dwMask = TBIF_TEXT | TBIF_BYINDEX; // wParam 为按钮下标(与 SetButtonText(14,...) 同义) + tbi.pszText = wLabel; + ::SendMessageW(m_ToolBar.GetSafeHwnd(), TB_SETBUTTONINFOW, 14, (LPARAM)&tbi); + } m_ToolBar.SetButtonText(15, _T("MCP")); m_ToolBar.SetButtonText(16, _TR("连接管理")); m_ToolBar.SetButtonText(17, _TR("远程交谈")); diff --git a/server/2015Remote/CFileSpeedDlg.h b/server/2015Remote/CFileSpeedDlg.h index 2dd40c0..60ca8e8 100644 --- a/server/2015Remote/CFileSpeedDlg.h +++ b/server/2015Remote/CFileSpeedDlg.h @@ -79,6 +79,18 @@ protected: { CDialog::OnInitDialog(); + // 非中文系统上 MBCS 对话框模板的中文会被系统 ACP 转成 "?",TranslateDialog + // 拿到的是已乱码文本无法还原,故在此显式设置(参照 NotifySettingsDlg)。 + // 均经 _TR 支持多语言翻译。 + SetWindowText(_TR("文件传输速度")); + SetDlgItemText(IDC_FSPEED_HINT, _TR("拖动滑块设置文件传输速度:")); + SetDlgItemText(IDC_FSPEED_LABEL_SLOWEST, _TR("最慢")); + SetDlgItemText(IDC_FSPEED_LABEL_DEFAULT, _TR("默认")); + SetDlgItemText(IDC_FSPEED_LABEL_UNLIMITED, _TR("不限速")); + SetDlgItemText(IDC_FSPEED_RESET, _TR("恢复默认")); + SetDlgItemText(IDOK, _TR("确定")); + SetDlgItemText(IDCANCEL, _TR("取消")); + SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETRANGE, TRUE, MAKELONG(0, FILE_SPEED_TIER_COUNT - 1)); SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPAGESIZE, 0, 1); @@ -86,7 +98,6 @@ protected: SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPOS, TRUE, TierIndexFor(m_chunkKb, m_durMs)); UpdateLabel(); - TranslateDialog(this); return TRUE; } diff --git a/server/2015Remote/CPreviewLevelsDlg.h b/server/2015Remote/CPreviewLevelsDlg.h index b211d3f..88c6adf 100644 --- a/server/2015Remote/CPreviewLevelsDlg.h +++ b/server/2015Remote/CPreviewLevelsDlg.h @@ -89,11 +89,29 @@ protected: { CDialog::OnInitDialog(); + // 非中文系统上 MBCS 对话框模板的中文会被系统 ACP 转成 "?",TranslateDialog + // 拿到的是已乱码文本无法还原,故在此显式设置(参照 NotifySettingsDlg)。 + // 均经 _TR/_L 支持多语言翻译。 + SetWindowText(_TR("屏幕预览质量等级")); + SetDlgItemText(IDC_PLEVEL_LABEL_LEVEL, _TR("等级")); + SetDlgItemText(IDC_PLEVEL_LABEL_WIDTH, _TR("最大宽度")); + SetDlgItemText(IDC_PLEVEL_LABEL_QUALITY, _TR("JPEG质量")); + static const TCHAR* kLevelNames[QUALITY_COUNT] = { + _T("Ultra 极佳"), _T("High 优秀"), _T("Good 良好"), + _T("Medium 一般"), _T("Low 较差"), _T("Minimal 最低") + }; + for (int i = 0; i < QUALITY_COUNT; i++) + SetDlgItemText(IDC_PLEVEL_LABEL_LEVEL0 + i, _L(kLevelNames[i])); + SetDlgItemText(IDC_PLEVEL_LABEL_HINT, + _TR("最大宽度为期望编码宽度;JPEG 质量 1~100")); + SetDlgItemText(IDC_PLEVEL_RESET, _TR("恢复默认")); + SetDlgItemText(IDOK, _TR("确定")); + SetDlgItemText(IDCANCEL, _TR("取消")); + for (int i = 0; i < QUALITY_COUNT; i++) { m_working[i] = m_profiles[i]; } LoadToControls(); - TranslateDialog(this); return TRUE; } diff --git a/server/2015Remote/LangManager.h b/server/2015Remote/LangManager.h index ad73c94..045e100 100644 --- a/server/2015Remote/LangManager.h +++ b/server/2015Remote/LangManager.h @@ -723,11 +723,11 @@ protected: AppendData(&dlgTemplate, sizeof(DLGTEMPLATE)); AppendWord(0); // 菜单 AppendWord(0); // 窗口类 - AppendString(_T("切换语言 / Switch Language")); + AppendString(_T("切换语言")); AlignToDword(); // 静态文本 - AddControl(0x0082, 15, 15, 50, 12, (WORD)-1, + AddControl(0x0082, 15, 15, 50, 12, 1002, SS_LEFT | WS_CHILD | WS_VISIBLE, _T("语言:")); // ComboBox @@ -796,8 +796,17 @@ protected: { CDialog::OnInitDialog(); - // 翻译对话框控件(标题、标签、按钮) - TranslateDialog(this); + // 模板为动态构造的 Unicode 模板,MBCS 下被 ANSI 创建路径误读,标题/标签/按钮文字会乱码, + // 故在此显式设置(走线程 locale GBK,与其它对话框同法),不再对已乱码文本调用 TranslateDialog。 + // 标题含中文:非中文系统上 ANSI 消息按系统 ACP 解码会乱码,用 _TR 取翻译(中文→切换语言, + // 英语→Switch Language)后,显式 GBK(936)→Unicode 转换再用 Unicode 消息设置(与工具栏同法)。 + CString strTitle = _TR("切换语言"); + WCHAR wTitle[64] = { 0 }; + MultiByteToWideChar(936, 0, strTitle, -1, wTitle, 64); + ::SetWindowTextW(m_hWnd, wTitle); + SetDlgItemText(1002, _TR("语言:")); + SetDlgItemText(IDOK, _TR("确定")); + SetDlgItemText(IDCANCEL, _TR("取消")); m_comboLang.SubclassDlgItem(1001, this); diff --git a/server/2015Remote/PluginSettingsDlg.cpp b/server/2015Remote/PluginSettingsDlg.cpp index 87214fd..e8b0e4b 100644 --- a/server/2015Remote/PluginSettingsDlg.cpp +++ b/server/2015Remote/PluginSettingsDlg.cpp @@ -102,6 +102,10 @@ void CPluginSettingsDlg::InitListCtrl() GetDlgItem(IDC_STATIC_PLUGIN_INTERVAL)->SetWindowText(_TR("间隔(秒):")); GetDlgItem(IDC_STATIC_PLUGIN_COUNTER)->SetWindowText(_TR("最大次数:")); SetWindowText(_TR("插件设置")); + + // 按钮文字来自对话框模板,非中文系统上会被系统 ACP 转成 "??",须显式设置(参照 NotifySettingsDlg) + SetDlgItemText(IDC_BTN_SAVE, _TR("保存")); + SetDlgItemText(IDOK, _TR("关闭")); } void CPluginSettingsDlg::LoadPluginsToList() diff --git a/server/2015Remote/QualityLevelsDlg.h b/server/2015Remote/QualityLevelsDlg.h index 0b13d71..50de8e6 100644 --- a/server/2015Remote/QualityLevelsDlg.h +++ b/server/2015Remote/QualityLevelsDlg.h @@ -124,11 +124,31 @@ protected: { CDialog::OnInitDialog(); + // 非中文系统上 MBCS 对话框模板的中文会被系统 ACP 转成 "?",TranslateDialog + // 拿到的是已乱码文本无法还原,故在此显式设置(参照 NotifySettingsDlg)。 + // 均经 _TR/_L 支持多语言翻译。 + SetWindowText(_TR("远程桌面质量等级")); + SetDlgItemText(IDC_QLEVEL_LABEL_LEVEL, _TR("等级")); + SetDlgItemText(IDC_QLEVEL_LABEL_FPS, _TR("帧率(FPS)")); + SetDlgItemText(IDC_QLEVEL_LABEL_WIDTH, _TR("最大宽度")); + SetDlgItemText(IDC_QLEVEL_LABEL_ALGO, _TR("编码算法")); + SetDlgItemText(IDC_QLEVEL_LABEL_BITRATE, _TR("码率(kbps)")); + static const TCHAR* kLevelNames[QUALITY_COUNT] = { + _T("Ultra 极佳"), _T("High 优秀"), _T("Good 良好"), + _T("Medium 一般"), _T("Low 较差"), _T("Minimal 最低") + }; + for (int i = 0; i < QUALITY_COUNT; i++) + SetDlgItemText(IDC_QLEVEL_LABEL_LEVEL0 + i, _L(kLevelNames[i])); + SetDlgItemText(IDC_QLEVEL_LABEL_HINT, + _TR("最大宽度 0 表示原始分辨率;DIFF/RGB565 适合局域网,H264 适合跨网")); + SetDlgItemText(IDC_QLEVEL_RESET, _TR("恢复默认")); + SetDlgItemText(IDOK, _TR("确定")); + SetDlgItemText(IDCANCEL, _TR("取消")); + for (int i = 0; i < QUALITY_COUNT; i++) { m_working[i] = m_profiles[i]; } LoadToControls(); - TranslateDialog(this); return TRUE; } diff --git a/server/2015Remote/TriggerSettingsDlg.cpp b/server/2015Remote/TriggerSettingsDlg.cpp index 32d8aec..5f6219b 100644 --- a/server/2015Remote/TriggerSettingsDlg.cpp +++ b/server/2015Remote/TriggerSettingsDlg.cpp @@ -134,6 +134,13 @@ void CTriggerSettingsDlg::InitControls() SetWindowText(_TR("触发器设置")); GetDlgItem(IDC_STATIC_TRIGGER_TYPE)->SetWindowText(_TR("触发类型:")); GetDlgItem(IDC_STATIC_TRIGGER_ACTION)->SetWindowText(_TR("执行动作:")); + + // 按钮/分组框文字来自对话框模板,非中文系统上会被系统 ACP 转成 "?",须显式设置 + SetDlgItemText(IDC_STATIC_TRIGGER_LIST, _TR("已配置的触发器")); + SetDlgItemText(IDC_BTN_TRIGGER_ADD, _TR("添加 >>")); + SetDlgItemText(IDC_BTN_TRIGGER_REMOVE, _TR("<< 移除")); + SetDlgItemText(IDC_BTN_SAVE, _TR("保存(&S)")); + SetDlgItemText(IDOK, _TR("关闭")); } void CTriggerSettingsDlg::LoadPluginsToList() diff --git a/server/2015Remote/file/CFileManagerDlg.cpp b/server/2015Remote/file/CFileManagerDlg.cpp index 06b7a2e..2bdef4d 100644 --- a/server/2015Remote/file/CFileManagerDlg.cpp +++ b/server/2015Remote/file/CFileManagerDlg.cpp @@ -157,6 +157,15 @@ BOOL CFileManagerDlg::OnInitDialog() SetDlgItemText(IDC_STATIC_FILE_WINOS_SEARCH, _TR("搜索文件名:")); SetDlgItemText(IDC_STATIC_FILE_WINOS_PATH, _TR("路径:")); + // 多语言翻译 - 按钮/复选框(模板文字在非中文系统会被系统 ACP 转成 "?",须显式设置) + SetDlgItemText(IDC_CK_SUBFORDLE, _TR("包含子文件夹")); + SetDlgItemText(IDC_BTN_SEARCH, _TR("开始搜索")); + SetDlgItemText(ID_SEARCH_STOP, _TR("停止搜索")); + SetDlgItemText(ID_SEARCH_RESULT, _TR("搜索栏")); + SetDlgItemText(IDT_REMOTE_PREV, _TR("上一层")); + SetDlgItemText(IDT_REMOTE_VIEW, _TR("切换显示")); + SetDlgItemText(IDT_REMOTE_STOP, _TR("取消")); + RECT rect; GetClientRect(&rect); diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index 2ed38eb..9ace1b5 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -99,6 +99,8 @@ RTT=RTT ¼´ʱÏûϢ=Message ÐéÄâÆÁĻ=Virtual Screen Òþ˽ÆÁĻ=Privacy Screen +ʵÑ鹦ÄÜ=Experimental Features +Զ³̻­°å=Remote Drawing Board ´úÀí·þÎñ=Proxy Service עÈëÉèÖÃ=Inject Config ´´½¨¼ƻ®ÈÎÎñ=Scheduled Task @@ -121,6 +123,7 @@ RTT=RTT ; ============================================ ; Language Selection Dialog +Çл»ÓïÑÔ=Switch Language ; ============================================ ѡÔñÓïÑÔ / Select Language=Select Language ÓïÑÔ:=Language: diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index c2cccff..a453ab0 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -99,6 +99,8 @@ RTT=RTT ¼´ʱÏûϢ=¼´•rӍϢ ÐéÄâÆÁĻ=̓”M×ÀÃæ Òþ˽ÆÁĻ=ë[˽ΞĻ +ʵÑ鹦ÄÜ=Œ�򞹦ÄÜ +Զ³̻­°å=ßh¶ËÀLˆD°å ´úÀí·þÎñ=´úÀí·þ„Õ עÈëÉèÖÃ=עÈëÔO¶¨ ´´½¨¼ƻ®ÈÎÎñ=½¨Á¢Åų̹¤×÷ @@ -121,6 +123,7 @@ RTT=RTT ; ============================================ ; Language Selection Dialog +ÇГQÕZÑÔ=ÇГQÕZÑÔ ; ============================================ ѡÔñÓïÑÔ / Select Language=ßx“ñÕZÑÔ ÓïÑÔ:=ÕZÑÔ: diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index bba7e5a..205ec5a 100644 --- a/server/2015Remote/resource.h +++ b/server/2015Remote/resource.h @@ -1077,13 +1077,46 @@ #define IDC_FSPEED_LABEL 2591 #define IDC_FSPEED_RESET 2592 +// 高级菜单三个对话框的静态文本(显式在 OnInitDialog 设置中文,修复非中文系统乱码) +#define IDC_QLEVEL_LABEL_LEVEL 2593 +#define IDC_QLEVEL_LABEL_FPS 2594 +#define IDC_QLEVEL_LABEL_WIDTH 2595 +#define IDC_QLEVEL_LABEL_ALGO 2596 +#define IDC_QLEVEL_LABEL_BITRATE 2597 +#define IDC_QLEVEL_LABEL_LEVEL0 2598 // 2598~2603:Ultra..Minimal 六档 +#define IDC_QLEVEL_LABEL_LEVEL1 2599 +#define IDC_QLEVEL_LABEL_LEVEL2 2600 +#define IDC_QLEVEL_LABEL_LEVEL3 2601 +#define IDC_QLEVEL_LABEL_LEVEL4 2602 +#define IDC_QLEVEL_LABEL_LEVEL5 2603 +#define IDC_QLEVEL_LABEL_HINT 2604 + +#define IDC_PLEVEL_LABEL_LEVEL 2605 +#define IDC_PLEVEL_LABEL_WIDTH 2606 +#define IDC_PLEVEL_LABEL_QUALITY 2607 +#define IDC_PLEVEL_LABEL_LEVEL0 2608 // 2608~2613:Ultra..Minimal 六档 +#define IDC_PLEVEL_LABEL_LEVEL1 2609 +#define IDC_PLEVEL_LABEL_LEVEL2 2610 +#define IDC_PLEVEL_LABEL_LEVEL3 2611 +#define IDC_PLEVEL_LABEL_LEVEL4 2612 +#define IDC_PLEVEL_LABEL_LEVEL5 2613 +#define IDC_PLEVEL_LABEL_HINT 2614 + +#define IDC_FSPEED_HINT 2615 +#define IDC_FSPEED_LABEL_SLOWEST 2616 +#define IDC_FSPEED_LABEL_DEFAULT 2617 +#define IDC_FSPEED_LABEL_UNLIMITED 2618 + +// 触发器设置对话框的分组框(显式在 OnInitDialog 设置中文,修复非中文系统乱码) +#define IDC_STATIC_TRIGGER_LIST 2619 + // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 410 #define _APS_NEXT_COMMAND_VALUE 33093 -#define _APS_NEXT_CONTROL_VALUE 2593 +#define _APS_NEXT_CONTROL_VALUE 2620 #define _APS_NEXT_SYMED_VALUE 105 #endif #endif