CultureInfo.CurrentCulture Właściwość

Definicja

Pobiera lub ustawia CultureInfo obiekt reprezentujący kulturę używaną przez bieżący wątek i operacje asynchroniczne oparte na zadaniach.

public:
 static property System::Globalization::CultureInfo ^ CurrentCulture { System::Globalization::CultureInfo ^ get(); void set(System::Globalization::CultureInfo ^ value); };
public:
 static property System::Globalization::CultureInfo ^ CurrentCulture { System::Globalization::CultureInfo ^ get(); };
public static System.Globalization.CultureInfo CurrentCulture { get; set; }
public static System.Globalization.CultureInfo CurrentCulture { get; }
static member CurrentCulture : System.Globalization.CultureInfo with get, set
static member CurrentCulture : System.Globalization.CultureInfo
Public Shared Property CurrentCulture As CultureInfo
Public Shared ReadOnly Property CurrentCulture As CultureInfo

Wartość właściwości

Kultura używana przez bieżący wątek i operacje asynchroniczne oparte na zadaniach.

Wyjątki

Właściwość jest ustawiona na null.

Przykłady

W poniższym przykładzie pokazano, jak zmienić CurrentCulture element i CurrentUICulture bieżącego wątku.

using System;
using System.Globalization;

public class Example0
{
   public static void Main()
   {
      // Display the name of the current 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.
Imports System.Globalization
Imports System.Threading

Public Module Example2
   Public Sub Run()
      ' Display the name of the current 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)
   End Sub
End Module
' The example displays the following output:
'       CurrentCulture is en-US.
'       CurrentCulture is now th-TH.
'       CurrentUICulture is en-US.
'       CurrentUICulture is now ja-JP.

Uwagi

Obiekt CultureInfo zwracany przez właściwość CurrentCulture i skojarzone z nim obiekty określa domyślny format dat, godzin, liczb i walut, kolejności sortowania tekstu, konwencji wielkości liter i porównań ciągów.

Bieżąca kultura jest właściwością wykonywanego wątku. Po ustawieniu tej właściwości na obiekt CultureInfo reprezentujący nową kulturę wartość właściwości Thread.CurrentThread.CurrentCulture również się zmienia. Zalecamy jednak, aby zawsze używać właściwości CultureInfo.CurrentCulture do pobierania i ustawiania bieżącej kultury.

Obiekt CultureInfo zwracany przez tę właściwość jest tylko do odczytu. Oznacza to, że nie można modyfikować istniejącego obiektu, na przykład zmieniając DateTimeFormat. Aby zmienić format daty i godziny lub inny aspekt bieżącej kultury, utwórz nowy obiekt CultureInfo i przypisz go do właściwości.

Jak jest ustalana kultura wątku

Po uruchomieniu wątku jego kultura jest początkowo określana w następujący sposób:

  • Przez pobranie kultury określonej przez właściwość DefaultThreadCurrentCulture w domenie aplikacji, w której jest wykonywany wątek, jeśli wartość właściwości nie jest null.

  • Jeśli wątek jest wątkiem puli wątków, który wykonuje asynchroniczną operację opartą na zadaniach, jego ustawienia kulturowe są określane przez ustawienia kulturowe wątku wywołującego. Poniższy przykład zmienia bieżącą kulturę na portugalski (Brazylia) i uruchamia sześć zadań, z których każdy wyświetla identyfikator wątku, identyfikator zadania i bieżącą kulturę. Każde z zadań (i wątków) odziedziczyło kontekst kulturowy wątku wywołującego.

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Threading;
    using System.Threading.Tasks;
    
    public class Example14
    {
        public static async Task Main()
        {
            var tasks = new List<Task>();
            Console.WriteLine($"The current culture is {Thread.CurrentThread.CurrentCulture.Name}");
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
            // Change the current culture to Portuguese (Brazil).
            Console.WriteLine($"Current culture changed to {Thread.CurrentThread.CurrentCulture.Name}");
            Console.WriteLine($"Application thread is thread {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 {Task.CurrentId} on thread {Thread.CurrentThread.ManagedThreadId} is {Thread.CurrentThread.CurrentCulture.Name}");
                }));
    
            await Task.WhenAll(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
    
    Imports System.Globalization
    Imports System.Threading
    
    Module Example1
        Public Sub S1()
            Dim tasks As New List(Of 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 ctr As Integer = 0 To 5
                tasks.Add(Task.Run(Sub()
                                       Console.WriteLine("Culture of task {0} on thread {1} is {2}",
                                                     Task.CurrentId,
                                                     Thread.CurrentThread.ManagedThreadId,
                                                     Thread.CurrentThread.CurrentCulture.Name)
                                   End Sub))
            Next
            Task.WaitAll(tasks.ToArray())
        End Sub
    End Module
    ' 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
    

    Aby uzyskać więcej informacji, zobacz Kultura i asynchroniczne operacje oparte na zadaniach.

  • Wywołując funkcję GetUserDefaultLocaleName w systemie Windows lub funkcję uloc_getDefault z ICU, która obecnie wywołuje funkcję POSIX setlocale z kategorii LC_MESSAGES, w systemach typu Unix.

Należy pamiętać, że jeśli ustawisz określoną kulturę inną niż kultura zainstalowana przez system lub preferowaną kulturę użytkownika, a aplikacja uruchamia wiele wątków, bieżąca kultura tych wątków będzie kulturą zwracaną przez funkcję GetUserDefaultLocaleName, chyba że zostanie przypisana kultura do właściwości DefaultThreadCurrentCulture w domenie aplikacji, w której jest wykonywany wątek.

Aby uzyskać więcej informacji na temat sposobu określania kultury wątku, zobacz sekcję "Kultura i wątki" na stronie referencyjnej CultureInfo.

Pobierz bieżącą kulturę

Właściwość CultureInfo.CurrentCulture jest ustawieniem dla każdego wątku; oznacza to, że każdy wątek może mieć własną kulturę. Kulturę bieżącego wątku można uzyskać, pobierając wartość właściwości CultureInfo.CurrentCulture, jak pokazano w poniższym przykładzie.

using System;
using System.Globalization;

public class Example5
{
   public static void Main()
   {
      CultureInfo culture = CultureInfo.CurrentCulture;
      Console.WriteLine($"The current culture is {culture.NativeName} [{culture.Name}]");
   }
}

// The example displays output like the following:
//       The current culture is English (United States) [en-US]
Imports System.Globalization

Module Example3
    Public Sub S1()
        Dim culture As CultureInfo = CultureInfo.CurrentCulture
        Console.WriteLine("The current culture is {0} [{1}]",
                        culture.NativeName, culture.Name)
    End Sub
End Module
' The example displays output like the following:
'     The current culture is English (United States) [en-US]

Jawne ustawianie właściwości CurrentCulture

Aby zmienić kulturę używaną przez istniejący wątek, należy ustawić właściwość CultureInfo.CurrentCulture na nową kulturę. Poniższy przykład zmienia bieżącą kulturę wątku na holenderską (Holandia).

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

public class Info11 : MarshalByRefObject
{
    public void ShowCurrentCulture()
    {
        Console.WriteLine($"Culture of thread {Thread.CurrentThread.Name}: {CultureInfo.CurrentCulture.Name}");
    }
}

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

// The example displays the following output:
//
//     Culture of thread MainThread: nl-NL

Note

Zmiana kultury przy użyciu właściwości CultureInfo.CurrentCulture wymaga uprawnienia SecurityPermission z zestawem wartości ControlThread. Manipulowanie wątkami jest niebezpieczne ze względu na stan zabezpieczeń skojarzony z wątkami. W związku z tym to uprawnienie powinno być przyznane tylko wiarygodnemu kodowi i tylko w razie potrzeby. Nie można zmienić kultury wątków w częściowo zaufanym kodzie.

Możesz jawnie zmienić bieżącą kulturę wątku na określoną kulturę (taką jak Francuska (Kanada)) lub neutralną kulturę (np. francuską). Gdy obiekt CultureInfo reprezentuje neutralną kulturę, wartości właściwości CultureInfo, takich jak Calendar, CompareInfo, DateTimeFormat, NumberFormati TextInfo odzwierciedlają określoną kulturę skojarzona z kulturą neutralną. Na przykład dominującą kulturą angielskiej kultury neutralnej jest angielski (Stany Zjednoczone); dominującą kulturą dla kultury niemieckiej jest niemiecki (Niemcy). Poniższy przykład ilustruje różnicę w formatowaniu, gdy bieżąca kultura jest ustawiona na określoną kulturę, francuski (Kanada), oraz na kulturę neutralną, francuski.

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

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

      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
      Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");
      Console.WriteLine($"{value:C2}");
   }
}

// The example displays the following output:
//       Current Culture: fr-CA
//       1 634,92 $
//
//       Current Culture: fr
//       1 634,92 €
Imports System.Globalization
Imports System.Threading

Module Example4
    Public Sub S1()
        Dim value As Double = 1634.92
        CultureInfo.CurrentCulture = New CultureInfo("fr-CA")
        Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name)
        Console.WriteLine("{0:C2}", value)
        Console.WriteLine()

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

Bieżąca kultura i nadpisania użytkownika

System Windows umożliwia użytkownikom zastępowanie standardowych wartości właściwości obiektu CultureInfo i skojarzonych z nim obiektów przy użyciu Opcje regionalne i językowe w Panelu sterowania. Obiekt CultureInfo zwracany przez właściwość CurrentCulture odzwierciedla te nadpisania użytkownika w następujących przypadkach:

  • Jeśli bieżąca kultura wątku jest ustawiana niejawnie przez funkcję GetUserDefaultLocaleName systemu Windows.
  • Jeśli bieżąca kultura wątku zdefiniowana przez właściwość DefaultThreadCurrentCulture odpowiada bieżącej kulturze systemu Windows.
  • Jeśli bieżąca kultura wątku jest ustawiona jawnie na kulturę zwracaną przez metodę CreateSpecificCulture, a ta kultura odpowiada bieżącej kulturze systemu Windows.
  • Jeśli bieżąca kultura wątków jest ustawiona jawnie na kulturę utworzoną przez konstruktor CultureInfo(String), a kultura ta odpowiada bieżącej kulturze systemu Windows.

W niektórych przypadkach, zwłaszcza dla aplikacji serwerowych, ustawienie bieżącej kultury na obiekt CultureInfo, który uwzględnia zmiany wprowadzone przez użytkownika, może być niewskazane. Zamiast tego można ustawić bieżącą kulturę na obiekt CultureInfo, który nie uwzględnia modyfikacji użytkownika w następujący sposób:

Dotyczy

Zobacz też