我希望能够以编程方式修改应用程序的语言,或者至少使用“控制面板”->“区域和语言选项”->“格式”中指定的语言。
如果我添加一个英语字符串表,为其制作一个法语和德语副本,然后删除英语字符串表,我可以以编程方式在加载法语和德语字符串之间切换。
如果我保留英文副本,那么当我尝试加载德语或法语字符串时,无论如何都会加载英语字符串。
我认为这是一个资源加载器错误,如果资源加载器找到与 Windows ui 语言相同的语言的字符串表(例如 Windows 资源管理器菜单的语言),则资源加载器会忽略 SetThreadLocale。
我尝试将控制面板 -> 区域和语言选项 -> 格式更改为法语,但这没有效果。资源编辑器显示没有附加语言的法语字符串表,但我的程序仍然总是加载英语字符串。将此更改复制到系统帐户也没有效果。
这是我尝试过的代码:
#include "stdafx.h"
#include <iostream>
#include "windows.h" // this should go to stdafx.h
#include "resource.h" // this should not go to stdafx.h
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// 1036 = french, 1031 = german
SetThreadLocale(MAKELCID(1036, SORT_DEFAULT));
const int maxSize = 100;
wchar_t c[maxSize];
LoadString(GetModuleHandle(NULL), IDS_STRING101, c, maxSize);
std::cout << c;
return 0;
}
Here是一个错误的、不完整的解释(在方法 2 的后半部分)。那里提出的第二个解决方法,仅使用国家/地区中立的字符串表是无用的,因为我有单独的葡萄牙语-葡萄牙和葡萄牙语-巴西字符串表。
那里提出的第一个解决方法不起作用。使用下面的代码,我收到错误 1814。
HRSRC r = FindResource(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDS_STRING101),
RT_STRING);
DWORD e = GetLastError();
所以我该怎么做 ?这个奇怪的“bug”怎么解释呢?
稍后编辑:
经过更多测试后我发现:
- GetThreadLocale() 返回什么
在“控制面板”->“区域”中设置
语言选项 -> 格式。
- 资源加载器错误本质上是,如果我的程序也有美国英语资源,那么无论“格式”设置什么,这些资源都会被加载。如果没有美国英语资源,将使用格式中设置的语言。
- 如果我有法语(中性)和德语(中性)字符串表,并且我将格式设置为法语(法国),则会加载德语字符串。如果我添加英语(中性)字符串表,则会加载英语字符串。因此,中性文化后备不适用于格式中设置的内容。
- 如果我添加一个中性字符串表,即使我有另一个英语(中性)或英语(美国)字符串表,也会使用该表。