diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 031f1dd..b32effd 100644 Binary files a/server/2015Remote/2015Remote.rc and b/server/2015Remote/2015Remote.rc differ 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