我在哪里翻译MFC消息框

时间:2009-03-02 18:21:11

标签: visual-c++ mfc

我正在将MFC应用程序本地化为日语,并且资源正常运行。

我目前的问题是,当我使用AfxMessageBoxMessageBox时,对话框标题和按钮消息会以英文显示,我找不到任何可以更改的内容。

我没有找到任何有用的搜索MSDN或Google。

所以,

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

如果没有,我可以指定更改这些内容?

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

3 个答案:

答案 0 :(得分:5)

使用MessageBoxEx并指定WORD wLanguageId字段。

  

wLanguageId       [in]指定消息框中显示的文本的语言   纽扣)。指定零值   (0)表示显示按钮   默认系统语言中的文本。   如果这个参数是   MAKELANGID(LANG_NEUTRAL,   SUBLANG_NEUTRAL),当前语言   与调用线程相关联的是   使用

     

要指定当前语言以外的语言,请使用   MAKELANGID宏来创建这个   参数。有关更多信息,请参阅   MAKELANGID。

有关MAKELANGID的更多信息,请点击此处。


如果这对您不起作用,另一种方法是创建自己的对话框。

答案 1 :(得分:2)

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

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

MessageBoxEx(Brian提到)在语言支持方面从未运作良好。十多年前的This MS KB article表示Windows 2000将正确支持语言ID。但它显然从未实现过。

所以你几乎没有运气。您唯一的解决方案是使用第三方实施,例如优秀的XMessageBox,并通过字符串表提供翻译。

请注意,appTranslator的词汇表包含25种语言中的“是”,“否”,“取消”等字词,并会自动翻译。

答案 2 :(得分:1)

创建您自己的 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;
}

正如我之前所写,MessageBoxEx目前忽略了lang arg。