用于非unicode程序和注册表设置的语言

Language for non-unicode programs and registry settings

本文关键字:设置 语言 注册表 unicode 程序 用于      更新时间:2023-10-16

Windows XP在控制面板/区域和语言设置中有一个"非unicode程序的当前语言"选项。

可以使用它来让非unicode程序响应所选语言。

然而,有些程序不响应此设置,而是需要更改注册表才能工作。注册表更改将当前语言重定向到另一种语言。

为什么有些程序响应第一种方法(控制面板)而其他程序响应第二种方法(注册表)?代码的根本区别是什么?我可以期望在任何一种应用程序中找到哪些调用/编译选项?

如果我必须将一种类型的应用程序(响应注册表设置的应用程序)转换为使用控制面板设置的程序-需要更改哪些代码?

谢谢。

您提到的注册表项除了将一些代码页映射到CP1251 (Cyrillic)之外没有任何作用,有效地迫使CP1251在整个系统中使用。所以实际上你提到的程序有一些信息是硬编码的。

不幸的是,你没有给我们很多关于你真正的挑战的信息,所以我假设你需要显示1)本地化的UI正确或2)你想允许输入西里尔字符。

让我们简单地谈谈这些问题:

  1. 如果你只是不能正确显示本地化文本,并且应用程序是使用MFC编写的,则可能是对话框的字体设置不正确(为MS Shell Dlg或MS Shell Dlg 2,无论在这种情况下如何工作)。

  2. 在后一种情况下(可能也是第一种情况),应用程序假定您将使用英语- us语言,系统的语言应为En-US,从而有效地将Locale设置为1033,并将默认代码页设置为CP1252。它可能被硬编码在某个地方。在这种情况下,您需要修改源代码(如果您可以访问它),以便这些属性来自操作系统设置。

要检测应该使用的语言:

LCID currentLocale = GetUserDefaultLCID();

和检测当前(所谓的ANSI)代码页:

UINT currentCodePage = GetACP();

您可以要求注册表在值更改时通知您,但您的程序必须运行。

控制面板包含启动以进行更改的程序(通常是下面的注册表更新)。当这些特殊程序运行时,它们可以触发任何类型的更新过程。