CultureInfo.DefaultThreadCurrentUICulture Propriedade

Definição

Obtém ou define a cultura de interface padrão para threads no domínio de aplicação atual.

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; }
static member DefaultThreadCurrentUICulture : System.Globalization.CultureInfo with get, set
Public Shared Property DefaultThreadCurrentUICulture As CultureInfo

Valor de Propriedade

A cultura de UI padrão para threads no domínio de aplicação atual, ou null se a cultura de UI do sistema atual for a cultura de UI de threads padrão no domínio de aplicação.

Exceções

Numa operação conjunta, o valor da Name propriedade é inválido.

Exemplos

O exemplo seguinte ilustra o comportamento padrão do .NET na definição da cultura atual de uma nova thread. Utiliza recursos em inglês e russo. O seguinte ficheiro de texto denominado GreetingStrings.txt contém os recursos da língua inglesa:

greeting =Hello again!
newGreeting=Hello!

É compilado para um ficheiro binário .resources chamado GreetingStrings.resources usando o Gerador de Ficheiros de Recursos com o seguinte comando.

resgen greetingstrings.txt

O seguinte ficheiro de texto denominado GreetingStrings.ru-RU.txt contém os recursos em língua russa:

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

É compilado para um ficheiro binário .resources chamado GreetingStrings.ru-RU.resources usando o Gerador de Ficheiros de Recursos com o seguinte comando.

resgen greetingstrings.ru-RU.txt

O código da aplicação, mostrado abaixo, reside num ficheiro chamado Example1.vb ou Example1.cs. É compilado para um executável usando o seguinte comando para o compilador Visual Basic:

vbc Example1.vb /resource:GreetingStrings.resources

Para o compilador C#, o comando é semelhante:

csc /resource:GreetingStrings.resources Example1.cs

Isto cria um assembly que inclui o código executável do exemplo juntamente com os recursos para a sua cultura de reserva. Também pode usar o Assembly Linker para criar o ficheiro de recurso para a cultura russa (Rússia) com o seguinte comando:

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

No início, o exemplo define a cultura atual e a cultura atual da interface como russa (Rússia) em todos os sistemas, exceto naqueles em que a cultura padrão do sistema já é russa (Rússia). Se a cultura padrão do sistema já for russa (Rússia), o código define a cultura atual e a cultura atual da interface para inglês (Estados Unidos). Depois, chama a ShowGreeting rotina, que apresenta uma cadeia simples na primeira vez que é chamada e uma cadeia ligeiramente diferente nas chamadas de método seguintes. De seguida, cria um novo thread, que também executa a ShowGreeting rotina.

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!

Como mostra a saída do exemplo, quando o exemplo é executado num computador cuja cultura do sistema é inglesa (Estados Unidos), o thread principal apresenta a sua cadeia inicial em russo. No entanto, como a cultura da thread de trabalho deriva da cultura do sistema Windows atual e não da cultura da aplicação, a thread de trabalho apresenta a sua cadeia em inglês.

O exemplo seguinte utiliza as DefaultThreadCurrentCulture propriedades e DefaultThreadCurrentUICulture para definir a cultura atual e a cultura atual da interface de utilizador de uma nova thread de aplicação.

O exemplo utiliza os mesmos ficheiros de recursos do exemplo anterior. Os comandos para compilar e incorporar os recursos localizados em russo numa assembly de satélite também são idênticos, exceto que o nome da assembly executável muda.

No início, o exemplo define a cultura atual e a cultura atual da interface como russa (Rússia) em todos os sistemas, exceto naqueles em que a cultura padrão do sistema já é russa (Rússia). Se a cultura do sistema por defeito já for russa (Rússia), define a cultura atual e a cultura UI atual para inglês (Estados Unidos). Depois, chama a ShowGreeting rotina, que apresenta uma cadeia simples na primeira vez que é chamada e uma cadeia ligeiramente diferente nas chamadas de método seguintes. De seguida, cria um novo thread, que também executa a ShowGreeting rotina.

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:
'       Привет!
'       Еще раз привет!

Como a saída do exemplo mostra, quando o exemplo é executado num computador cuja cultura do sistema é inglesa (Estados Unidos), tanto o thread principal como o worker thread exibem as suas cadeias na língua russa.

Observações

No .NET Framework 4 e versões anteriores, por defeito, a cultura da interface de todos os threads está definida para a cultura do sistema Windows. Para aplicações cuja cultura atual de interface difere da cultura padrão do sistema, este comportamento é frequentemente indesejável. No .NET Framework 4.5+, a propriedade DefaultThreadCurrentUICulture permite-lhe definir a cultura de interface padrão de todos os threads num domínio de aplicação.

Importante

Se não definiu explicitamente a cultura da interface de quaisquer threads existentes a executar num domínio de aplicação, definir a DefaultThreadCurrentUICulture propriedade também altera a cultura desses threads. No entanto, se estas threads são executadas noutro domínio de aplicação, a sua cultura é definida pela DefaultThreadCurrentUICulture propriedade nesse domínio de aplicação ou, se não houver valor padrão definido, pela cultura do sistema padrão. Por isso, recomendamos que defina sempre explicitamente a cultura do seu thread principal de aplicação e que não dependa dessa DefaultThreadCurrentUICulture propriedade para definir a cultura do thread principal da aplicação.

A menos que seja definida explicitamente, o valor da propriedade DefaultThreadCurrentUICulture é null, e a cultura atual de todas as threads num domínio de aplicação que não receberam uma cultura explícita é definida pela cultura Windows sistema padrão.

Para mais informações sobre culturas, threads e domínios de aplicação, consulte as secções "Cultura e threads" e "Cultura e domínios de aplicação" de CultureInfo.

Aplica-se a

Ver também