MFC在加载资源时如何确定默认语言ID
How does MFC determine the default language ID when loading resources?
我有一个MFC项目,其中包含一个用于美国英语的.rc文件和一个用于瑞士德语的.rec文件。这两个.rc文件是相同的,除了1)我在测试中使用的单个字符串,以及2).rc文件在顶部使用不同的LANGUAGE
语句:
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US >>> for US English
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_SWISS >>> for Swiss German
我将从一个主.rc文件中包含两个.rc文件。编译主.rc文件,将特定于语言的.rc文件设置为"从构建中排除"。
我相信我已经正确地设置了所有内容,因为我可以使用下面这样的片段成功地从瑞士德语资源文件加载字符串资源:
WORD swissGermanLanguageID =
MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
WORD swissGermanLCID =
MAKELCID(swissGermanLanguageID, SORT_DEFAULT);
CString teststring;
teststring.LoadString(AfxGetResourceHandle(), IDS_TESTSTRING, swissGermanLCID);
问题是:当我省略语言ID时,例如在下面的代码段中,MFC总是从美国英语资源加载资源,无论我尝试什么:
CString teststring;
teststring.LoadString(IDS_TESTSTRING);
我尝试过/检查过的东西:
- 我已经在Windows控制面板中三次检查了我的语言环境是否设置为瑞士德语
- 当我从美国英语资源文件中删除所有STRINGTABLE条目时,默认的
LoadString
成功加载瑞士德语测试字符串。我的结论是,如果存在的话,美国的英语资源优先于瑞士的德语资源 - 我试图将线程区域设置为瑞士德语,但没有成功(本文末尾的片段)。MFC仍然坚持加载美国英语字符串
- 我已经在项目中搜索了任何与语言相关的代码,但什么都没有。该项目是一个简单的MFC应用程序,我通过Visual Studio 2013中的项目向导创建了它
- 我还在项目属性的"资源"部分尝试了"文化"选项的各种设置。目前我正在明确设置对应于瑞士德语的
/l 0x0807
- 在最后一次尝试中,我尝试将瑞士-德国资源拆分为一个单独的卫星DLL——显然,我认为这非常有效,因为MFC在幕后调用
AfxSetResourceHandle()
好的,最后,这里有一个问题:MFC如何确定加载资源时使用的默认语言ID?更好的是:我如何更改默认的语言ID?
这是我上面提到的用于设置线程区域设置的片段:
WORD swissGermanLanguageID =
MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
WORD swissGermanLCID =
MAKELCID(swissGermanLanguageID, SORT_DEFAULT);
SetThreadLocale(swissGermanLCID);
- 请检查哪些资源实际打包到可执行文件中。您可以使用资源管理器套件或其他资源编辑器
- 在Windows Vista和更新版本上,资源加载顺序由使用
GetThreadPreferredUILanguages
函数族可以获得的首选语言列表决定(用户、进程和线程有一个单独的列表,它们组合在一起执行资源查找)。MFC运行时可能会更改它,但我不确定。在您的系统中,此列表可能包含4个条目:[de-CH
、de
、en-US
、en
] - 将资源拆分为单独的mui-dll可能是一个好主意,尽管当所有内容都打包到一个可执行文件中时,它应该可以很好地工作
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 如何确定我已使用非编码文件到达 EOF?
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 初始化具有非默认构造函数的std::数组项的更好方法
- 何时提供默认参数作为模板参数
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 是默认情况下分配给char数组常量的值
- 具有默认值的引用获取函数
- MFC在加载资源时如何确定默认语言ID
- 默认情况下构造函数插入数据后,我没有得到任何输出,但我不确定为什么不
- 什么是C++中的不确定行为?它与未定义的行为有何不同
- 确定与 URI 方案关联的默认图标
- 如何确定模板参数是否为默认值
- cups:如何确定当前/默认打印机是否已物理连接并打开
- 是否可以仅使用OpenGL来确定默认帧缓冲区的大小
- 如何给一个参数一个由其他参数的函数确定的默认值
- 如何确定函数参数是自动设置为默认值还是在C++中显式设置