代码之家  ›  专栏  ›  技术社区  ›  David Thornley

在哪里翻译MFC消息框

  •  8
  • David Thornley  · 技术社区  · 16 年前

    我目前的问题是,当我使用 AfxMessageBox MessageBox ,对话框标题和按钮消息都是英文的,我找不到任何地方可以改变这一点。

    我在MSDN或谷歌上找不到任何有用的东西。

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

    编辑:我去了 MessageBoxEx AfxMessageBox 看起来确实如此 MB_OK 在英语和日语中都显示为“OK”,但其他按钮选项如 MB_YESNO

    3 回复  |  直到 11 年前
        1
  •  7
  •   Brian R. Bondy    16 年前

    MessageBoxEx 并指定WORD wLanguageId字段。

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

    要指定当前语言以外的语言,请使用 创建此文件的MAKELANGID宏 参数。有关更多信息,请参见 MAKELANGID。

    更多信息 MAKELANGID 可以在这里找到。


    如果这对你不起作用,另一种选择是制作自己的对话框。

        2
  •  2
  •   Serge Wautier    16 年前

    标题是您指定的字符串,因此您应该能够翻译它。

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

    MessageBoxEx(Brian提到过)在语言支持方面一直表现不佳。 This MS KB article 十多年前,Windows 2000将正确支持该语言id。但它显然从未成功过。

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

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

        3
  •  2
  •   gavenkoa    13 年前

    创建自己的 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。