在不更改 Windows 区域设置的情况下更改应用程序的区域设置

Posted

技术标签:

【中文标题】在不更改 Windows 区域设置的情况下更改应用程序的区域设置【英文标题】:Changing an application's locale without changing the Windows locale 【发布时间】:2013-08-23 21:14:43 【问题描述】:

我遇到了一个有趣的情况,语言环境设置与我的 C# 应用程序混淆了,因为我没有意识到 Double.Parse 之类的方法不会将“1000”转换为 1000,但由于编号格式不同,会做一些意想不到的事情.

我的问题的一个解决方案是使用double d = double.parse( "1000", new CultureInfo("en-US")); 之类的东西。目前,我没有通过 CultureInfo。但是,我不必在整个代码中进行此更改,而是想知道是否有可能在启动时影响只是我的应用程序的语言环境。

我找到了一个article on MSDN,它说我可以使用以下代码实现此目的:

using System.Threading;
using System.Globalization;
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

但它并没有说明从主线程产生的工作线程是否也会继承父级的文化。

我认为情况并非如此,因为在 .NET 4.5 中显然有一个 new CultureInfo.DefaultThreadCurrentCulture 属性指定应用程序域中所有线程的区域性,但没有任何内容像这样在 .NET 4.0 中。

任何人都可以为这个语言环境问题推荐一个好的解决方案吗?

【问题讨论】:

【参考方案1】:

如果新线程不使用相同的语言环境,您可以这样启动它们:

Thread theNewThread = new Thread(() =>

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

    //Make something else
);
theNewThread.Start();

或以其他方式;

public static void Start(this Thread thread, CultureInfo cu)

    //Set the CU here..

    thread.Start();

没试过,但我想它可以工作

【讨论】:

【参考方案2】:

我最终只是尝试了一下。在 .NET 4.0 中,新线程继承创建它们的线程的语言环境。我确实按照 MSDN 文档设置了 CurrentCultureCurrentUICulture,昨天所有的测试都通过了,这是一件好事。

【讨论】:

所以从你的句子中可以看出,在线程上设置区域设置是否适用于 .NET 4.0? 嗯.. 我认为这很清楚。 :) 是的,在 .NET 4.0 的线程上设置语言环境是可行的。【参考方案3】:

您可能必须像 FelipeP 建议的那样在 .NET 4.0 上手动设置它们,因为新的将始终以系统默认区域性开头(请参阅此处Set default thread culture for all thread? 的详细信息)

【讨论】:

是的,我已经确认并实施了修复,谢谢!

以上是关于在不更改 Windows 区域设置的情况下更改应用程序的区域设置的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 localectl 的情况下更改 CentOS/RHEL 中的系统区域设置?

Eclipse 的包资源管理器背景颜色遵循 windows 主题。我想在不更改 Windows 主题的情况下更改颜色。可能的?

在不安装 Gnome 的情况下更改 Gnome 首选应用程序? [关闭]

如何在不更改用户设置的缩放比例的情况下更新地图标记?

在不影响导航栏的情况下更改 NavigationController 的内容视图宽度

如何在不更改字体本身的情况下更改 uilabel 的字体大小?