Visual c++ 在哪里翻译MFC消息框

Visual c++ 在哪里翻译MFC消息框,visual-c++,mfc,Visual C++,Mfc,我正在将一个MFC应用程序本地化为日语,并使资源正常工作 我目前的问题是,当我使用AfxMessageBox或MessageBox时,对话框标题和按钮消息会以英语显示,我还没有找到任何地方可以更改 我在搜索MSDN或谷歌时没有发现任何有用的东西 所以 这行吗?Windows是否提供日语、阿拉伯语和俄语的“确定”或“是/否”按钮 如果没有,我应该指定什么来更改这些 编辑:我使用了MessageBoxEx,编写了一个包装类,使其与AfxMessageBox一样方便使用。在英文和日文中,MB_OK显示

我正在将一个MFC应用程序本地化为日语,并使资源正常工作

我目前的问题是,当我使用
AfxMessageBox
MessageBox
时,对话框标题和按钮消息会以英语显示,我还没有找到任何地方可以更改

我在搜索MSDN或谷歌时没有发现任何有用的东西

所以

这行吗?Windows是否提供日语、阿拉伯语和俄语的“确定”或“是/否”按钮

如果没有,我应该指定什么来更改这些

编辑:我使用了
MessageBoxEx
,编写了一个包装类,使其与
AfxMessageBox
一样方便使用。在英文和日文中,
MB_OK
显示为“OK”,但其他按钮选项,如
MB_YESNO
被翻译成我认为是正确的日文。这是一个需要翻译的相当小的应用程序,我们可能希望在较大的应用程序中使用自动化的应用程序。

使用并指定单词wLanguageId字段

wLanguageId [in]指定消息框中显示的文本的语言 按钮。指定零的值 (0)指示显示按钮 默认系统语言中的文本。 如果此参数为 MAKELANGID(LANG_中立, SUBLANG_(中性),当前语言 与调用线程关联的是 用过

要指定当前语言以外的语言,请使用 MAKELANGID宏来创建此 参数有关详细信息,请参阅 马克兰吉德

更多信息可以在这里找到



如果这不适合您,另一种选择是创建您自己的对话框。

标题是您指定的字符串,因此您应该能够翻译它。 在AfxMessageBox()中,标题是应用程序名(AfxGetAppName()IIRC)

关于按钮,文本是操作系统的一部分,无法翻译

MessageBoxEx(由Brian提到)在语言支持方面从来没有很好地工作过。从十多年前开始,Windows 2000将正确支持该语言id。但很明显,它从未成功

所以你很不走运。您唯一的解决方案是使用第三方实现,例如优秀的,并通过字符串表提供翻译


请注意,的词汇表包含Yes、no、cancel等词,。。。以25种语言编写,并将自动翻译。

创建自己的L10N宏/函数,并使用以下代码:

static LRESULT __stdcall ChangeCaptions(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HCBT_ACTIVATE) { SetWindowText(GetDlgItem((HWND) wParam, IDOK), L10N(GUI_OK_MSG)); SetWindowText(GetDlgItem((HWND) wParam, IDCANCEL), L10N(GUI_CANCEL_MSG)); SetWindowText(GetDlgItem((HWND) wParam, IDYES), L10N(GUI_YES_MSG)); SetWindowText(GetDlgItem((HWND) wParam, IDNO), L10N(GUI_NO_MSG)); } return 0; } int addon_gui_messagebox(HWND parentHWnd, HINSTANCE hInstance, void *text, void *caption, int type) { int ret; hook = SetWindowsHookEx(WH_CBT, ChangeCaptions, hInstance, GetCurrentThreadId()); ret = MessageBox(parentHWnd, text, caption, type); UnhookWindowsHookEx(hook); return ret; } 静态LRESULT\uu stdcall变更字幕(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM) { 如果(nCode==HCBT_激活){ SetWindowText(GetDlgItem((HWND)wParam,IDOK),L10N(GUI_OK_MSG)); SetWindowText(GetDlgItem((HWND)wParam,IDCANCEL),L10N(GUI\u CANCEL\u MSG)); SetWindowText(GetDlgItem((HWND)wParam,idies),L10N(GUI_YES_MSG)); SetWindowText(GetDlgItem((HWND)wParam,IDNO),L10N(GUI_NO_MSG)); } 返回0; } int addon_gui_messagebox(HWND parentHWnd,HINSTANCE HINSTANCE,void*文本,void*标题,int类型) { int ret; hook=SetWindowsHookEx(WH_CBT,ChangeCaptions,hInstance,GetCurrentThreadId()); ret=消息框(parentHWnd、文本、标题、类型); 解开钩(钩); 返回ret; }
正如我之前所写,MessageBoxEx当前忽略lang arg。

你好,大卫,我尝试了MessageBoxEx,但它对我不起作用。我需要一些额外的“语言包”来让它工作吗?MessageBoxEx目前忽略lang arg。因此,MessageBox不是更好,而且您仍然存在本地化问题。。。来自MSDN:按钮采用系统用户界面的语言。目前MessageBoxEx和MessageBox的工作方式相同。在Windows 10中,MessageBoxEx对我来说工作正常。