Partilhar via


CultureInfo.DefaultThreadCurrentUICulture Propriedade

Definição

Obtém ou define a cultura padrão interface do usuário para threads no domínio do aplicativo 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; }
public static System.Globalization.CultureInfo? DefaultThreadCurrentUICulture { get; set; }
static member DefaultThreadCurrentUICulture : System.Globalization.CultureInfo with get, set
Public Shared Property DefaultThreadCurrentUICulture As CultureInfo

Valor da propriedade

A cultura padrão da interface do usuário para threads no domínio do aplicativo atual ou null se a cultura da interface do usuário do sistema atual for a cultura padrão para threads da interface do usuário no domínio do aplicativo.

Exceções

Em uma operação de conjuntos, o valor da propriedade Name é inválido.

Exemplos

O exemplo a seguir ilustra o comportamento padrão do .NET Framework na definição da cultura atual de um novo thread. Ele usa recursos de idioma inglês e russo. O seguinte arquivo de texto chamado GreetingStrings.txt contém os recursos de idioma inglês:

greeting =Hello again!
newGreeting=Hello!

Ele é compilado para um arquivo .resources binário chamado GreetingStrings.resources usando o Gerador de Arquivos de Recurso com o comando a seguir.

resgen greetingstrings.txt

O seguinte arquivo de texto chamado GreetingStrings.ru-RU.txt contém os recursos de idioma russo:

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

Ele é compilado para um arquivo .resources binário chamado GreetingStrings.ru-RU.resources usando o Gerador de Arquivos de Recurso com o comando a seguir.

resgen greetingstrings.ru-RU.txt

O código do aplicativo, que é mostrado abaixo, reside em um arquivo chamado Example1.vb ou Example1.cs. Ele é compilado para um executável usando o seguinte comando para o compilador do Visual Basic:

vbc Example1.vb /resource:GreetingStrings.resources

Para o compilador C#, o comando é semelhante:

csc /resource:GreetingStrings.resources Example1.cs

Isso cria um assembly que inclui o código executável do exemplo junto com os recursos para sua cultura de fallback. Você também pode usar o Assembly Linker para criar o arquivo 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

Na inicialização, o exemplo define a cultura atual e a cultura atual da interface do usuário como russa (Rússia) em todos os sistemas, exceto aqueles nos quais a cultura padrão do sistema já é russa (Rússia). Se a cultura do sistema padrão já for russa (Rússia), o código definirá a cultura atual e a cultura atual da interface do usuário como inglês (Estados Unidos). Em seguida, ele chama a ShowGreeting rotina, que exibe uma cadeia de caracteres simples na primeira vez que é chamada e uma cadeia de caracteres ligeiramente diferente em chamadas de método subsequentes. Em seguida, ele 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 em um computador cuja cultura do sistema é inglês (Estados Unidos), o thread main exibe sua cadeia de caracteres inicial em russo. No entanto, como a cultura do thread de trabalho é derivada da cultura atual do sistema Windows em vez da cultura atual do aplicativo, o thread de trabalho exibe sua cadeia de caracteres em inglês.

O exemplo a seguir usa as DefaultThreadCurrentCulture propriedades e DefaultThreadCurrentUICulture para definir a cultura atual e a cultura atual da interface do usuário de um novo thread de aplicativo.

O exemplo usa os mesmos arquivos de recursos que o exemplo anterior. Os comandos para compilar e inserir os recursos de idioma russo localizados em um assembly satélite também são idênticos, exceto que o nome do assembly executável é alterado.

Na inicialização, o exemplo define a cultura atual e a cultura atual da interface do usuário como russa (Rússia) em todos os sistemas, exceto aqueles nos quais a cultura padrão do sistema já é russa (Rússia). Se a cultura padrão do sistema já for russa (Rússia), ela definirá a cultura atual e a cultura atual da interface do usuário como inglês (Estados Unidos). Em seguida, ele chama a ShowGreeting rotina, que exibe uma cadeia de caracteres simples na primeira vez que é chamada e uma cadeia de caracteres ligeiramente diferente em chamadas de método subsequentes. Em seguida, ele 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 mostra a saída do exemplo, quando o exemplo é executado em um computador cuja cultura do sistema é inglês (Estados Unidos), tanto o thread main quanto o thread de trabalho exibem suas cadeias de caracteres no idioma russo.

Comentários

Nas versões .NET Framework 4 e anteriores, por padrão, a cultura da interface do usuário de todos os threads é definida como a cultura do sistema Windows. Para aplicativos cuja cultura de interface do usuário atual difere da cultura do sistema padrão, esse comportamento geralmente é indesejável. No .NET Framework 4.5, a DefaultThreadCurrentUICulture propriedade permite definir a cultura de interface do usuário padrão de todos os threads em um domínio de aplicativo.

Importante

Se você não definiu explicitamente a cultura da interface do usuário de nenhum thread existente em execução em um domínio de aplicativo, definir a DefaultThreadCurrentUICulture propriedade também alterará a cultura desses threads. No entanto, se esses threads forem executados em outro domínio de aplicativo, sua cultura será definida pela DefaultThreadCurrentUICulture propriedade nesse domínio de aplicativo ou, se nenhum valor padrão for definido, pela cultura do sistema padrão. Por isso, recomendamos que você sempre defina explicitamente a cultura do thread de aplicativo main e não dependa da DefaultThreadCurrentUICulture propriedade para definir a cultura do thread de aplicativo main.

A menos que seja definido explicitamente, o valor da DefaultThreadCurrentUICulture propriedade é nulle a cultura atual de todos os threads em um domínio de aplicativo que não foram atribuídos a uma cultura explícita é definida pela cultura padrão do sistema Windows.

Para obter mais informações sobre culturas, threads e domínios de aplicativos, consulte as seções "Cultura e threads" e "Domínios de cultura e aplicativo" na CultureInfo página de referência.

Aplica-se a

Confira também