19

我对本地化编程相当陌生,我正在尝试弄清楚如何为新启动的非托管 C++ 应用程序(从应用程序内部)设置正确的初始语言环境。

据我所知,新应用程序从 C 语言环境开始,而不是正确的区域语言环境(英语、德语等)。所以我需要做的是 call setlocale( LC_ALL, "???" ),但我不确定如何获得第二个参数的正确值。它将类似于“英语”或“德语:德国” - 基本上是用户通过区域和语言选项控制面板设置的任何区域设置。为了清楚起见,我不是在寻找如何格式化语言环境字符串,而是在为运行应用程序的计算机寻找正确的语言环境字符串。

我猜有一些 Win32 API 会给我这个,或者可能是一个包含正确值的注册表项。有人知道我应该做什么吗?

4

1 回答 1

29

setlocale() 是 C,而不是 C++。我隐约记得在 VC6 上看到两者之间存在干扰,但那是一个错误。通常,setlocale() 只影响 C 函数的行为。

在 C++ 中,本地化由 std::locale 类控制。默认情况下,区域设置敏感操作使用全局区域设置,这是通过默认构造一个区域设置对象获得的,并且可以使用 std::locale::global(const std::locale&) 设置。

用空字符串 (std::locale("")) 构造一个语言环境对象会创建一个与程序环境相对应的语言环境。

在程序启动时,全局语言环境是“C”或“经典”语言环境。要将全局语言环境设置为程序的环境语言环境(我猜这就是你要问的),你可以这样写:

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
于 2009-02-20T21:58:57.623 回答