我对本地化编程很新,我正在试图弄清楚如何为新启动的非托管C ++应用程序(从应用程序内部)设置正确的初始区域设置。
据我所知,新的应用程序以C语言环境开始,而不是适当的区域语言环境(英语,德语等)。所以我需要做的是调用setlocale( LC_ALL, "???" )
,但我不知道如何为第二个参数获取正确的值。它将类似于“英语”或“德语:德国” - 基本上是用户通过“区域和语言选项”控制面板设置的区域设置。为了清楚起见,我不正在寻找如何格式化语言环境字符串,我正在为运行该应用程序的计算机寻找正确的语言环境字符串。
我猜测有一些Win32 API会给我这个,或者可能是一个包含正确值的注册表项。有人知道我应该做什么吗?
答案 0 :(得分:25)
setlocale()是C,而不是C ++。我依稀记得在VC6上看到两者之间的干扰,但这是一个错误。通常,setlocale()仅影响C函数的行为。
在C ++中,本地化由std :: locale类控制。默认情况下,对语言环境敏感的操作使用全局语言环境,该语言环境是通过默认构造语言环境对象获得的,并且可以使用std :: locale :: global(const std :: locale&)进行设置。
使用空字符串构建语言环境对象(std :: locale(“”))会创建与程序环境对应的语言环境。
在程序启动时,全局区域设置是“C”或“Classic”区域设置。要将全局语言环境设置为程序的环境语言环境(我猜你正在问的问题),你可以这样写:
std::locale::global(std::locale(""));
例如,我的区域设置目前设置为法语(加拿大)。运行这个:
int main(void)
{
std::cout << std::locale().name() << std::endl;
std::locale::global(std::locale(""));
std::cout << std::locale().name() << std::endl;
std::locale::global(std::locale("C"));
std::cout << std::locale().name() << std::endl;
return 0;
}
打印:
C
French_Canada.1252
C