4

我们的应用程序允许用户更改他们运行它的文化,并且该文化可以不同于底层的操作系统文化。我发现这样做的唯一方法是为每个线程设置 Thread.CurrentThread.CurrentCulture 和 Thread.CurrentThread.CurrentUICulture。

唯一的问题是我们必须为每个线程设置文化,并且我们需要记住在创建新线程时这样做。如果您将线程设置为另一种文化,然后创建一个新线程,它将获得操作系统的文化,而不是创建它的线程的文化。

我想找到一种更好的方法来做到这一点。我只能想到两件事,但我不知道是否有可能。

  1. 在应用程序级别设置文化,以便所有线程默认为该文化。这可能吗?
  2. 我可以订阅的任何地方都有线程创建事件吗?这样我可以设置一个处理程序来设置线程创建的文化。

任何想法或帮助都会受到欢迎,即使我需要 PInvoke 到 Win32 API。提前致谢。

编辑:我发现这个问题很相似,但没有找到答案。

4

4 回答 4

1

可能不是确切的解决方案,但是创建一个负责创建线程的类怎么样?

class MyThreadFactory
{
    public static Thread getThread()
    {
        Thread a = new Thread(..);
        a.CurrentCulture = xxxx;
        return a;
    }
}

用法:

Thread newThread = MyThreadFactory.getThread();
于 2008-12-24T16:46:20.567 回答
1
  1. 您可以将所有文化逻辑和静态资源文件放在 UI/Presentation 层中,而只需担心 UI 线程的文化(假设此处为桌面应用程序)。这将包括资源文件中的任何翻译、任何特定于文化的格式等。
  2. 如果第一个想法无法实现,您可以创建一个线程助手类,在创建长时间运行的线程时为您设置文化。您还需要设置所有线程池线程的区域性。

文化是 Windows 中特定于线程的概念,Windows 中的线程实际上与进程或应用程序域无关。线程和保存文化信息(我知道)的操作系统之间没有抽象级别,因此您必须在每个线程上设置它。

于 2008-12-24T16:46:57.477 回答
1

.NET 4.5 中的 CultureInfo 类中添加了两个新属性来解决此问题,即DefaultThreadCurrentCultureDefaultThreadCurrentUICulture

现在您可以设置这两个属性,所有新线程都将设置为默认文化而不是系统文化。这些属性还将为所有没有明确设置其文化的现有线程设置文化。

于 2014-05-01T02:52:42.833 回答
0

只是为了添加到@Rob Prouse 的答案。这是一个快速演示。

  1. 设置应用程序初始化的文化:

      if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$")
      {
           CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
           customCulture.NumberFormat.CurrencySymbol = "N$";
    
           CultureInfo.DefaultThreadCurrentCulture = customCulture;
           CultureInfo.DefaultThreadCurrentUICulture = customCulture;
       }
    
  2. 在我的 .ToString() 上使用文化信息。

     .ToString("C", CultureInfo.DefaultThreadCurrentCulture)
    
于 2018-05-02T07:45:17.737 回答