gpt4 book ai didi

c++ - 使用 resource.rc 中指定的不同语言构建应用程序

转载 作者:行者123 更新时间:2023-11-30 04:45:37 24 4
gpt4 key购买 nike

我从来没有做过这样的事情,所以这是我的第一次尝试。通过在线阅读不同的信息和教程,我可以自信地说,我很困惑,所以我自己做了。

我想要实现的是为 GUI 使用不同语言的不同构建配置。

我的应用程序是使用 Visual Studio 2019 构建的 Win32。

我尝试的步骤:

  • 克隆我现有的发布版本
  • 在 Notepad++ 中打开我的 .rc 文件并克隆“默认”语言部分
  • 更改了克隆部分中的语言宏(LANGUAGELANG_VIETNAMESE,SUBLANG_DEFAULT)
  • 翻译菜单、对话框等所有内容。
  • 在 visual studio 中重新加载,我可以看到所有资源的 2x 集。 (菜单、对话框、2 套中的所有内容 - 1 套英语和 1 套越南语)
  • 打开项目属性 -> 资源并将文化更改为越南语
  • 成功构建项目

然而结果是什么都没有。菜单和对话框仍为英文。

我还必须做些什么来指定使用哪组资源来获得不同的语言构建?

还是我把事情复杂化了,结果全错了……

非常感谢任何建议/示例。

最佳答案

看来我会回答我自己的问题,因为我相信其他人也遇到过这个问题。

更改 Windows GUI 应用程序语言的正确官方方法是:

SetThreadUILanguage

使用此功能,以及我在问题中所做的确切事情;该函数将在运行时应用该语言的资源。 (菜单,对话框,一切)

我的情况很简单:

SetThreadUILanguage(MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM));

但是在我的例子中,我正在为每种语言创建构建,所以如果你想让用户在运行时更改语言,请参阅注释和 this article .

非官方的方式需要做更多的工作,但相当稳定且不易出错。

  • 您必须用该语言翻译和重建您的菜单
  • 您必须翻译和重命名每种语言的每个对话 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_STRING会比较复杂,请see this在你浪费时间之前。

尽情享受吧!

关于c++ - 使用 resource.rc 中指定的不同语言构建应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57182738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com