System.Globalization.CultureInfo.CurrentCulture – vlastnost

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Objekt CultureInfo vrácený CurrentCulture vlastností a přidruženými objekty určuje výchozí formát pro kalendářní data, časy, čísla a hodnoty měny, pořadí řazení textu, konvence velikosti písmen a porovnání řetězců.

Aktuální jazyková verze je vlastnost spuštěného vlákna. Když tuto vlastnost nastavíte na CultureInfo objekt, který představuje novou jazykovou verzi, hodnota Thread.CurrentThread.CurrentCulture vlastnosti se také změní. Doporučujeme však vždy použít CultureInfo.CurrentCulture vlastnost k načtení a nastavení aktuální jazykové verze.

Objekt CultureInfo , který tato vlastnost vrací, je jen pro čtení. To znamená, že existující objekt nemůžete ztlumit, například změnou objektu DateTimeFormat. Pokud chcete změnit formát data a času nebo jiný aspekt aktuální jazykové verze, vytvořte nový CultureInfo objekt a přiřaďte ho k vlastnosti.

Určení jazykové verze vlákna

Když je vlákno spuštěno, jeho jazyková verze je původně určena následujícím způsobem:

  • Načtením jazykové verze určené DefaultThreadCurrentCulture vlastností v doméně aplikace, ve které je vlákno spuštěno, pokud hodnota vlastnosti není null.

  • Pokud je vlákno vlákno fondu vláken, které spouští asynchronní operaci založenou na úlohách, její jazyková verze je určena jazykovou verzí volajícího vlákna. Následující příklad změní aktuální jazykovou verzi na portugalštinu (Brazílie) a spustí šest úkolů, z nichž každý zobrazí ID vlákna, ID úkolu a aktuální jazykovou verzi. Každá úloha (a vlákna) zdědila jazykovou verzi volajícího vlákna.

    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
    

    Další informace naleznete v tématu Jazykové verze a asynchronní operace založené na úlohách.

  • Voláním funkce ve GetUserDefaultLocaleName Windows nebo uloc_getDefault funkce z ICU, která aktuálně volá funkci POSIX setlocale s kategorií LC_MESSAGES, v systémech unixových.

Všimněte si, že pokud nastavíte konkrétní jazykovou verzi, která se liší od jazykové verze nainstalované systémem nebo upřednostňované jazykové verze uživatele a vaše aplikace spustí více vláken, bude aktuální jazyková verze těchto vláken vrácená GetUserDefaultLocaleName funkcí, pokud nepřiřadíte jazykovou verzi vlastnosti DefaultThreadCurrentCulture v doméně aplikace, ve které je vlákno spuštěno.

Další informace o tom, jak je určena jazyková verze vlákna, naleznete v části Jazykové verze a vlákna na CultureInfo referenční stránce.

Získání aktuální jazykové verze

Vlastnost je nastavení pro jednotlivá vlákna. To CultureInfo.CurrentCulture znamená, že každé vlákno může mít vlastní jazykovou verzi. Jazykovou verzi aktuálního vlákna získáte načtením hodnoty CultureInfo.CurrentCulture vlastnosti, jak ukazuje následující příklad.

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]

Explicitně nastavte vlastnost CurrentCulture.

Pokud chcete změnit jazykovou verzi používanou existujícím vláknem, nastavíte CultureInfo.CurrentCulture vlastnost na novou jazykovou verzi. Pokud tímto způsobem explicitně změníte jazykovou verzi vlákna, tato změna se zachová, pokud vlákno překročí hranice domény aplikace. Následující příklad změní aktuální jazykovou verzi vlákna na holandštinu (Nizozemsko). Ukazuje také, že když aktuální vlákno překročí hranice domény aplikace, jeho aktuální jazyková verze zůstane změněna.

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

Poznámka:

Změna jazykové verze pomocí CultureInfo.CurrentCulture vlastnosti vyžaduje SecurityPermission oprávnění se ControlThread sadou hodnot. Manipulace s vlákny je nebezpečná z důvodu stavu zabezpečení spojeného s vlákny. Toto oprávnění by proto mělo být uděleno pouze důvěryhodnému kódu a pak pouze podle potřeby. Jazykovou verzi vlákna nelze změnit v částečně důvěryhodném kódu.

Počínaje rozhraním .NET Framework 4 můžete explicitně změnit aktuální jazykovou verzi vlákna na konkrétní jazykovou verzi (například francouzštinu (Kanada) nebo neutrální jazykovou verzi (například francouzštinu). CultureInfo Pokud objekt představuje neutrální jazykovou verzi, hodnoty CultureInfo vlastností, jako Calendarje , CompareInfo, DateTimeFormatNumberFormata TextInfo odrážejí konkrétní jazykovou verzi, která je přidružena k neutrální jazykové verzi. Dominantní kultura pro anglickou neutrální kulturu je například angličtina (USA); dominantní kultura pro německou kulturu je němčina (Německo). Následující příklad ukazuje rozdíl ve formátování, když je aktuální jazyková verze nastavena na konkrétní jazykovou verzi, francouzštinu (Kanada) a neutrální jazykovou verzi, francouzštinu.

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 €

Vlastnost můžete také použít CultureInfo.CurrentCulture spolu s HttpRequest.UserLanguages vlastností k nastavení CurrentCulture vlastnosti ASP.NET aplikace na upřednostňovanou jazykovou verzi uživatele, jak je znázorněno v následujícím příkladu.

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

Aktuální jazyková verze a přepsání uživatelů

Systém Windows umožňuje uživatelům přepsat standardní hodnoty vlastností objektu CultureInfo a přidružených objektů pomocí místních a jazykových možností v Ovládací panely. Objekt CultureInfo vrácený CurrentCulture vlastností odráží tyto přepsání uživatele v následujících případech:

  • Pokud je aktuální jazyková verze vlákna nastavena implicitně funkcí Systému Windows GetUserDefaultLocaleName .

  • Pokud aktuální jazyková verze vlákna definovaná DefaultThreadCurrentCulture vlastností odpovídá aktuální systémové jazykové verzi systému Windows.

  • Pokud je aktuální jazyková verze vlákna nastavena explicitně na jazykovou verzi vrácenou metodou CreateSpecificCulture a tato jazyková verze odpovídá aktuální jazykové verzi systému Windows.

  • Pokud je aktuální jazyková verze vlákna nastavena explicitně na instanci jazykové verze CultureInfo(String) konstruktoru a tato jazyková verze odpovídá aktuální jazykové verzi systému Windows.

V některých případech, zejména u serverových aplikací, může být nastavení aktuální jazykové verze na CultureInfo objekt, který odráží přepsání uživatele, nežádoucí. Místo toho můžete aktuální jazykovou verzi nastavit na CultureInfo objekt, který neodráží přepsání uživatele následujícími způsoby:

Aktuální jazyková verze a aplikace pro UPW

V aplikacích pro Univerzální platforma Windows (UPW) CurrentCulture je vlastnost pro čtení i zápis, stejně jako v aplikacích .NET Framework a .NET Core. Tuto vlastnost můžete použít k získání i nastavení aktuální jazykové verze. Aplikace pro UPW ale nerozlišují mezi aktuální jazykovou verzí a aktuální jazykovou verzí uživatelského rozhraní. Vlastnosti CurrentCulture a CurrentUICulture vlastnosti se mapuje na první hodnotu v kolekci Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

V aplikacích .NET Framework a .NET Core je aktuální jazyková verze nastavení pro jednotlivá vlákna a CurrentCulture vlastnost odráží jazykovou verzi pouze aktuálního vlákna. V aplikacích pro UPW se aktuální jazyková verze mapuje na vlastnost Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , což je globální nastavení. CurrentCulture Nastavení vlastnosti změní jazykovou verzi celé aplikace. Jazykovou verzi nelze nastavit na základě jednotlivých vláken.