Sdílet prostřednictvím


System.Globalization.CultureInfo.CurrentUICulture – vlastnost

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

Vlastnost CurrentUICulture je vlastnost pro jednotlivá vlákna. To znamená, že každé vlákno má vlastní aktuální jazykovou verzi uživatelského rozhraní. Tato vlastnost je ekvivalentní načtení nebo nastavení CultureInfo objektu přiřazeného k System.Threading.Thread.CurrentThread.CurrentUICulture vlastnosti. Při spuštění vlákna se jeho jazyková verze uživatelského rozhraní zpočátku určí takto:

  • Načtením jazykové verze určené DefaultThreadCurrentUICulture 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 a aplikace cílí na rozhraní .NET Framework 4.6 nebo novější verzi rozhraní .NET Framework, její jazyková verze uživatelského rozhraní je určena jazykovou verzí uživatelského rozhraní volajícího vlákna. Následující příklad změní aktuální jazykovou verzi uživatelského rozhraní na portugalštinu (Brazílie) a spustí šest úloh, z nichž každá zobrazuje ID vlákna, ID úkolu a aktuální jazykovou verzi uživatelského rozhraní. Každá úloha (a vlákna) zdědila jazykovou verzi uživatelského rozhraní 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 Example
    {
        public static async Task Main()
        {
            var tasks = new List<Task>();
            Console.WriteLine("The current UI culture is {0}",
                              Thread.CurrentThread.CurrentUICulture.Name);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("pt-BR");
            // Change the current UI culture to Portuguese (Brazil).
            Console.WriteLine("Current UI culture changed to {0}",
                              Thread.CurrentThread.CurrentUICulture.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("UI Culture of task {0} on thread {1} is {2}",
                                      Task.CurrentId,
                                      Thread.CurrentThread.ManagedThreadId,
                                      Thread.CurrentThread.CurrentUICulture.Name);
                }));
    
            await Task.WhenAll(tasks.ToArray());
        }
    }
    // The example displays output like the following:
    //     The current UI culture is en-US
    //     Current UI culture changed to pt-BR
    //     Application thread is thread 9
    //     UI Culture of task 2 on thread 11 is pt-BR
    //     UI Culture of task 1 on thread 10 is pt-BR
    //     UI Culture of task 3 on thread 11 is pt-BR
    //     UI Culture of task 5 on thread 11 is pt-BR
    //     UI Culture of task 6 on thread 11 is pt-BR
    //     UI Culture of task 4 on thread 10 is pt-BR
    
    Imports System.Globalization
    Imports System.Threading
    
    Module Example1
        Public Sub Main()
            Dim tasks As New List(Of Task)
            Console.WriteLine("The current UI culture is {0}",
                              Thread.CurrentThread.CurrentUICulture.Name)
            Thread.CurrentThread.CurrentUICulture = New CultureInfo("pt-BR")
            ' Change the current UI culture to Portuguese (Brazil).
            Console.WriteLine("Current culture changed to {0}",
                              Thread.CurrentThread.CurrentUICulture.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.CurrentUICulture.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 najdete v části Jazykové verze a asynchronní operace založené na úlohách v CultureInfo dokumentaci.

  • Voláním funkce Systému Windows GetUserDefaultUILanguage .

Chcete-li změnit jazykovou verzi uživatelského rozhraní používanou vláknem, nastavte Thread.CurrentUICulture vlastnost na novou jazykovou verzi. Pokud tímto způsobem explicitně změníte jazykovou verzi uživatelského rozhraní vlákna, tato změna se zachová, pokud vlákno překročí hranice domény aplikace.

Poznámka:

Pokud nastavíte hodnotu vlastnosti na CultureInfo objekt, který představuje novou jazykovou verzi, hodnota Thread.CurrentThread.CurrentCulture vlastnosti se také změní.

Získání aktuální jazykové verze uživatelského rozhraní

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

using System;
using System.Globalization;

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

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

Z vlastnosti můžete také načíst hodnotu jazykové verze Thread.CurrentUICulture uživatelského rozhraní aktuálního vlákna.

Explicitní nastavení aktuální jazykové verze uživatelského rozhraní

Počínaje rozhraním .NET Framework 4.6 můžete aktuální jazykovou verzi uživatelského rozhraní změnit přiřazením CultureInfo objektu, který představuje novou jazykovou verzi vlastnosti CultureInfo.CurrentUICulture . Aktuální jazykovou verzi uživatelského rozhraní lze nastavit buď na konkrétní jazykovou verzi (například en-US nebo de-DE), nebo na neutrální jazykovou verzi (například en nebo de). Následující příklad nastaví aktuální jazykovou verzi uživatelského rozhraní na fr-FR nebo francouzštinu (Francie).

using System;
using System.Globalization;

public class Example1
{
    public static void Main()
    {
        Console.WriteLine("The current UI culture: {0}",
                          CultureInfo.CurrentUICulture.Name);

        CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
        Console.WriteLine("The current UI culture: {0}",
                          CultureInfo.CurrentUICulture.Name);
    }
}
// The example displays output like the following:
//       The current UI culture: en-US
//       The current UI culture: fr-FR
Imports System.Globalization

Module Example2
    Public Sub Main()
        Console.WriteLine("The current UI culture: {0}",
                        CultureInfo.CurrentUICulture.Name)

        CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
        Console.WriteLine("The current UI culture: {0}",
                        CultureInfo.CurrentUICulture.Name)
    End Sub
End Module
' The example displays output like the following:
'       The current UI culture: en-US
'       The current UI culture: fr-FR

Ve vícevláknové aplikaci můžete explicitně nastavit jazykovou verzi uživatelského rozhraní libovolného vlákna přiřazením objektu CultureInfo , který představuje tuto jazykovou verzi vlastnosti vlákna Thread.CurrentUICulture . Pokud je vlákno, jehož jazykovou verzi chcete nastavit, aktuální vlákno, můžete k vlastnosti přiřadit novou jazykovou CultureInfo.CurrentUICulture verzi. Pokud je jazyková verze uživatelského rozhraní vlákna nastavená explicitně, zachová toto vlákno stejnou jazykovou verzi i v případě, že překročí hranice domény aplikace a spustí kód v jiné doméně aplikace.

Implicitně nastavte aktuální jazykovou verzi uživatelského rozhraní.

Při prvním vytvoření vlákna, včetně hlavního vlákna aplikace, se ve výchozím nastavení nastaví aktuální jazyková verze uživatelského rozhraní následujícím způsobem:

  • Použitím jazykové verze definované DefaultThreadCurrentUICulture vlastností pro aktuální doménu aplikace, pokud hodnota vlastnosti není null.
  • Pomocí výchozí jazykové verze systému. V systémech, které používají operační systém Windows, modul CLR volá funkci Windows GetUserDefaultUILanguage , aby nastavil aktuální jazykovou verzi uživatelského rozhraní. GetUserDefaultUILanguage vrátí výchozí jazykovou verzi uživatelského rozhraní nastavenou uživatelem. Pokud uživatel nenastavil výchozí jazyk uživatelského rozhraní, vrátí jazykovou verzi původně nainstalovanou v systému.

Pokud vlákno překročí hranice aplikace a spustí kód v jiné doméně aplikace, jeho jazyková verze se určí stejným způsobem jako nově vytvořené vlákno.

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

Bezpečnostní aspekty

Změna jazykové verze aktuálního vlákna vyžaduje SecurityPermission oprávnění se ControlThread sadou hodnot.

Upozornění

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.

Aktuální jazyková verze uživatelského rozhraní a aplikace pro UPW

V aplikacích pro Univerzální platforma Windows (UPW) CurrentUICulture 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 uživatelského rozhraní nastavení pro jednotlivá vlákna a CurrentUICulture vlastnost odráží jazykovou verzi uživatelského rozhraní 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.