【问题标题】:Changing the 'Region and Language' OS setting programmatically以编程方式更改“区域和语言”操作系统设置
【发布时间】:2012-03-02 08:46:49
【问题描述】:

我希望能够从 C# 程序更改操作系统 (Windows 7) 的 区域和语言 设置。我并不反对执行命令行命令,但我只知道如何启动 Region and Language 对话框:control /name Microsoft.RegionAndLanguage

这是一个语言本地化问题,其中Controls 和DateTimePicker 一样只能使用Windows 区域和语言 设置(请参阅此处了解details);然而,更新操作系统以符合应用程序的语言设置超出了此范围,最终成为预期目标。

我们将不胜感激建议和/或解决方法。

【问题讨论】:

  • 我认为您不应该更改系统的语言设置。最好的办法是创建一个新的、可本地化的DateTimePicker 控件,或者搜索现成的控件。
  • 只是猜测,为日期选择器控件设置自定义格式不能解决您的目的吗?
  • @V4Vendetta 不行,自定义格式不够用,他可能要更改其他设置,比如一周的第一天等。
  • 我正在开发的软件有效地替代了桌面;更改软件中的语言应该可以无缝更新操作系统——这只能从软件内部访问。所以在这种情况下,操作系统符合标准是理想的。我还考虑使用DateTimePicker 的替代品(这有点不受欢迎),但在回复时我意识到更改操作系统语言很重要。我会相应地更新我原来的帖子。

标签: c# localization datetimepicker


【解决方案1】:

我设法实施的唯一解决方案是修改注册表。在 Windows 7 中,更改语言时,会在子项中的注册表中添加一个新条目:HKEY_CURRENT_USER\Control Panel\Desktop。该键将包含 REG_MULTI_SZ 类型的条目 PreferredUILanguagesPending,其值将确定 UI 语言。要应用更改,当前用户需要注销并再次登录。这可以使用以下代码完成:

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
string[] lang = {"en-ZA"};
key.SetValue("PreferredUILanguagesPending", lang, RegistryValueKind.MultiString);

语言包需要安装才能设置。如需语言包列表,请查看herehere。当安装超过 1 个语言包时,Control Panel > Region and Language > Keyboards and Languages > Display language 中将出现更改 UI 语言的选项。

【讨论】:

    【解决方案2】:

    听起来好像更改应用程序的文化/UICulture 就足够了

    例如

    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
    

    【讨论】:

    • 不这么认为,微软在提供的链接中说:出现这种行为是因为 DateTimePicker 控件和 MonthCalendar 控件是 Microsoft Windows 常用控件。因此,操作系统的用户区域设置决定了这些控件的用户界面。
    • 我已更正并同意您对 OPS 问题的评论,构建一个新控件
    【解决方案3】:

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

    所有系统控件和系统对话框(如 OpenFileDialogPrintDialog 等)都会遇到同样的问题,它们在 .NET 中无法本地化。

    但仔细想想,为什么要改变应用程序的文化?用户可以通过控制面板自行更改其区域和语言设置,为什么您的应用程序要覆盖这些设置?

    【讨论】:

    • 我们只在一个表单中使用DateTimePicker;我认为我们公司不会批准购买新软件来实现这一目标。然而,我意识到我的目标超出了DateTimePicker。感谢您的回复。
    【解决方案4】:

    我在这里找到了解决方案: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>"
    

    这会将当前登录用户的格式设置为English (United States)

    虽然这篇文章是关于 Windows Vista 的,但这也适用于 Windows 7。

    【讨论】:

    • 更改十进制符号,我们必须在这个 XML 中添加什么?
    • 我更新了源链接。有一个选项&lt;gs:sDecimal&gt;,但我没有让它工作......
    【解决方案5】:

    我认为,您的想法与您的需要相反。通常,应用程序可能需要帮助/尊重/满足用户操作系统设置,而不是为了应用程序的方便而更改它们。查看与您的问题类似的帖子:How can I change a Windows user's regional settings/date format?

    【讨论】:

    • 感谢您的回复。我还发现了一个类似的帖子here。看来修改注册表是唯一的可能了。
    【解决方案6】:

    这是一个语言本地化问题,像 DateTimePicker 这样的控件只能使用 Windows >区域和语言设置

    坚果。严重地。想想你在这里做什么;我启动你的程序,你重新配置我的整个计算机以使一个小的 UI 元素工作?最好不问也不告诉我?

    法律禁止这样做 - 这可以被视为对计算机的未经授权的操作。

    使用适当的控制和适当的程序;但不要在该级别进行破坏。

    【讨论】:

    • 很抱歉您对此有如此强烈的感觉。我更新了我的帖子以提供更好的上下文:最终,这种行为将是最终用户的预期结果。
    • 同意。那就是说我有一个非常常见的软件,所以......请耐心等待,这并不明显。
    • 我明白了;我没有很好地定义我的情况来寻求建议。我们生活,我们学习:)
    • 这是一个非常无益的回应。虽然最初的问题可能没有很好地构建,但自动更改 Windows 区域设置的一般问题仍然值得关注,并且值得适当(如果合格)响应。公平地观察到以不受欢迎的方式执行此操作会使用户感到不安,但是,开发日期处理实用程序是完全合理的。就我而言,我想更改设置以在不同(真正的)文化设置下启用自动化测试 - 这里的答案仍然对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多