我正在将MFC应用程序本地化为日语,并且资源正常运行。
我目前的问题是,当我使用AfxMessageBox
或MessageBox
时,对话框标题和按钮消息会以英文显示,我找不到任何可以更改的内容。
我没有找到任何有用的搜索MSDN或Google。
所以,
这有用吗? Windows是否提供日语,阿拉伯语和俄语中的“确定”或“是/否”按钮?
如果没有,我可以指定更改这些内容?
编辑:我选择了MessageBoxEx
,编写了一个包装类,使其像AfxMessageBox
一样方便使用。看来MB_OK
在英语和日语中都显示为“OK”,但其他按钮选项如MB_YESNO
被翻译成我认为是正确的日语。这是一个相当小的翻译应用程序,我们可能希望为较大的应用程序使用自动化的东西。
答案 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。