以编程方式更改操作系统的“区域和语言”设置

7
我希望能够从C#程序中更改操作系统(Windows 7)的“区域和语言”设置。我不反对执行命令行命令,但我只发现了如何启动“区域和语言”对话框:control /name Microsoft.RegionAndLanguage 这是一个语言本地化问题,其中DateTimePicker等控件只能使用Windows的“区域和语言”设置(有关详细信息,请参见此处)。然而,将操作系统更新以符合应用程序的语言设置超出了此范围,最终是期望达到的目标。
欢迎提供建议和/或解决方法。

我认为你不应该更改系统的语言设置。最好的方法是创建一个新的、可本地化的 DateTimePicker 控件,或者寻找一个现成的控件。 - vulkanino
只是猜测,为日期选择器控件设置自定义格式是否能解决您的问题? - V4Vendetta
@V4Vendetta 不,自定义格式不够用,他可能想要更改其他设置,比如每周的第一天等等。 - vulkanino
我正在开发的软件有效地替代了桌面;在软件内更改语言应该无缝更新操作系统 - 操作系统只能从软件内部访问。因此,在这种情况下,最好让操作系统符合要求。我还考虑使用DateTimePicker的替代方案(这有点不理想),但是在回答问题时我意识到更改操作系统语言非常重要。我将相应地更新我的原始帖子。 - Pooven
6个回答

4
我能提供的唯一解决方案是修改注册表。在Windows 7中,当语言被更改时,将在子键HKEY_CURRENT_USER\Control Panel\Desktop中添加一个新条目。此键将包含类型为REG_MULTI_SZPreferredUILanguagesPending条目,其值将确定UI语言。要应用更改,当前用户需要注销并重新登录。可以使用以下代码完成此操作:
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
string[] lang = {"en-ZA"};
key.SetValue("PreferredUILanguagesPending", lang, RegistryValueKind.MultiString);

在设置语言之前,需要先安装语言包。要查看语言包列表,请参阅此处此处。当安装了多个语言包时,在控制面板 > 区域和语言 > 键盘和语言 > 显示语言中会出现更改 UI 语言的选项。


3
听起来好像只需要改变应用程序的文化/界面文化就足够了。
例如:
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");

1
不是这样的,在提供的链接中,微软表示:“发生这种行为是因为 DateTimePicker 控件和 MonthCalendar 控件是 Microsoft Windows 公共控件。因此,操作系统的用户语言环境决定了这些控件的用户界面。” - vulkanino
我改正了我的错误,并同意你对OPS问题的评论,建立一个新的控制。 - Dominik

1

我找到了一个很好的替代品来代替 DateTimePickerhttp://www.visualhint.com/fieldpackeditor

对于所有系统控件和系统对话框,如 OpenFileDialogPrintDialog 等,它们在 .NET 中无法本地化。

但是想一想,为什么你要改变应用程序的文化呢?用户可以使用控制面板自己更改区域和语言设置,为什么你的应用程序要覆盖这些设置呢?


我们只在一个表单中使用DateTimePicker控件;我认为我们公司不会批准购买新软件来实现这个目标。然而,我已经意识到我的目标超出了DateTimePicker控件。谢谢你的回复。 - Pooven

1
我会尽力帮助您进行翻译。以下是您需要翻译的内容:

我在这里找到了解决方案:https://support.microsoft.com/de-de/help/2764405/how-to-automate-regional-and-language-settings-in-windows-vista-window

您需要创建一个包含以下内容的XML文件:

<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
    <gs:UserList>
        <gs:User UserID="Current"/>
    </gs:UserList>
    <gs:UserLocale>
        <gs:Locale Name="en-US" SetAsCurrent="true"/>
    </gs:UserLocale>
</gs:GlobalizationServices>

然后运行此命令:

control intl.cpl,, /f:"<path to XML file>"

这会将当前登录用户的格式设置为“英语(美国)”。尽管文章是关于Windows Vista的,但在Windows 7中也适用。

修改十进制符号,我们需要在这个XML文件中添加什么? - hamid
我更新了源链接。有一个选项<gs:sDecimal>,但我没有让它工作... - Torben Kohlmeier

0

我认为你的思路与你需要的相反。通常应用程序可能需要帮助/尊重/满足用户的操作系统设置,而不是为了应用程序的方便而更改这些设置。请查看以下与您类似的问题的帖子:如何更改Windows用户的区域设置/日期格式?


谢谢您的回复。我也找到了一个类似的帖子在这里。看起来修改注册表是唯一的可能性。 - Pooven

0
这是一个语言本地化问题,其中像DateTimePicker这样的控件只能使用Windows>区域和语言设置。
真是太过分了。认真想想你在做什么;我启动你的程序,你重新配置我的整个计算机来使一个小的UI元素工作?最好不要问或告诉我?
这是违法的 - 这可以被视为未经授权的计算机操纵。
使用适当的控件和正确的编程方式;但不要在那个层面上进行破坏行为。

很抱歉你对此感到如此强烈。我已更新我的帖子以提供更好的上下文:最终,这种行为将是最终用户预期的结果。 - Pooven
同意。话说,你有一款非常不寻常的软件,所以……请原谅我没有意识到这一点。 - TomTom
我明白了,我没有清楚地定义我的情况以便寻求建议。人总是要不断学习的 :) - Pooven
2
这是一个极其没有帮助的回答。虽然最初的问题可能表述不清,但自动更改Windows区域设置的一般问题仍然很有趣,并且应该得到适当(如果有资格)的回答。可以公正地观察到,以不想要的方式进行此操作会让用户感到沮丧,但是开发日期处理实用程序是完全合理的。在我的情况下,我想更改设置以在不同(真实的)文化设置下启用自动化测试 - 这里的答案仍将为我服务。 - user1164178

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接