C++ 使用resource.rc中指定的不同语言构建应用程序
我从来没有做过这样的事,所以这是我第一次尝试。从网上阅读不同的信息和教程,我可以自信地说,我感到非常困惑,所以我自己去做这件事 我试图实现的是为GUI提供不同语言的不同构建配置 我的应用程序是使用Visual Studio 2019构建的Win32 我尝试了以下步骤:C++ 使用resource.rc中指定的不同语言构建应用程序,c++,winapi,visual-c++,C++,Winapi,Visual C++,我从来没有做过这样的事,所以这是我第一次尝试。从网上阅读不同的信息和教程,我可以自信地说,我感到非常困惑,所以我自己去做这件事 我试图实现的是为GUI提供不同语言的不同构建配置 我的应用程序是使用Visual Studio 2019构建的Win32 我尝试了以下步骤: 克隆了我现有的发布版本 在记事本++中打开我的.rc文件并克隆了“默认”语言 部分 更改了克隆节(语言)中的语言宏 朗朗(越南语,次朗朗(默认) 翻译菜单、对话框等所有内容 在VisualStudio中重新加载,我可以看到所有资
- 克隆了我现有的发布版本
- 在记事本++中打开我的.rc文件并克隆了“默认”语言 部分
- 更改了克隆节(语言)中的语言宏 朗朗(越南语,次朗朗(默认)
- 翻译菜单、对话框等所有内容
- 在VisualStudio中重新加载,我可以看到所有资源的2倍集。( 菜单、对话框、所有内容2套-1套英语和1套越南语)
- 打开项目宣传->资源并将文化更改为 越南人
- 成功地完成了这个项目
非常感谢任何建议/示例。我似乎会回答我自己的问题,因为我相信其他人也遇到了这个问题 更改Windows GUI应用程序语言的正确正式方法是: 使用这个函数,以及我在问题中所做的事情;该函数将在运行时应用该语言中的资源。(菜单、对话框、所有内容) 我认为我的情况很简单:
SetThreadUILanguage(MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM));
然而,在我的例子中,我创建的是每种语言的构建,因此如果您想允许用户在运行时更改语言,请参阅注释和
联合国官方的方法是做更多的工作,但是相当稳定且不容易出错
- 您必须用该语言翻译和重建菜单
- 必须按语言翻译和重命名每个对话框ID,并按语言显示该对话框ID
// Find our Menu resource based on desired language
HRSRC hRes = FindResourceExW(hInstance, RT_MENU, MAKEINTRESOURCE(IDC_APPLICATION), MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM));
if (!hRes) {
wchar_t buf[MAX_PATH] = { 0 };
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
MessageBoxW(0, buf, _TEXT(L"FindResourceExW Error"), MB_OK | MB_ICONERROR);
return FALSE;
}
// Load our Menu resource based on desired language
HGLOBAL hGlo = LoadResource(hInstance, hRes);
if (!hGlo) {
wchar_t buf[MAX_PATH] = { 0 };
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
MessageBoxW(0, buf, _TEXT(L"LoadResource Error"), MB_OK | MB_ICONERROR);
return FALSE;
}
// Lock the resource
LPVOID pData = LockResource(hGlo);
if (pData == NULL) {
wchar_t buf[MAX_PATH] = { 0 };
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
MessageBoxW(0, buf, _TEXT(L"LockResource Error"), MB_OK | MB_ICONERROR);
return FALSE;
}
// Load the new Menu into memory
HMENU hMenu = LoadMenuIndirectW((MENUTEMPLATE*)pData);
if (!hMenu) {
wchar_t buf[MAX_PATH] = { 0 };
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
MessageBoxW(0, buf, _TEXT(L"LoadMenuIndirectW Error"), MB_OK | MB_ICONERROR);
return FALSE;
}
// Get our default Menu
HMENU hMenu_old = GetMenu(g_Hwnd);
// Set no Menu
SetMenu(g_Hwnd, NULL);
// Erase default Menu
DestroyMenu(hMenu_old);
// Set our new Menu
SetMenu(g_Hwnd, hMenu);
// Draw our new Menu
DrawMenuBar(g_Hwnd);
注意:如果您想使用FindResourceEx搜索字符串,因为RT\U字符串更为复杂,因此请在浪费您的时间之前
享受吧 您需要查看从RC文件加载资源的位置,并使用适当的语言ID调用
findresourcexa
@RichardCritten有趣的是,我正在看这个。@RichardCritten这似乎是我需要的,但是我不知道如何正确使用它…@NorbertBoros是一个旧案例。我不确定这对你是否有帮助。