本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

CultureInfo.CurrentCulture 属性

 

获取表示当前线程使用的区域性的 CultureInfo 对象。

命名空间:   System.Globalization
程序集:  mscorlib(位于 mscorlib.dll)

public static CultureInfo CurrentCulture { get; set; }

属性值

Type: System.Globalization.CultureInfo

表示当前线程使用的区域性的对象。

Exception Condition
ArgumentNullException

属性设置为 null

CultureInfo此属性返回的对象及其关联的对象确定的日期的默认格式、 时间、 数字、 货币值,排序顺序的文本、 大小写约定,和的字符串比较。

当前的区域性是执行线程,返回的静态属性Thread.CurrentThread属性。CultureInfo.CurrentCulture属性的值对应Thread.CurrentCulture属性。 检索的值的CultureInfo.CurrentCulture属性等效于检索CultureInfo返回对象Thread.CurrentThread.CurrentCulture属性。 从开始.NET Framework 4.6,设置的值CultureInfo.CurrentCulture属性也会更改当前线程区域性。

System_CAPS_note说明

在.NET Framework 4.5.2 及早期版本中,CurrentCulture属性是只读的; 也就是说,你可以检索属性值,但不能将其设置。 若要更改当前区域性,则分配CultureInfo对象,表示新区域性Thread.CurrentThread.CurrentCulture属性。 从开始.NET Framework 4.6、CurrentCulture属性为读写; 你可以设置和检索属性的值。 如果属性值设置CultureInfo表示该新区域性中的值的对象Thread.CurrentThread.CurrentCulture属性也会更改。

本节内容:

如何确定线程的区域性
获取当前区域性
显式设置 CurrentCulture 属性
当前区域性和用户重写
区域性和 Windows 应用

线程启动时,其区域性最初,如下所示确定︰

  • 通过检索由指定的区域性DefaultThreadCurrentCulture线程正在其中执行,如果属性值不是应用程序域中的属性null

  • 如果线程正在执行的基于任务的异步操作和应用面向一个线程池线程.NET Framework 4.6或更高版本的.NET Framework 中,其区域性由调用线程的区域性。 下面的示例将当前区域性更改为葡萄牙语 (巴西),并启动六项任务,其中每个显示其线程 ID、 任务 ID、 和其当前区域性。 每个任务 (和线程) 已继承调用线程的区域性。

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Runtime.Versioning;
    using System.Threading;
    using System.Threading.Tasks;
    
    [assembly:TargetFramework(".NETFramework,Version=v4.6")]
    
    public class Example
    {
       public static void Main()
       {
          var tasks = new List<Task>();
          Console.WriteLine("The current culture is {0}", 
                            Thread.CurrentThread.CurrentCulture.Name);
          Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
          // Change the current culture to Portuguese (Brazil).
          Console.WriteLine("Current culture changed to {0}",
                            Thread.CurrentThread.CurrentCulture.Name);
          Console.WriteLine("Application thread is thread {0}",
                            Thread.CurrentThread.ManagedThreadId);
          // Launch six tasks and display their current culture.
          for (int ctr = 0; ctr <= 5; ctr++)
             tasks.Add(Task.Run( () => {
                                   Console.WriteLine("Culture of task {0} on thread {1} is {2}",
                                                     Task.CurrentId, 
                                                     Thread.CurrentThread.ManagedThreadId,
                                                     Thread.CurrentThread.CurrentCulture.Name);
                                } ));                     
    
          Task.WaitAll(tasks.ToArray());
       }
    }
    // The example displays output like the following:
    //     The current culture is en-US
    //     Current culture changed to pt-BR
    //     Application thread is thread 9
    //     Culture of task 2 on thread 11 is pt-BR
    //     Culture of task 1 on thread 10 is pt-BR
    //     Culture of task 3 on thread 11 is pt-BR
    //     Culture of task 5 on thread 11 is pt-BR
    //     Culture of task 6 on thread 11 is pt-BR
    //     Culture of task 4 on thread 10 is pt-BR
    

    有关详细信息,请参阅中的"区域性和基于任务的异步操作"部分CultureInfo主题。

  • 通过调用 WindowsGetUserDefaultLocaleName函数。

请注意,是否你设置特定区域性之外的系统安装的区域性或用户的首选的区域性,并且你的应用程序启动多个线程,这些线程的当前区域性将通过返回的区域性GetUserDefaultLocaleName函数,除非你为其分配区域性DefaultThreadCurrentCulture线程正在执行的应用程序域的属性。

有关如何确定线程的区域性的详细信息,请参阅中的"区域性和线程"部分CultureInfo引用页。

CultureInfo.CurrentCulture 属性是在每个线程设置; 也就是说,每个线程可以具有它自己的区域性。 通过检索的值的获取当前线程的区域性CultureInfo.CurrentCulture属性,如下面的示例演示。

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo culture = CultureInfo.CurrentCulture;
      Console.WriteLine("The current culture is {0} [{1}]",
                        culture.NativeName, culture.Name);
   }
}
// The example displays output like the following:
//       The current culture is English (United States) [en-US]

您还可以检索的值从当前线程的区域性Thread.CurrentThread属性。

着手.NET Framework 4.6,若要更改的现有线程,使用的区域性设置CultureInfo.CurrentCulture为新的区域性属性。 如果你显式更改这种方式,更改线程的区域性仍然存在,如果线程跨越应用程序域边界。 下面的示例将当前的线程区域性更改为荷兰语 (荷兰)。 它还显示,当当前线程跨越应用程序域边界,其当前区域性保持已更改。

using System;
using System.Globalization;
using System.Threading;

public class Info : MarshalByRefObject
{
   public void ShowCurrentCulture()
   {
      Console.WriteLine("Culture of {0} in application domain {1}: {2}",
                        Thread.CurrentThread.Name,
                        AppDomain.CurrentDomain.FriendlyName,
                        CultureInfo.CurrentCulture.Name);
   }
}

public class Example
{
   public static void Main()
   {
      Info inf = new Info();
      // Set the current culture to Dutch (Netherlands).
      Thread.CurrentThread.Name = "MainThread";
      CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
      inf.ShowCurrentCulture();

      // Create a new application domain.
       AppDomain ad = AppDomain.CreateDomain("Domain2");
       Info inf2 = (Info) ad.CreateInstanceAndUnwrap(typeof(Info).Assembly.FullName, "Info");
       inf2.ShowCurrentCulture();                       
   }
}
// The example displays the following output:
//       Culture of MainThread in application domain ChangeCulture1.exe: nl-NL
//       Culture of MainThread in application domain Domain2: nl-NL
System_CAPS_note说明

通过更改区域性CultureInfo.CurrentCulture属性需要SecurityPermission具有权限ControlThread值设置。 由于与线程关联的安全状态,对线程进行操作很危险。 因此,仅对可信的代码,并且仅在必要的时候,则应授予此权限。 无法更改在不完全受信任的代码中的线程区域性。

从开始.NET Framework 4,你可以将当前线程区域性显式更改为特定区域性 (如法语 (加拿大)) 或非特定区域性 (如法语)。CultureInfo对象表示非特定区域性的值CultureInfo属性,如CalendarCompareInfoDateTimeFormatNumberFormat,和TextInfo反映与非特定区域性关联的特定区域性。 例如,英语的非特定区域性基准区域性为英语 (美国);德语区域性的基准区域性为德语 (德国)。 下面的示例演示了差异在格式设置时的当前区域性设置为特定区域性、 法语 (加拿大) 和非特定区域性,法语。

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      double value = 1634.92;
      CultureInfo.CurrentCulture = new CultureInfo("fr-CA");
      Console.WriteLine("Current Culture: {0}", 
                        CultureInfo.CurrentCulture.Name);
      Console.WriteLine("{0:C2}\n", value);

      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
      Console.WriteLine("Current Culture: {0}", 
                        CultureInfo.CurrentCulture.Name);
      Console.WriteLine("{0:C2}", value);
   }
}
// The example displays the following output:
//       Current Culture: fr-CA
//       1 634,92 $
//       
//       Current Culture: fr
//       1 634,92 €

你还可以使用CultureInfo.CurrentCulture属性连同HttpRequest.UserLanguages属性来设置CurrentCulture的 ASP.NET 应用程序向用户的属性的首选区域性,如下面的示例所示。

CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);

Windows 允许用户重写的标准属性值CultureInfo对象和其关联的对象,通过使用区域和语言选项控制面板中。 CultureInfo返回对象CurrentCulture属性反映这些用户替代在以下情况︰

  • 如果当前线程区域性由 Windows 隐式设置GetUserDefaultLocaleName函数。

  • 如果当前线程区域性定义DefaultThreadCurrentCulture属性对应于当前的 Windows 系统区域性。

  • 如果当前线程区域性将显式设置为返回的区域性CreateSpecificCulture方法,并且区域性都对应于当前的 Windows 系统区域性。

  • 如果当前线程区域性将显式设置为通过实例化区域性CultureInfo(String)构造函数,并且区域性对应于当前的 Windows 系统区域性。

在某些情况下,特别是对于服务器应用程序,将当前区域性设置为CultureInfo反映用户替代的对象可能不是很理想。 相反,你可以将当前线程区域性设置为CultureInfo对象不会反映用户在通过以下方式中重写︰

在 Windows 应用中,CurrentCulture属性是只读的。 可以通过使用 Windows 中设置的当前区域性ResourceContext.Languages属性。 下面的示例使用它来更改应用程序的当前区域性为英语 (美国) 或如果当前区域性已为英语 (美国),为法语 (法国)。CurrentCultureCurrentUICulture属性将显示到TextBlock控件名为block 如示例输出所示,当前区域性更改时ResourceContext.Languages属性更改。


ResourceContext context = ResourceManager.Current.DefaultContext;
var list = new List<String>();
if (CultureInfo.CurrentCulture.Name == "en-US")
   list.Add("fr-FR");
else
   list.Add("en-US");

context.Languages = list;
block.Text += String.Format("\nThe current culture is {0}\n",
                            CultureInfo.CurrentCulture);
block.Text += String.Format("The current culture UI is {0}\n",
                            CultureInfo.CurrentUICulture);
// The example displays output like the following if run on a system
// whose current culture is English (United States):
// The current culture is fr-FR
// The current UI culture is fr-FR   


Dim context As ResourceContext = ResourceManager.Current.DefaultContext
Dim list As New List(Of String)()
If CultureInfo.CurrentCulture.Name = "en-US" Then
   list.Add("fr-FR")
Else
   list.Add("en-US")
End If
context.Languages = list
block.Text += String.Format("{1}The current culture is {0}{1}",
                            CultureInfo.CurrentCulture, vbCrLf)
block.Text += String.Format("The current culture UI is {0}\n",
                            CultureInfo.CurrentUICulture)
' The example displays output Like the following if run on a system
' whose current culture Is English (United States):
'    The current culture Is fr-FR
'    The current UI culture Is fr-FR   

下面的代码示例演示如何更改CurrentCultureCurrentUICulture当前线程。

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()  
   {
      // Display the name of the current thread culture.
      Console.WriteLine("CurrentCulture is {0}.", CultureInfo.CurrentCulture.Name);

      // Change the current culture to th-TH.
      CultureInfo.CurrentCulture = new CultureInfo("th-TH", false);
      Console.WriteLine("CurrentCulture is now {0}.", CultureInfo.CurrentCulture.Name);

      // Display the name of the current UI culture.
      Console.WriteLine("CurrentUICulture is {0}.", CultureInfo.CurrentUICulture.Name);

      // Change the current UI culture to ja-JP.
      CultureInfo.CurrentUICulture = new CultureInfo( "ja-JP", false );
      Console.WriteLine("CurrentUICulture is now {0}.", CultureInfo.CurrentUICulture.Name);
   }
}
// The example displays the following output:
//       CurrentCulture is en-US.
//       CurrentCulture is now th-TH.
//       CurrentUICulture is en-US.
//       CurrentUICulture is now ja-JP.

SecurityPermission

for setting the current culture. Associated enumeration: F:System.Security.Permissions.SecurityPermissionFlag.ControlThread

通用 Windows 平台
自 8 起可用
.NET Framework
自 1.1 起可用
可移植类库
可移植 .NET 平台 中受支持
Silverlight
自 2.0 起可用
Windows Phone Silverlight
自 7.0 起可用
Windows Phone
自 8.1 起可用
返回页首
显示: