CultureInfo.DefaultThreadCurrentUICulture Właściwość

Definicja

Pobiera lub ustawia domyślną kulturę interfejsu użytkownika dla wątków w bieżącej domenie aplikacji.

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

Wartość właściwości

Domyślna kultura interfejsu użytkownika wątków w bieżącej domenie aplikacji lub null jeśli bieżąca kultura interfejsu użytkownika systemu jest domyślną kulturą interfejsu użytkownika wątku w domenie aplikacji.

Wyjątki

W operacji zestawu wartość właściwości jest nieprawidłowa Name .

Przykłady

Poniższy przykład ilustruje domyślne zachowanie .NET Framework podczas definiowania bieżącej kultury nowego wątku. Używa on zasobów języka angielskiego i rosyjskiego. Następujący plik tekstowy o nazwie GreetingStrings.txt zawiera zasoby języka angielskiego:

greeting =Hello again!
newGreeting=Hello!

Jest on kompilowany do binarnego pliku resources o nazwie GreetingStrings.resources przy użyciu generatora plików zasobów za pomocą następującego polecenia.

resgen greetingstrings.txt

Następujący plik tekstowy o nazwie GreetingStrings.ru-RU.txt zawiera zasoby języka rosyjskiego:

greeting=Еще раз привет!
newGreeting=Привет!

Jest on kompilowany do binarnego pliku resources o nazwie GreetingStrings.ru-RU.resources przy użyciu generatora plików zasobów za pomocą następującego polecenia.

resgen greetingstrings.ru-RU.txt

Kod aplikacji, który jest pokazany poniżej, znajduje się w pliku o nazwie Example1.vb lub Example1.cs. Jest on kompilowany do pliku wykonywalnego przy użyciu następującego polecenia dla kompilatora Visual Basic:

vbc Example1.vb /resource:GreetingStrings.resources

W przypadku kompilatora języka C# polecenie jest podobne:

csc /resource:GreetingStrings.resources Example1.cs

Spowoduje to utworzenie zestawu zawierającego kod wykonywalny przykładu wraz z zasobami dla jego kultury rezerwowej. Możesz również użyć konsolidatora zestawów , aby utworzyć plik zasobów dla kultury rosyjskiej (Rosji) za pomocą następującego polecenia:

>al /embed:greetingstrings.ru-RU.resources /c:ru-RU /template:example1.exe /out:ru-RU\Example1.resources.dll

Podczas uruchamiania przykład ustawia bieżącą kulturę i bieżącą kulturę interfejsu użytkownika na rosyjską (Rosję) we wszystkich systemach, z wyjątkiem tych, w których domyślna kultura systemowa jest już rosyjska (Rosja). Jeśli domyślna kultura systemowa jest już rosyjska (Rosja), kod ustawia bieżącą kulturę i bieżącą kulturę interfejsu użytkownika na angielski (Stany Zjednoczone). Następnie wywołuje procedurę ShowGreeting , która wyświetla prosty ciąg przy pierwszym wywołaniu i nieco inny ciąg w kolejnych wywołaniach metody. Następnie tworzy nowy wątek, który również wykonuje procedurę ShowGreeting .

using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;

[assembly:NeutralResourcesLanguageAttribute("en-US")]

public class Example
{
   private static int nGreetings = 0;
   private static ResourceManager rm;

   public static void Main()
   {
      AppDomain domain = AppDomain.CurrentDomain;
      rm = new ResourceManager("GreetingStrings",
                               typeof(Example).Assembly);

      CultureInfo culture = null;
      if (Thread.CurrentThread.CurrentUICulture.Name == "ru-RU")
         culture = CultureInfo.CreateSpecificCulture("en-US");
      else
         culture = CultureInfo.CreateSpecificCulture("ru-RU");

      Thread.CurrentThread.CurrentCulture = culture;
      Thread.CurrentThread.CurrentUICulture = culture;

      ShowGreeting();
      Thread.Sleep(1000);

      Thread workerThread = new Thread(Example.ShowGreeting);
      workerThread.Start();
   }

   private static void ShowGreeting()
   {
      string greeting = nGreetings == 0 ? rm.GetString("newGreeting") :
                                          rm.GetString("greeting");
      nGreetings++;
      Console.WriteLine("{0}", greeting);
   }
}
// The example displays the following output:
//       Привет!
//       Hello again!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguageAttribute("en-US")>

Public Class Example
   Private Shared nGreetings As Integer = 0
   Private Shared rm As ResourceManager

   Public Shared Sub Main()
      Dim domain As AppDomain = AppDomain.CurrentDomain
      rm = New ResourceManager("GreetingStrings", 
                               GetType(Example).Assembly)
                  
      Dim culture As CultureInfo = Nothing
      If Thread.CurrentThread.CurrentUICulture.Name = "ru-RU" Then
         culture = CultureInfo.CreateSpecificCulture("en-US")
      Else
         culture = CultureInfo.CreateSpecificCulture("ru-RU")
      End If   
      Thread.CurrentThread.CurrentCulture = culture
      Thread.CurrentThread.CurrentUICulture = culture

      ShowGreeting()
      Thread.Sleep(1000)

      Dim workerThread As New Thread(AddressOf Example.ShowGreeting)
      workerThread.Start()
   End Sub
   
   Private Shared Sub ShowGreeting()
      Dim greeting As String = CStr(IIf(nGreetings = 0, 
                                        rm.GetString("newGreeting"),
                                        rm.GetString("greeting")))
      nGreetings += 1
      Console.WriteLine("{0}", greeting)   
   End Sub
End Class
' The example displays the following output:
'       Привет!
'       Hello again!

Jak pokazuje dane wyjściowe z przykładu, gdy przykład jest uruchamiany na komputerze, którego kultura systemowa jest angielska (Stany Zjednoczone), główny wątek wyświetla jego początkowy ciąg w języku rosyjskim. Jednak ponieważ kultura wątku roboczego pochodzi z bieżącej kultury systemu Windows, a nie bieżącej kultury aplikacji, wątek procesu roboczego wyświetla ciąg w języku angielskim.

W poniższym przykładzie użyto DefaultThreadCurrentCulture właściwości i DefaultThreadCurrentUICulture do zdefiniowania bieżącej kultury i bieżącej kultury interfejsu użytkownika nowego wątku aplikacji.

W przykładzie użyto tych samych plików zasobów co w poprzednim przykładzie. Polecenia kompilowania i osadzania zlokalizowanych zasobów języka rosyjskiego w zestawie satelitarnym są również identyczne, z tą różnicą, że nazwa zestawu wykonywalnego zmienia się.

Podczas uruchamiania przykład ustawia bieżącą kulturę i bieżącą kulturę interfejsu użytkownika na rosyjską (Rosję) we wszystkich systemach, z wyjątkiem tych, w których domyślna kultura systemowa jest już rosyjska (Rosja). Jeśli domyślna kultura systemowa jest już rosyjska (Rosja), ustawia bieżącą kulturę i bieżącą kulturę interfejsu użytkownika na angielski (Stany Zjednoczone). Następnie wywołuje procedurę ShowGreeting , która wyświetla prosty ciąg przy pierwszym wywołaniu i nieco inny ciąg w kolejnych wywołaniach metody. Następnie tworzy nowy wątek, który również wykonuje procedurę ShowGreeting .

using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;

[assembly:NeutralResourcesLanguageAttribute("en-US")]

public class Example
{
   private static int nGreetings = 0;
   private static ResourceManager rm;

   public static void Main()
   {
      AppDomain domain = AppDomain.CurrentDomain;
      rm = new ResourceManager("GreetingStrings",
                               typeof(Example).Assembly);

      CultureInfo culture = null;
      if (Thread.CurrentThread.CurrentUICulture.Name == "ru-RU")
         culture = CultureInfo.CreateSpecificCulture("en-US");
      else
         culture = CultureInfo.CreateSpecificCulture("ru-RU");

      CultureInfo.DefaultThreadCurrentCulture = culture;
      CultureInfo.DefaultThreadCurrentUICulture = culture;

      Thread.CurrentThread.CurrentCulture = culture;
      Thread.CurrentThread.CurrentUICulture = culture;

      ShowGreeting();
      Thread.Sleep(1000);

      Thread workerThread = new Thread(Example.ShowGreeting);
      workerThread.Start();
   }

   private static void ShowGreeting()
   {
      string greeting = nGreetings == 0 ? rm.GetString("newGreeting") :
                                          rm.GetString("greeting");
      nGreetings++;
      Console.WriteLine("{0}", greeting);
   }
}
// The example displays the following output:
//       Привет!
//       Еще раз привет!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguageAttribute("en-US")>

Public Class Example
   Private Shared nGreetings As Integer = 0
   Private Shared rm As ResourceManager

   Public Shared Sub Main()
      Dim domain As AppDomain = AppDomain.CurrentDomain
      rm = New ResourceManager("GreetingStrings", 
                               GetType(Example).Assembly)
                  
      Dim culture As CultureInfo = Nothing
      If Thread.CurrentThread.CurrentUICulture.Name = "ru-RU" Then
         culture = CultureInfo.CreateSpecificCulture("en-US")
      Else
         culture = CultureInfo.CreateSpecificCulture("ru-RU")
      End If   
      CultureInfo.DefaultThreadCurrentCulture = culture
      CultureInfo.DefaultThreadCurrentUICulture = culture
       
      Thread.CurrentThread.CurrentCulture = culture
      Thread.CurrentThread.CurrentUICulture = culture

      ShowGreeting()
      Thread.Sleep(1000)

      Dim workerThread As New Thread(AddressOf Example.ShowGreeting)
      workerThread.Start()
   End Sub
   
   Private Shared Sub ShowGreeting()
      Dim greeting As String = CStr(IIf(nGreetings = 0, 
                                        rm.GetString("newGreeting"),
                                        rm.GetString("greeting")))
      nGreetings += 1
      Console.WriteLine("{0}", greeting)   
   End Sub
End Class
' The example displays the following output:
'       Привет!
'       Еще раз привет!

Jak pokazuje dane wyjściowe z przykładu, gdy przykład jest uruchamiany na komputerze, na którym kultura systemowa jest angielska (Stany Zjednoczone), zarówno główny wątek, jak i wątek roboczy wyświetlają ciągi w języku rosyjskim.

Uwagi

W .NET Framework 4 i poprzednich wersjach domyślnie kultura interfejsu użytkownika wszystkich wątków jest ustawiona na kulturę systemu Windows. W przypadku aplikacji, których bieżąca kultura interfejsu użytkownika różni się od domyślnej kultury systemu, to zachowanie jest często niepożądane. W .NET Framework 4.5 DefaultThreadCurrentUICulture właściwość umożliwia zdefiniowanie domyślnej kultury interfejsu użytkownika wszystkich wątków w domenie aplikacji.

Ważne

Jeśli nie ustawiono jawnie kultury interfejsu użytkownika istniejących wątków wykonywanych w domenie aplikacji, ustawienie DefaultThreadCurrentUICulture właściwości zmienia również kulturę tych wątków. Jeśli jednak te wątki są wykonywane w innej domenie aplikacji, ich kultura jest definiowana przez DefaultThreadCurrentUICulture właściwość w tej domenie aplikacji lub, jeśli nie zdefiniowano wartości domyślnej, domyślnie jest to kultura systemowa. W związku z tym zalecamy, aby zawsze jawnie ustawić kulturę głównego wątku aplikacji i nie polegać na DefaultThreadCurrentUICulture właściwości w celu zdefiniowania kultury głównego wątku aplikacji.

Jeśli nie zostanie ona ustawiona jawnie, wartość DefaultThreadCurrentUICulture właściwości to null, a bieżąca kultura wszystkich wątków w domenie aplikacji, która nie została przypisana, jest definiowana przez domyślną kulturę systemu Windows.

Aby uzyskać więcej informacji na temat kultur, wątków i domen aplikacji, zobacz sekcje "Kultura i wątki" i "Domeny kultury i aplikacji" na stronie referencyjnej CultureInfo .

Dotyczy

Zobacz też