Właściwość System.Globalization.CultureInfo.CurrentUICulture

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Właściwość CurrentUICulture jest właściwością na wątek. Oznacza to, że każdy wątek ma własną bieżącą kulturę interfejsu użytkownika. Ta właściwość jest równoważna pobieraniu lub ustawianiu CultureInfo obiektu przypisanego System.Threading.Thread.CurrentThread.CurrentUICulture do właściwości. Po uruchomieniu wątku kultura interfejsu użytkownika jest początkowo określana w następujący sposób:

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

  • Jeśli wątek jest wątkiem puli wątków, który wykonuje operację asynchroniczną opartą na zadaniach, a aplikacja jest przeznaczona dla platformy .NET Framework 4.6 lub nowszej wersji programu .NET Framework, jej kultura interfejsu użytkownika jest określana przez kulturę interfejsu użytkownika wątku wywołującego. Poniższy przykład zmienia bieżącą kulturę interfejsu użytkownika na portugalski (Brazylia) i uruchamia sześć zadań, z których każdy wyświetla identyfikator wątku, identyfikator zadania i bieżącą kulturę interfejsu użytkownika. Każde z zadań (i wątków) odziedziczyło kulturę interfejsu użytkownika wątku wywołującego.

    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
    

    Aby uzyskać więcej informacji, zobacz sekcję "Operacje asynchroniczne oparte na kulturze i zadaniach" w CultureInfo dokumentacji.

  • Wywołując funkcję systemu Windows GetUserDefaultUILanguage .

Aby zmienić kulturę interfejsu użytkownika używaną przez wątek, ustaw Thread.CurrentUICulture właściwość na nową kulturę. Jeśli w ten sposób jawnie zmienisz kulturę interfejsu użytkownika wątku, ta zmiana będzie się powtarzać, jeśli wątek przekroczy granice domeny aplikacji.

Uwaga

Jeśli ustawisz wartość właściwości na CultureInfo obiekt reprezentujący nową kulturę, wartość Thread.CurrentThread.CurrentCulture właściwości również ulegnie zmianie.

Pobieranie bieżącej kultury interfejsu użytkownika

Właściwość CultureInfo.CurrentUICulture jest ustawieniem dla wątku, czyli każdy wątek może mieć własną kulturę interfejsu użytkownika. Kultura interfejsu użytkownika bieżącego wątku jest pobierana przez pobranie wartości CultureInfo.CurrentUICulture właściwości, jak pokazano w poniższym przykładzie.

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]

Możesz również pobrać wartość kultury interfejsu użytkownika bieżącego wątku Thread.CurrentUICulture z właściwości .

Jawne ustawianie bieżącej kultury interfejsu użytkownika

Począwszy od programu .NET Framework 4.6, możesz zmienić bieżącą CultureInfo kulturę interfejsu użytkownika, przypisując obiekt reprezentujący nową kulturę CultureInfo.CurrentUICulture do właściwości. Bieżąca kultura interfejsu użytkownika może być ustawiona na określoną kulturę (np. en-US lub de-DE) albo na neutralną kulturę (np. en lub de). W poniższym przykładzie ustawiono bieżącą kulturę interfejsu użytkownika na fr-FR lub francuski (Francja).

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

W aplikacji wielowątku można jawnie ustawić kulturę interfejsu użytkownika dowolnego wątku, przypisując obiekt reprezentujący kulturę CultureInfo tego wątku do właściwości wątku Thread.CurrentUICulture . Jeśli wątek, którego kultura ma zostać ustawiona, jest bieżącym wątkiem, możesz przypisać nową kulturę CultureInfo.CurrentUICulture do właściwości . Gdy kultura interfejsu użytkownika wątku jest ustawiana jawnie, ten wątek zachowuje tę samą kulturę, nawet jeśli przekracza granice domeny aplikacji i wykonuje kod w innej domenie aplikacji.

Niejawnie ustaw bieżącą kulturę interfejsu użytkownika

Gdy wątek, w tym główny wątek aplikacji, jest najpierw tworzony, domyślnie jego bieżąca kultura interfejsu użytkownika jest ustawiana w następujący sposób:

  • Używając kultury zdefiniowanej DefaultThreadCurrentUICulture przez właściwość dla bieżącej domeny aplikacji, jeśli wartość właściwości nie nulljest .
  • Przy użyciu kultury domyślnej systemu. W systemach korzystających z systemu operacyjnego Windows środowisko uruchomieniowe języka wspólnego wywołuje funkcję systemu Windows GetUserDefaultUILanguage , aby ustawić bieżącą kulturę interfejsu użytkownika. GetUserDefaultUILanguage Zwraca domyślną kulturę interfejsu użytkownika ustawioną przez użytkownika. Jeśli użytkownik nie ustawił domyślnego języka interfejsu użytkownika, zwraca kulturę pierwotnie zainstalowaną w systemie.

Jeśli wątek przekracza granice aplikacji i wykonuje kod w innej domenie aplikacji, jego kultura jest określana w taki sam sposób, jak w przypadku nowo utworzonego wątku.

Należy pamiętać, że jeśli ustawisz określoną kulturę interfejsu użytkownika, która różni się od kultury interfejsu użytkownika zainstalowanej przez system lub preferowanej kultury interfejsu użytkownika użytkownika, a aplikacja uruchamia wiele wątków, bieżąca kultura interfejsu użytkownika tych wątków będzie kulturą zwracaną przez GetUserDefaultUILanguage funkcję, chyba że zostanie przypisana kultura do DefaultThreadCurrentUICulture właściwości w domenie aplikacji, w której jest wykonywany wątek.

Zagadnienia dotyczące zabezpieczeń

Zmiana kultury bieżącego wątku wymaga SecurityPermission uprawnienia z zestawem ControlThread wartości.

Uwaga

Manipulowanie wątkami jest niebezpieczne ze względu na stan zabezpieczeń skojarzony z wątkami. W związku z tym to uprawnienie powinno być podane tylko do wiarygodnego kodu, a następnie tylko w razie potrzeby. Nie można zmienić kultury wątków w częściowo zaufanym kodzie.

Bieżąca kultura interfejsu użytkownika i aplikacje platformy UWP

W aplikacjach CurrentUICulture platformy platforma uniwersalna systemu Windows (UWP) właściwość jest odczyt-zapis, podobnie jak w aplikacjach .NET Framework i .NET Core. Można jej użyć zarówno do pobierania, jak i ustawiania bieżącej kultury. Jednak aplikacje platformy UNIWERSALNEJ systemu Windows nie rozróżniają bieżącej kultury i bieżącej kultury interfejsu użytkownika. Właściwości CurrentCulture i CurrentUICulture mapują na pierwszą wartość w kolekcji Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

W aplikacjach .NET Framework i .NET Core bieżąca kultura interfejsu użytkownika jest ustawieniem dla wątku, a CurrentUICulture właściwość odzwierciedla kulturę interfejsu użytkownika tylko bieżącego wątku. W aplikacjach platformy UWP bieżąca kultura jest mapowana na właściwość Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , która jest ustawieniem globalnym. CurrentCulture Ustawienie właściwości zmienia kulturę całej aplikacji; nie można ustawić kultury dla każdego wątku.