【发布时间】:2010-11-15 20:35:09
【问题描述】:
我希望能够以编程方式修改应用程序的语言,或者至少使用控制面板 -> 区域和语言选项 -> 格式中指定的语言。
如果我添加一个英文字符串表,制作一份法文和德文副本,然后删除英文的,我可以通过编程方式在加载法文和德文字符串之间切换。 如果我保留英文副本,无论如何,当我尝试加载德文或法文时,英文字符串都会被加载。
我认为这是一个资源加载器错误,如果资源加载器找到与 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() 返回什么是 在控制面板中设置 -> 区域和 语言选项 -> 格式。
- 资源加载器错误本质上是如果我的程序也有美国英语资源,那么无论在格式中设置什么,这些资源都会被加载。如果没有美国英语资源,将使用格式设置的语言。
- 如果我有一个法语(中性)和一个德语(中性)字符串表,并且我将格式设置为法语(法国),则加载德语字符串。如果我添加一个英文(中性)字符串表,则会加载英文字符串。因此,中性文化回退不适用于 Formats 中设置的内容。
- 如果我添加一个中性字符串表,即使我有另一个英语(中性)或英语(美国)字符串表,也会使用该表。
【问题讨论】:
标签: c++ windows localization visual-c++