System.Globalization.CultureInfo.CurrentCulture-Eigenschaft

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Das CultureInfo von der CurrentCulture Eigenschaft und den zugehörigen Objekten zurückgegebene Objekt bestimmt das Standardformat für Datums-, Uhrzeit-, Zahlen- und Währungswerte, die Sortierreihenfolge von Text, Groß-/Kleinschreibungskonventionen und Zeichenfolgenvergleiche.

Die aktuelle Kultur ist eine Eigenschaft des ausgeführten Threads. Wenn Sie diese Eigenschaft auf ein CultureInfo Objekt festlegen, das eine neue Kultur darstellt, ändert sich auch der Wert der Thread.CurrentThread.CurrentCulture Eigenschaft. Es wird jedoch empfohlen, die Eigenschaft immer zum Abrufen und Festlegen der aktuellen Kultur zu verwenden CultureInfo.CurrentCulture .

Das CultureInfo von dieser Eigenschaft zurückgegebene Objekt ist schreibgeschützt. Dies bedeutet, dass Sie das vorhandene Objekt nicht stummschalten können, z. B. durch Ändern des DateTimeFormatObjekts. Wenn Sie das Datums-/Uhrzeitformat oder einen anderen Aspekt der aktuellen Kultur ändern möchten, erstellen Sie ein neues CultureInfo Objekt, und weisen Sie es der Eigenschaft zu.

Wie die Kultur eines Threads bestimmt wird

Wenn ein Thread gestartet wird, wird seine Kultur zunächst wie folgt bestimmt:

  • Durch Abrufen der Kultur, die von der Eigenschaft in der DefaultThreadCurrentCulture Anwendung angegeben wird Standard in der der Thread ausgeführt wird, wenn der Eigenschaftswert nicht nullist.

  • Wenn der Thread ein Threadpoolthread ist, der einen aufgabenbasierten asynchronen Vorgang ausführt, wird seine Kultur durch die Kultur des aufrufenden Threads bestimmt. Im folgenden Beispiel wird die aktuelle Kultur in Portugiesisch (Brasilien) geändert und sechs Aufgaben gestartet, von denen jede die Thread-ID, die Aufgaben-ID und die aktuelle Kultur anzeigt. Jede der Aufgaben (und die Threads) hat die Kultur des aufrufenden Threads geerbt.

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Runtime.Versioning;
    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 {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);
                }));
    
            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
    

    Weitere Informationen finden Sie unter Kultur- und aufgabenbasierte asynchrone Vorgänge.

  • Durch Aufrufen der GetUserDefaultLocaleName Funktion unter Windows oder der uloc_getDefault Funktion von ICU, die derzeit die POSIX-Funktion setlocale mit Kategorie LC_MESSAGESaufruft, auf Unix-ähnlichen Systemen.

Wenn Sie eine bestimmte Kultur festlegen, die sich von der vom System installierten Kultur oder der bevorzugten Kultur des Benutzers unterscheidet, und Ihre Anwendung mehrere Threads startet, ist die aktuelle Kultur dieser Threads die Kultur, die von der GetUserDefaultLocaleName Funktion zurückgegeben wird, es sei denn, Sie weisen der Eigenschaft in der DefaultThreadCurrentCulture Anwendung eine Kultur zu Standard in der der Thread ausgeführt wird.

Weitere Informationen dazu, wie die Kultur eines Threads bestimmt wird, finden Sie im Abschnitt "Kultur und Threads" auf der CultureInfo Referenzseite.

Abrufen der aktuellen Kultur

Die CultureInfo.CurrentCulture Eigenschaft ist eine Einstellung pro Thread, d. h. jeder Thread kann über eine eigene Kultur verfügen. Sie erhalten die Kultur des aktuellen Threads, indem Sie den Wert der CultureInfo.CurrentCulture Eigenschaft abrufen, wie das folgende Beispiel veranschaulicht.

using System;
using System.Globalization;

public class Example5
{
   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]
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]

Festlegen der CurrentCulture-Eigenschaft explizit

Um die Kultur zu ändern, die von einem vorhandenen Thread verwendet wird, legen Sie die CultureInfo.CurrentCulture Eigenschaft auf die neue Kultur fest. Wenn Sie die Kultur eines Threads auf diese Weise explizit ändern, wird diese Änderung beibehalten, wenn der Thread die Anwendung überschreitet Standard Grenzen. Im folgenden Beispiel wird die aktuelle Threadkultur in Niederländisch (Niederlande) geändert. Außerdem wird gezeigt, dass sich die aktuelle Standard Kultur geändert hat, wenn der aktuelle Thread die Anwendung überschreitet Standard.

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

public class Info11 : 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 Example11
{
    public static void Main()
    {
        Info11 inf = new Info11();
        // 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");
        Info11 inf2 = (Info11)ad.CreateInstanceAndUnwrap(typeof(Info11).Assembly.FullName, "Info11");
        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
Imports System.Globalization
Imports System.Threading

Public Class Info : Inherits MarshalByRefObject
   Public Sub ShowCurrentCulture()
      Console.WriteLine("Culture of {0} in application domain {1}: {2}",
                        Thread.CurrentThread.Name,
                        AppDomain.CurrentDomain.FriendlyName,
                        CultureInfo.CurrentCulture.Name)
   End Sub
End Class

Module Example2
    Public Sub S1()
        Dim inf As 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.
        Dim ad As AppDomain = AppDomain.CreateDomain("Domain2")
        Dim inf2 As Info = CType(ad.CreateInstanceAndUnwrap(GetType(Info).Assembly.FullName, "Info"),
                          Info)
        inf2.ShowCurrentCulture()
    End Sub
End Module
' This example displays the following output:
'       Culture of MainThread in application domain Example.exe: nl-NL
'       Culture of MainThread in application domain Domain2: nl-NL

Hinweis

Das Ändern der Kultur mithilfe der CultureInfo.CurrentCulture Eigenschaft erfordert eine SecurityPermission Berechtigung mit dem ControlThread Wertsatz. Das Bearbeiten von Threads ist aufgrund des Sicherheitsstatus, der Threads zugeordnet ist, gefährlich. Daher sollte diese Berechtigung nur vertrauenswürdigen Code und dann nur nach Bedarf erteilt werden. Sie können die Threadkultur im halb vertrauenswürdigen Code nicht ändern.

Ab .NET Framework 4 können Sie die aktuelle Threadkultur explizit in eine bestimmte Kultur (z. B. Französisch (Kanada)) oder eine neutrale Kultur (z. B. Französisch) ändern. Wenn ein CultureInfo Objekt eine neutrale Kultur darstellt, entsprechen die Werte von CultureInfo Eigenschaften wie Calendar, CompareInfo, , NumberFormatDateTimeFormatund TextInfo spiegeln die spezifische Kultur wider, die der neutralen Kultur zugeordnet ist. Beispielsweise ist die dominante Kultur der englischen neutralen Kultur Englisch (USA); die dominante Kultur für die deutsche Kultur ist Deutsch (Deutschland). Im folgenden Beispiel wird der Unterschied bei der Formatierung veranschaulicht, wenn die aktuelle Kultur auf eine bestimmte Kultur, Französisch (Kanada) und eine neutrale Kultur( Französisch) festgelegt ist.

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: {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 €
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 €

Sie können die CultureInfo.CurrentCulture Eigenschaft auch zusammen mit der HttpRequest.UserLanguages Eigenschaft verwenden, um die CurrentCulture Eigenschaft einer ASP.NET Anwendung auf die bevorzugte Kultur des Benutzers festzulegen, wie das folgende Beispiel veranschaulicht.

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

Aktuelle Kultur- und Benutzerüberschreibungen

Windows ermöglicht Benutzern das Überschreiben der Standardeigenschaftenwerte des CultureInfo Objekts und der zugehörigen Objekte mithilfe der Regions- und Sprachoptionen in Systemsteuerung. Das CultureInfo von der CurrentCulture Eigenschaft zurückgegebene Objekt spiegelt diese Benutzerüberschreibungen in den folgenden Fällen wider:

  • Wenn die aktuelle Threadkultur implizit von der Windows-Funktion GetUserDefaultLocaleName festgelegt wird.

  • Wenn die von der DefaultThreadCurrentCulture Eigenschaft definierte aktuelle Threadkultur der aktuellen Windows-Systemkultur entspricht.

  • Wenn die aktuelle Threadkultur explizit auf eine kultur festgelegt wird, die von der CreateSpecificCulture Methode zurückgegeben wird und diese Kultur der aktuellen Windows-Systemkultur entspricht.

  • Wenn die aktuelle Threadkultur explizit auf eine vom Konstruktor instanziierte CultureInfo(String) Kultur festgelegt wird und diese Kultur der aktuellen Windows-Systemkultur entspricht.

In einigen Fällen, insbesondere für Serveranwendungen, kann das Festlegen der aktuellen Kultur auf ein CultureInfo Objekt, das Benutzerüberschreibungen widerspiegelt, unerwünschte Sein. Stattdessen können Sie die aktuelle Kultur auf ein CultureInfo Objekt festlegen, das keine Benutzerüberschreibungen auf folgende Weise widerspiegelt:

Aktuelle Kultur und UWP-Apps

In Universelle Windows-Plattform (UWP)-Apps ist die CurrentCulture Eigenschaft schreibgeschützt, genau wie in .NET Framework- und .NET Core-Apps. Sie können sie verwenden, um die aktuelle Kultur abzurufen und festzulegen. UWP-Apps unterscheiden jedoch nicht zwischen der aktuellen Kultur und der aktuellen Benutzeroberflächenkultur. Die Eigenschaften CurrentCulture und CurrentUICulture werden dem ersten Wert in der Sammlung Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages zugeordnet.

In .NET Framework- und .NET Core-Apps ist die aktuelle Kultur eine Einstellung pro Thread, und die CurrentCulture Eigenschaft spiegelt nur die Kultur des aktuellen Threads wider. In UWP-Apps wird die aktuelle Kultur der Eigenschaft "Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages ", einer globalen Einstellung, zugeordnet. Durch festlegen der CurrentCulture Eigenschaft wird die Kultur der gesamten App geändert. Die Kultur kann nicht pro Thread festgelegt werden.