CultureInfo Classe

Definição

Fornece informações sobre uma cultura específica (chamada de localidade para o desenvolvimento de código não gerenciado).Provides information about a specific culture (called a locale for unmanaged code development). As informações incluem os nomes da cultura, o sistema de escrita, o calendário usado, a ordem de classificação das cadeias de caracteres e a formatação de datas e números.The information includes the names for the culture, the writing system, the calendar used, the sort order of strings, and formatting for dates and numbers.

public ref class CultureInfo : ICloneable, IFormatProvider
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class CultureInfo : ICloneable, IFormatProvider
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
Public Class CultureInfo
Implements ICloneable, IFormatProvider
Herança
CultureInfo
Atributos
Implementações

Exemplos

O exemplo a seguir mostra como criar um objeto de CultureInfo para espanhol (Espanha) com a classificação internacional e outro objeto de CultureInfo com a classificação tradicional.The following example shows how to create a CultureInfo object for Spanish (Spain) with the international sort and another CultureInfo object with the traditional sort.

using namespace System;
using namespace System::Collections;
using namespace System::Globalization;
int main()
{
   
   // Creates and initializes the CultureInfo which uses the international sort.
   CultureInfo^ myCIintl = gcnew CultureInfo( "es-ES",false );
   
   // Creates and initializes the CultureInfo which uses the traditional sort.
   CultureInfo^ myCItrad = gcnew CultureInfo( 0x040A,false );
   
   // Displays the properties of each culture.
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL" );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl->CompareInfo, myCItrad->CompareInfo );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl->DisplayName, myCItrad->DisplayName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl->EnglishName, myCItrad->EnglishName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl->IsNeutralCulture, myCItrad->IsNeutralCulture );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl->IsReadOnly, myCItrad->IsReadOnly );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "LCID", myCIintl->LCID, myCItrad->LCID );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "Name", myCIintl->Name, myCItrad->Name );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl->NativeName, myCItrad->NativeName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "Parent", myCIintl->Parent, myCItrad->Parent );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl->TextInfo, myCItrad->TextInfo );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl->ThreeLetterISOLanguageName, myCItrad->ThreeLetterISOLanguageName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl->ThreeLetterWindowsLanguageName, myCItrad->ThreeLetterWindowsLanguageName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl->TwoLetterISOLanguageName, myCItrad->TwoLetterISOLanguageName );
   Console::WriteLine();
   
   // Compare two strings using myCIintl -> 
   Console::WriteLine( "Comparing \"llegar\" and \"lugar\"" );
   Console::WriteLine( "   With myCIintl -> CompareInfo -> Compare: {0}", myCIintl->CompareInfo->Compare( "llegar", "lugar" ) );
   Console::WriteLine( "   With myCItrad -> CompareInfo -> Compare: {0}", myCItrad->CompareInfo->Compare( "llegar", "lugar" ) );
}

/*
This code produces the following output.

PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
DisplayName                    Spanish (Spain)                                Spanish (Spain)          
EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
IsNeutralCulture               False                                          False                    
IsReadOnly                     False                                          False                    
LCID                           3082                                           1034                     
Name                           es-ES                                          es-ES                    
NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
Parent                         es                                             es                       
TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
ThreeLetterISOLanguageName     spa                                            spa                      
ThreeLetterWindowsLanguageName ESN                                            ESP                      
TwoLetterISOLanguageName       es                                             es                       

Comparing "llegar" and "lugar"
   With myCIintl -> CompareInfo -> Compare: -1
   With myCItrad -> CompareInfo -> Compare: 1

*/
using System;
using System.Collections;
using System.Globalization;

public class SamplesCultureInfo
{

   public static void Main()
   {

      // Creates and initializes the CultureInfo which uses the international sort.
      CultureInfo myCIintl = new CultureInfo("es-ES", false);

      // Creates and initializes the CultureInfo which uses the traditional sort.
      CultureInfo myCItrad = new CultureInfo(0x040A, false);

      // Displays the properties of each culture.
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL");
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl.CompareInfo, myCItrad.CompareInfo);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl.DisplayName, myCItrad.DisplayName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl.EnglishName, myCItrad.EnglishName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl.IsNeutralCulture, myCItrad.IsNeutralCulture);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl.IsReadOnly, myCItrad.IsReadOnly);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "LCID", myCIintl.LCID, myCItrad.LCID);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Name", myCIintl.Name, myCItrad.Name);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl.NativeName, myCItrad.NativeName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Parent", myCIintl.Parent, myCItrad.Parent);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl.TextInfo, myCItrad.TextInfo);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl.ThreeLetterISOLanguageName, myCItrad.ThreeLetterISOLanguageName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl.ThreeLetterWindowsLanguageName, myCItrad.ThreeLetterWindowsLanguageName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl.TwoLetterISOLanguageName, myCItrad.TwoLetterISOLanguageName);
      Console.WriteLine();

      // Compare two strings using myCIintl.
      Console.WriteLine("Comparing \"llegar\" and \"lugar\"");
      Console.WriteLine("   With myCIintl.CompareInfo.Compare: {0}", myCIintl.CompareInfo.Compare("llegar", "lugar"));
      Console.WriteLine("   With myCItrad.CompareInfo.Compare: {0}", myCItrad.CompareInfo.Compare("llegar", "lugar"));

   }

}

/*
This code produces the following output.

PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
DisplayName                    Spanish (Spain)                                Spanish (Spain)          
EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
IsNeutralCulture               False                                          False                    
IsReadOnly                     False                                          False                    
LCID                           3082                                           1034                     
Name                           es-ES                                          es-ES                    
NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
Parent                         es                                             es                       
TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
ThreeLetterISOLanguageName     spa                                            spa                      
ThreeLetterWindowsLanguageName ESN                                            ESP                      
TwoLetterISOLanguageName       es                                             es                       

Comparing "llegar" and "lugar"
   With myCIintl.CompareInfo.Compare: -1
   With myCItrad.CompareInfo.Compare: 1

*/
Imports System.Collections
Imports System.Globalization

Module Module1

    Public Sub Main()

        ' Creates and initializes the CultureInfo which uses the international sort.
        Dim myCIintl As New CultureInfo("es-ES", False)

        ' Creates and initializes the CultureInfo which uses the traditional sort.
        Dim myCItrad As New CultureInfo(&H40A, False)

        ' Displays the properties of each culture.
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL")
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl.CompareInfo, myCItrad.CompareInfo)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl.DisplayName, myCItrad.DisplayName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl.EnglishName, myCItrad.EnglishName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl.IsNeutralCulture, myCItrad.IsNeutralCulture)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl.IsReadOnly, myCItrad.IsReadOnly)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "LCID", myCIintl.LCID, myCItrad.LCID)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Name", myCIintl.Name, myCItrad.Name)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl.NativeName, myCItrad.NativeName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Parent", myCIintl.Parent, myCItrad.Parent)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl.TextInfo, myCItrad.TextInfo)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl.ThreeLetterISOLanguageName, myCItrad.ThreeLetterISOLanguageName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl.ThreeLetterWindowsLanguageName, myCItrad.ThreeLetterWindowsLanguageName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl.TwoLetterISOLanguageName, myCItrad.TwoLetterISOLanguageName)
        Console.WriteLine()

        ' Compare two strings using myCIintl.
        Console.WriteLine("Comparing ""llegar"" and ""lugar""")
        Console.WriteLine("   With myCIintl.CompareInfo.Compare: {0}", myCIintl.CompareInfo.Compare("llegar", "lugar"))
        Console.WriteLine("   With myCItrad.CompareInfo.Compare: {0}", myCItrad.CompareInfo.Compare("llegar", "lugar"))

    End Sub



'This code produces the following output.
'
'PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
'CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
'DisplayName                    Spanish (Spain)                                Spanish (Spain)          
'EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
'IsNeutralCulture               False                                          False                    
'IsReadOnly                     False                                          False                    
'LCID                           3082                                           1034                     
'Name                           es-ES                                          es-ES                    
'NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
'Parent                         es                                             es                       
'TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
'ThreeLetterISOLanguageName     spa                                            spa                      
'ThreeLetterWindowsLanguageName ESN                                            ESP                      
'TwoLetterISOLanguageName       es                                             es                       
'
'Comparing "llegar" and "lugar"
'   With myCIintl.CompareInfo.Compare: -1
'   With myCItrad.CompareInfo.Compare: 1

End Module

Comentários

A classe CultureInfo fornece informações específicas de cultura, como linguagem, subidioma, país/região, calendário e convenções associadas a uma cultura específica.The CultureInfo class provides culture-specific information, such as the language, sublanguage, country/region, calendar, and conventions associated with a particular culture. Essa classe também fornece acesso a instâncias específicas de cultura dos objetos DateTimeFormatInfo, NumberFormatInfo, CompareInfoe TextInfo.This class also provides access to culture-specific instances of the DateTimeFormatInfo, NumberFormatInfo, CompareInfo, and TextInfo objects. Esses objetos contêm as informações necessárias para operações específicas de cultura, como maiúsculas e minúsculas, formatação de datas e números e comparação de cadeias de caracteres.These objects contain the information required for culture-specific operations, such as casing, formatting dates and numbers, and comparing strings. A classe CultureInfo é usada direta ou indiretamente por classes que formatam, analisam ou manipulam dados específicos de cultura, como String, DateTime, DateTimeOffsete os tipos numéricos.The CultureInfo class is used either directly or indirectly by classes that format, parse, or manipulate culture-specific data, such as String, DateTime, DateTimeOffset, and the numeric types.

Nesta seção:In this section:

Nomes de cultura e identificadores Culture names and identifiers
Culturas invariáveis, neutras e específicas Invariant, neutral, and specific cultures
culturas personalizadasCustom cultures
de dados de cultura dinâmicaDynamic culture data
Dados em CultureInfo e cultural a cultura atual e a cultura da interface do usuário atual CultureInfo and cultural data The current culture and current UI culture
Obtendo todas as culturas Getting all cultures
Cultura e threads Culture and threads
Domínios de cultura e de aplicativo Culture and application domains
Operações assíncronas baseadas em tarefas e em cultura Culture and task-based asynchronous operations
de serialização de objeto CultureInfoCultureInfo object serialization
O painel de controle substitui Control Panel overrides
de ordens de classificação alternativasAlternate sort orders
Aplicativos de cultura e do WindowsCulture and Windows apps

Nomes de cultura e identificadoresCulture names and identifiers

A classe CultureInfo especifica um nome exclusivo para cada cultura, com base no RFC 4646.The CultureInfo class specifies a unique name for each culture, based on RFC 4646. O nome é uma combinação de um código de cultura de letras minúsculas ISO 639 2, associado a um idioma e um código de subcultura em maiúsculas ISO de letra de 3166 2 associado a um país ou região.The name is a combination of an ISO 639 two-letter lowercase culture code associated with a language and an ISO 3166 two-letter uppercase subculture code associated with a country or region. Além disso, para aplicativos direcionados .NET Framework 4.NET Framework 4 ou posterior e que estão sendo executados no Windows 10 ou posterior, os nomes de cultura que correspondem a marcas de idioma BCP-47 válidos têm suporte.In addition, for apps that target .NET Framework 4.NET Framework 4 or later and are running under Windows 10 or later, culture names that correspond to valid BCP-47 language tags are supported.

Observação

Quando um nome de cultura é passado para um construtor de classe ou um método como CreateSpecificCulture ou CultureInfo, seu caso não é significativo.When a culture name is passed to a class constructor or a method such as CreateSpecificCulture or CultureInfo, its case is not significant.

O formato do nome de cultura baseado em RFC 4646 é languagecode2>-Country/regioncode2, em que languagecode2 é o código de idioma de duas letras e Country/regioncode2 é o código de subcultura de duas letras.The format for the culture name based on RFC 4646 is languagecode2>-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two-letter subculture code. Os exemplos incluem ja-JP para japonês (Japão) e en-US para inglês (Estados Unidos).Examples include ja-JP for Japanese (Japan) and en-US for English (United States). Nos casos em que um código de idioma de duas letras não está disponível, um código de três letras derivado de ISO 639-2 é usado.In cases where a two-letter language code is not available, a three-letter code derived from ISO 639-2 is used.

Observe que alguns nomes de cultura também especificam um script ISO 15924.Note that some culture names also specify an ISO 15924 script. Por exemplo, Cyrl especifica o script cirílico e Latn especifica o script Latin.For example, Cyrl specifies the Cyrillic script and Latn specifies the Latin script. Um nome de cultura que inclui um script usa o padrão languagecode2-scripttag-Country/regioncode2.A culture name that includes a script uses the pattern languagecode2-scripttag-country/regioncode2. Um exemplo desse tipo de nome de cultura é uz-Cyrl-UZ para Uzbeque (cirílico, Uzbequistão).An example of this type of culture name is uz-Cyrl-UZ for Uzbek (Cyrillic, Uzbekistan). Em sistemas operacionais Windows anteriores ao Windows Vista, um nome de cultura que inclui um script usa o padrão languagecode2-país/regioncode2-scripttag, por exemplo, uz-uz-Cyrl para Uzbeque (cirílico, Uzbequistão ).On Windows operating systems before Windows Vista, a culture name that includes a script uses the pattern languagecode2-country/regioncode2-scripttag, for example, uz-UZ-Cyrl for Uzbek (Cyrillic, Uzbekistan).

Uma cultura neutra é especificada apenas pelo código de idioma de duas letras minúsculas.A neutral culture is specified by only the two-letter lowercase language code. Por exemplo, fr especifica a cultura neutra para francês e de especifica a cultura neutra para o alemão.For example, fr specifies the neutral culture for French, and de specifies the neutral culture for German.

Observação

Há dois nomes de cultura que contradiz esta regra.There are two culture names that contradict this rule. O chinês de culturas (simplificado), chamado zh-Hans e chinês (tradicional), chamado de zh-Hant, são culturas neutras.The cultures Chinese (Simplified), named zh-Hans, and Chinese (Traditional), named zh-Hant, are neutral cultures. Os nomes de cultura representam o padrão atual e devem ser usados, a menos que você tenha um motivo para usar os nomes mais antigos zh-CHS e zh-CHT.The culture names represent the current standard and should be used unless you have a reason for using the older names zh-CHS and zh-CHT.

Um identificador de cultura é uma abreviação numérica internacional padrão e tem os componentes necessários para identificar exclusivamente uma das culturas instaladas.A culture identifier is a standard international numeric abbreviation and has the components necessary to uniquely identify one of the installed cultures. Seu aplicativo pode usar identificadores de cultura predefinidos ou definir identificadores personalizados.Your application can use predefined culture identifiers or define custom identifiers.

Determinados nomes de cultura predefinidos e identificadores são usados por essa e outras classes no namespace System.Globalization.Certain predefined culture names and identifiers are used by this and other classes in the System.Globalization namespace. Para obter informações detalhadas de cultura para sistemas Windows, consulte a coluna marca de idioma na lista de idiomas/nomes de região com suporte no Windows.For detailed culture information for Windows systems, see the Language tag column in the list of language/region names supported by Windows. Os nomes de cultura seguem o padrão definido pelo BCP 47.Culture names follow the standard defined by BCP 47.

Lembre-se de que os nomes e identificadores de cultura representam apenas um subconjunto de culturas que podem ser encontradas em um determinado computador.Remember that the culture names and identifiers represent only a subset of cultures that can be found on a particular computer. As versões ou os Service Packs do Windows podem alterar as culturas disponíveis.Windows versions or service packs can change the available cultures. Os aplicativos adicionam culturas personalizadas usando a classe CultureAndRegionInfoBuilder.Applications add custom cultures using the CultureAndRegionInfoBuilder class. Os usuários adicionam suas próprias culturas personalizadas usando a ferramenta Microsoft Locale Builder.Users add their own custom cultures using the Microsoft Locale Builder tool. O Microsoft Locale Builder é escrito em código gerenciado usando a classe CultureAndRegionInfoBuilder.Microsoft Locale Builder is written in managed code using the CultureAndRegionInfoBuilder class.

Vários nomes distintos estão fortemente associados a uma cultura, notavelmente os nomes associados aos seguintes membros de classe:Several distinct names are closely associated with a culture, notably the names associated with the following class members:

Culturas invariáveis, neutras e específicasInvariant, neutral, and specific cultures

As culturas geralmente são agrupadas em três conjuntos: culturas invariáveis, culturas neutras e culturas específicas.The cultures are generally grouped into three sets: invariant cultures, neutral cultures, and specific cultures.

Uma cultura invariável é não diferenciação de cultura.An invariant culture is culture-insensitive. Seu aplicativo especifica a cultura invariável pelo nome usando uma cadeia de caracteres vazia ("") ou por seu identificador.Your application specifies the invariant culture by name using an empty string ("") or by its identifier. InvariantCulture define uma instância da cultura invariável.InvariantCulture defines an instance of the invariant culture. Ele está associado ao idioma inglês, mas não com qualquer país/região.It is associated with the English language but not with any country/region. Ele é usado em quase qualquer método no namespace Globalization que requer uma cultura.It is used in almost any method in the Globalization namespace that requires a culture.

Uma cultura neutra é uma cultura associada a uma linguagem, mas não com um país/região.A neutral culture is a culture that is associated with a language but not with a country/region. Uma cultura específica é uma cultura associada a um idioma e a um país/região.A specific culture is a culture that is associated with a language and a country/region. Por exemplo, fr é o nome neutro para a cultura francesa e fr-FR é o nome da cultura francesa (França) específica.For example, fr is the neutral name for the French culture, and fr-FR is the name of the specific French (France) culture. Observe que o chinês (simplificado) e o chinês (tradicional) também são considerados culturas neutras.Note that Chinese (Simplified) and Chinese (Traditional) are also considered neutral cultures.

Não é recomendável criar uma instância de uma classe CompareInfo para uma cultura neutra porque os dados que ela contém são arbitrários.Creating an instance of a CompareInfo class for a neutral culture is not recommended because the data it contains is arbitrary. Para exibir e classificar dados, especifique o idioma e a região.To display and sort data, specify both the language and region. Além disso, a propriedade Name de um objeto CompareInfo criado para uma cultura neutra retorna apenas o país e não inclui a região.Additionally, the Name property of a CompareInfo object created for a neutral culture returns only the country and does not include the region.

As culturas definidas têm uma hierarquia na qual o pai de uma cultura específica é uma cultura neutra e o pai de uma cultura neutra é a cultura invariável.The defined cultures have a hierarchy in which the parent of a specific culture is a neutral culture and the parent of a neutral culture is the invariant culture. A propriedade Parent contém a cultura neutra associada a uma cultura específica.The Parent property contains the neutral culture associated with a specific culture. Culturas personalizadas devem definir a propriedade Parent em conformidade com esse padrão.Custom cultures should define the Parent property in conformance with this pattern.

Se os recursos para uma cultura específica não estiverem disponíveis no sistema operacional, os recursos para a cultura neutra associada serão usados.If the resources for a specific culture are not available in the operating system, the resources for the associated neutral culture are used. Se os recursos para a cultura neutra não estiverem disponíveis, os recursos inseridos no assembly principal serão usados.If the resources for the neutral culture are not available, the resources embedded in the main assembly are used. Para obter mais informações sobre o processo de fallback de recursos, consulte empacotando e implantando recursos.For more information on the resource fallback process, see Packaging and Deploying Resources.

A lista de localidades na API do Windows é ligeiramente diferente da lista de culturas suportadas pelo .NET Framework.The list of locales in the Windows API is slightly different from the list of cultures supported by the .NET Framework. Se a interoperabilidade com o Windows for necessária, por exemplo, por meio do mecanismo p/Invoke, o aplicativo deverá usar uma cultura específica que é definida para o sistema operacional.If interoperability with Windows is required, for example, through the p/invoke mechanism, the application should use a specific culture that is defined for the operating system. O uso da cultura específica garante a consistência com a localidade equivalente do Windows, que é identificada com um identificador de localidade que é o mesmo que LCID.Use of the specific culture ensures consistency with the equivalent Windows locale, which is identified with a locale identifier that is the same as LCID.

Um DateTimeFormatInfo ou um NumberFormatInfo pode ser criado somente para a cultura invariável ou para culturas específicas, não para culturas neutras.A DateTimeFormatInfo or a NumberFormatInfo can be created only for the invariant culture or for specific cultures, not for neutral cultures.

Se DateTimeFormatInfo.Calendar for o TaiwanCalendar, mas o Thread.CurrentCulture não estiver definido como zh-TW, DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraNamee DateTimeFormatInfo.GetAbbreviatedEraName retornará uma cadeia de caracteres vazia ("").If DateTimeFormatInfo.Calendar is the TaiwanCalendar but the Thread.CurrentCulture is not set to zh-TW, then DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraName, and DateTimeFormatInfo.GetAbbreviatedEraName return an empty string ("").

Culturas personalizadasCustom cultures

Além das culturas predefinidas com suporte pelo sistema operacional Windows e o .NET Framework, o .NET Framework dá suporte a três tipos de culturas personalizadas:In addition to the predefined cultures supported by the Windows operating system and the .NET Framework, the .NET Framework supports three types of custom cultures:

  • Novas culturas que complementam as culturas disponíveis no Windows ou na .NET Framework.New cultures that supplement the cultures available in Windows or the .NET Framework. Por exemplo, um aplicativo pode instalar um objeto CultureInfo que representa a cultura FJ-FJ (ou Fijan (Fiji) em um sistema.For example, an application could install a CultureInfo object that represents the fj-FJ (or Fijan (Fiji)) culture on a system.

  • Culturas substitutas cujas propriedades são diferentes das propriedades das culturas padrão com suporte no Windows e na .NET Framework.Replacement cultures whose properties are different from the properties of the standard cultures supported by Windows and the .NET Framework.

  • Culturas padrão com substituições de usuário.Standard cultures with user overrides. O usuário pode usar o aplicativo região e idioma no painel de controle para personalizar os valores de propriedade de uma cultura existente.The user can use the Region and Language application in Control Panel to customize an existing culture's property values.

Observação

Você pode usar a classe CultureAndRegionInfoBuilder para definir, salvar e registrar culturas personalizadas que complementam ou substituem culturas existentes.You can use the CultureAndRegionInfoBuilder class to define, save, and register custom cultures that either supplement or replace existing cultures. O método CultureAndRegionInfoBuilder.Save cria um arquivo LDML (linguagem de marcação de dados de localidade) que pode ser usado para instalar uma cultura personalizada nos sistemas de destino.The CultureAndRegionInfoBuilder.Save method creates a Locale Data Markup Language (LDML) file that can be used to install a custom culture on target systems. Para obter informações detalhadas sobre como usar a classe CultureAndRegionInfoBuilder para criar uma cultura nova ou substituta, consulte o tópico CultureAndRegionInfoBuilder classe.For step-by step information on using the CultureAndRegionInfoBuilder class to create a new or replacement culture, see the CultureAndRegionInfoBuilder class topic.

Como o .NET Framework dá suporte a culturas personalizadas, você deve considerar o seguinte ao trabalhar com dados específicos de cultura:Because the .NET Framework supports custom cultures, you should consider the following when working with culture-specific data:

  • Culturas personalizadas podem ter valores que excedam os intervalos das culturas predefinidas.Custom cultures can have values that exceed the ranges of the predefined cultures. Por exemplo, algumas culturas têm nomes de mês muito longos, formatos de data ou hora inesperados ou outros dados incomuns.For example, some cultures have unusually long month names, unexpected date or time formats, or other unusual data.

  • Ao exibir dados específicos de cultura na interface do usuário, você deve respeitar as personalizações do usuário; por exemplo, o usuário pode querer um relógio de 24 horas ou um formato de data de AAAAMMDD.When you display culture-specific data in the user interface, you should respect the user's customizations; for example, the user might want a 24-hour clock or a yyyyMMdd date format.

  • Lembre-se de que culturas personalizadas substituem valores padrão.Remember that custom cultures override default values. Portanto, você não pode considerar que os dados de cultura sejam estáveis.Therefore, you cannot consider culture data to be stable. Os nomes de país, os formatos de número e de data e as ortografias podem ser alterados no futuro.Country names, number and date formats, and spellings may change in the future. Se você quiser serializar dados sensíveis à cultura, como cadeias de caracteres de data e hora a serem passadas para as funções de análise de data e hora, use a cultura invariável ou uma específica.If you want to serialize culture-sensitive data such as date and time strings to be passed to the date and time parsing functions, you should use the invariant culture or a specific .

O valor da propriedade CultureTypes de culturas personalizadas instaladas em um sistema inclui o sinalizador System.Globalization.CultureTypes e culturas personalizadas são atribuídas a um valor de propriedade LCID LOCALE_CUSTOM_UNSPECIFIED (0x1000 ou 4096).The CultureTypes property value of custom cultures installed on a system includes the System.Globalization.CultureTypes flag, and custom cultures are assigned an LCID property value of LOCALE_CUSTOM_UNSPECIFIED (0x1000, or 4096). Observe que, a partir do Windows 10, esse valor também é atribuído a culturas definidas pelo sistema que não possuem dados culturais completos.Note that, starting with Windows 10, this value is also assigned to system-defined cultures that lack complete cultural data.

CultureInfo e dados culturaisCultureInfo and cultural data

O .NET deriva seus dados culturais de uma variedade de fontes, dependendo da implementação, da plataforma e da versão:.NET derives its cultural data from a one of a variety of sources, depending on implementation, platform, and version:

  • No .NET Framework 3,5 e versões anteriores, os dados culturais são fornecidos pelo sistema operacional Windows e pelo .NET Framework.In .NET Framework 3.5 and earlier versions, cultural data is provided by both the Windows operating system and the .NET Framework.

  • No .NET Framework 4 e versões posteriores, os dados culturais são fornecidos pelo sistema operacional Windows.In .NET Framework 4 and later versions, cultural data is provided by the Windows operating system.

  • Em todas as versões do .NET Core em execução no Windows, os dados culturais são fornecidos pelo sistema operacional Windows.In all versions of .NET Core running on Windows, cultural data is provided by the Windows operating system.

  • Em todas as versões do .NET Core em execução em plataformas UNIX, os dados culturais são fornecidos pela biblioteca do ICU (componentes internacionais para Unicode).In all versions of .NET Core running on Unix platforms, cultural data is provided by the International Components for Unicode (ICU) Library. A versão específica da biblioteca ICU depende do sistema operacional individual.The specific version of the ICU Library depends on the individual operating system.

Por isso, uma cultura disponível em uma implementação, plataforma ou versão específica do .NET pode não estar disponível em uma implementação, plataforma ou versão diferentes do .NET.Because of this, a culture available on a particular .NET implementation, platform, or version may not be available on a different .NET implementation, platform, or version.

Alguns objetos de CultureInfo diferem dependendo da plataforma subjacente.Some CultureInfo objects differ depending on the underlying platform. Em particular, "zh-CN" ou chinês (simplificado, China) e zh-TW, ou chinês (tradicional, Taiwan), são culturas disponíveis em sistemas Windows, mas são culturas com alias em sistemas UNIX.In particular, "zh-CN", or Chinese (Simplified, China) and zh-TW, or Chinese (Traditional, Taiwan), are available cultures on Windows systems, but they are aliased cultures on Unix systems. "zh-CN" é um alias para a cultura "zh-Hans-CN" e "zh-TW" é um alias para a cultura "zh-Hant-TW"."zh-CN" is an alias for the "zh-Hans-CN" culture, and "zh-TW" is an alias for the "zh-Hant-TW" culture. Culturas com alias não são retornadas por chamadas para o método GetCultures e podem ter valores de propriedade diferentes, incluindo diferentes culturas de Parent, do que suas contrapartes do Windows.Aliased cultures are not returned by calls to the GetCultures method and may have different property values, including different Parent cultures, than their Windows counterparts. Para as culturas zh-CN e zh-TW, esses differenes incluem o seguinte:For the zh-CN and zh-TW cultures, these differenes include the following:

  • Em sistemas Windows, a cultura pai da cultura "zh-CN" é "zh-Hans" e a cultura pai da cultura "zh-TW" é "zh-Hant".On Windows systems, the parent culture of the "zh-CN" culture is "zh-Hans", and the parent culture of the "zh-TW" culture is "zh-Hant". A cultura pai de ambas as culturas é "zh".The parent culture of both these cultures is "zh". Em sistemas UNIX, os pais de ambas as culturas são "zh".On Unix systems, the parents of both cultures are "zh". Isso significa que, se você não fornecer recursos específicos de cultura para as culturas "zh-CN" ou "zh-TW", mas fornecer recursos para a cultura neutra "zh-Hans" ou "zh-Hant", seu aplicativo carregará os recursos para a cultura neutra no Windows, mas não no UNIX .This means that, if you don't provide culture-specific resources for the "zh-CN" or "zh-TW" cultures but do provide a resources for the neutral "zh-Hans" or "zh-Hant" culture, your application will load the resources for the neutral culture on Windows but not on Unix. Em sistemas UNIX, você deve definir explicitamente o CurrentUICulture do thread como "zh-Hans" ou "zh-Hant".On Unix systems, you must explicitly set the thread's CurrentUICulture to either "zh-Hans" or "zh-Hant".

  • Em sistemas Windows, chamar CultureInfo.Equals em uma instância que representa a cultura "zh-CN" e passá-lo uma instância "zh-Hans-CN" retorna true.On Windows systems, calling CultureInfo.Equals on an instance that represents the "zh-CN" culture and passing it a "zh-Hans-CN" instance returns true. Em sistemas UNIX, a chamada do método retorna false.On Unix systems, the method call returns false. Esse comportamento também se aplica à chamada de Equals em uma instância de CultureInfo "zh-TW" e passando-a uma instância "zh-Hant-TW".This behavior also applies to calling Equals on a "zh-TW" CultureInfo instance and passing it a "zh-Hant-Tw" instance.

Dados de cultura dinâmicaDynamic culture data

Exceto para a cultura invariável, os dados de cultura são dinâmicos.Except for the invariant culture, culture data is dynamic. Isso é verdadeiro mesmo para as culturas predefinidas.This is true even for the predefined cultures. Por exemplo, países ou regiões adotam novas moedas, alteram suas grafias de palavras ou alteram seu calendário preferido, e as definições de cultura mudam para acompanhar isso.For example, countries or regions adopt new currencies, change their spellings of words, or change their preferred calendar, and culture definitions change to track this. Culturas personalizadas estão sujeitas a alterações sem aviso prévio e qualquer cultura específica pode ser substituída por uma cultura de substituição personalizada.Custom cultures are subject to change without notice, and any specific culture might be overridden by a custom replacement culture. Além disso, conforme discutido abaixo, um usuário individual pode substituir as preferências culturais.Also, as discussed below, an individual user can override cultural preferences. Os aplicativos sempre devem obter dados de cultura em tempo de execução.Applications should always obtain culture data at run time.

Cuidado

Ao salvar dados, seu aplicativo deve usar a cultura invariável, um formato binário ou um formato independente de cultura específico.When saving data, your application should use the invariant culture, a binary format, or a specific culture-independent format. Os dados salvos de acordo com os valores atuais associados a uma cultura específica, além da cultura invariável, podem se tornar ilegíveis ou podem mudar de significado se essa cultura for alterada.Data saved according to the current values associated with a particular culture, other than the invariant culture, might become unreadable or might change in meaning if that culture changes.

A cultura atual e a cultura da interface do usuário atualThe current culture and current UI culture

Cada thread em um aplicativo .NET tem uma cultura atual e uma cultura de interface do usuário atual.Every thread in a .NET application has a current culture and a current UI culture. A cultura atual determina as convenções de formatação para datas, horas, números e valores de moeda, a ordem de classificação de texto, convenções de maiúsculas e minúsculas nas quais as cadeias de caracteres são comparadas.The current culture determines the formatting conventions for dates, times, numbers, and currency values, the sort order of text, casing conventions, and the ways in which strings are compared. A cultura da interface do usuário atual é usada para recuperar recursos específicos de cultura em tempo de execução.The current UI culture is used to retrieve culture-specific resources at runtime.

Observação

Para obter informações sobre como a cultura da interface do usuário atual e atual é determinada por thread, consulte a seção Culture and threads .For information on how the current and current UI culture is determined on a per-thread basis, see the Culture and threads section. Para obter informações sobre como a cultura da interface do usuário atual e atual é determinada em threads em execução em um novo domínio de aplicativo e em threads que cruzam os limites de domínio do aplicativo, consulte a seção domínios de aplicativo e cultura .For information on how the current and current UI culture is determined on threads executing in a new application domain, and on threads that cross application domain boundaries, see the Culture and application domains section. Para obter informações sobre como o atual e o atual são determinados em threads que executam operações assíncronas baseadas em tarefas, consulte a seção operações assíncronas baseadas em tarefas e de cultura .For information on how the current and current is determined on threads performing task-based asynchronous operations, see the Culture and task-based asynchronous operations section.

Para obter informações mais detalhadas sobre a cultura atual, consulte o tópico da propriedade CultureInfo.CurrentCulture.For more detailed information on the current culture, see the CultureInfo.CurrentCulture property topic. Para obter informações mais detalhadas sobre a cultura da interface do usuário atual, consulte o tópico da propriedade CultureInfo.CurrentUICulture.For more detailed information on the current UI culture, see the CultureInfo.CurrentUICulture property topic.

Recuperando as culturas de interface do usuário atuais e atuaisRetrieving the current and current UI cultures

Você pode obter um objeto CultureInfo que representa a cultura atual de uma das duas maneiras:You can get a CultureInfo object that represents the current culture in either of two ways:

O exemplo a seguir recupera os dois valores de propriedade, compara-os para mostrar que eles são iguais e exibe o nome da cultura atual.The following example retrieves both property values, compares them to show that they are equal, and displays the name of the current culture.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      CultureInfo culture1 = CultureInfo.CurrentCulture;
      CultureInfo culture2 = Thread.CurrentThread.CurrentCulture;
      Console.WriteLine("The current culture is {0}", culture1.Name);
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        culture1 == culture2);
   }
}
// The example displays output like the following:
//     The current culture is en-US
//     The two CultureInfo objects are equal: True
Imports System.Globalization
Imports System.Threading

Module Example
   Public Sub Main()
      Dim culture1 As CultureInfo = CultureInfo.CurrentCulture
      Dim culture2 As CultureInfo = Thread.CurrentThread.CurrentCulture
      Console.WriteLine("The current culture is {0}", culture1.Name)
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        culture1.Equals(culture2))
   End Sub
End Module
' The example displays output like the following:
'     The current culture is en-US
'     The two CultureInfo objects are equal: True

Você pode obter um objeto CultureInfo que representa a cultura da interface do usuário atual de uma das duas maneiras:You can get a CultureInfo object that represents the current UI culture in either of two ways:

O exemplo a seguir recupera os dois valores de propriedade, compara-os para mostrar que eles são iguais e exibe o nome da cultura da interface do usuário atual.The following example retrieves both property values, compares them to show that they are equal, and displays the name of the current UI culture.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      CultureInfo uiCulture1 = CultureInfo.CurrentUICulture;
      CultureInfo uiCulture2 = Thread.CurrentThread.CurrentUICulture;
      Console.WriteLine("The current UI culture is {0}", uiCulture1.Name);
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        uiCulture1 == uiCulture2);
   }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The two CultureInfo objects are equal: True
Imports System.Globalization
Imports System.Threading

Module Example
   Public Sub Main()
      Dim uiCulture1 As CultureInfo = CultureInfo.CurrentUICulture
      Dim uiCulture2 As CultureInfo = Thread.CurrentThread.CurrentUICulture
      Console.WriteLine("The current UI culture is {0}", uiCulture1.Name)
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        uiCulture1.Equals(uiCulture2))
   End Sub
End Module
' The example displays output like the following:
'     The current UI culture is en-US
'     The two CultureInfo objects are equal: True

Definindo as culturas de interface do usuário atuais e atuaisSetting the current and current UI cultures

Para alterar a cultura e a cultura da interface do usuário de um thread, faça o seguinte:To change the culture and UI culture of a thread, do the following:

  1. Crie uma instância de um objeto CultureInfo que represente a cultura chamando um construtor de classe CultureInfo e passando-o o nome da cultura.Instantiate a CultureInfo object that represents that culture by calling a CultureInfo class constructor and passing it the name of the culture. O Construtor CultureInfo(String) instancia um objeto CultureInfo que reflete as substituições do usuário se a nova cultura for a mesma que a cultura atual do Windows.The CultureInfo(String) constructor instantiates a CultureInfo object that reflects user overrides if the new culture is the same as the current Windows culture. O Construtor CultureInfo(String, Boolean) permite que você especifique se o objeto de CultureInfo instanciado recentemente reflete as substituições do usuário se a nova cultura for a mesma que a cultura atual do Windows.The CultureInfo(String, Boolean) constructor allows you to specify whether the newly instantiated CultureInfo object reflects user overrides if the new culture is the same as the current Windows culture.

  2. Atribua o objeto CultureInfo à propriedade CultureInfo.CurrentCulture ou CultureInfo.CurrentUICulture no .NET Core e .NET Framework 4,6 e versões posteriores.Assign the CultureInfo object to the CultureInfo.CurrentCulture or CultureInfo.CurrentUICulture property on .NET Core and .NET Framework 4.6 and later versions. (Em .NET Framework 4.5.2 e versões anteriores, youc atribuir o objeto CultureInfo à propriedade Thread.CurrentCulture ou Thread.CurrentUICulture.)(On .NET Framework 4.5.2 and earlier versions, youc an assign the CultureInfo object to the Thread.CurrentCulture or Thread.CurrentUICulture property.)

O exemplo a seguir recupera a cultura atual.The following example retrieves the current culture. Se for algo diferente da cultura francesa (França), ele alterará a cultura atual para francês (França).If it is anything other than the French (France) culture, it changes the current culture to French (France). Caso contrário, ele altera a cultura atual para francês (Luxemburgo).Otherwise, it changes the current culture to French (Luxembourg).

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo current = CultureInfo.CurrentCulture;
      Console.WriteLine("The current culture is {0}", current.Name);
      CultureInfo newCulture;
      if (current.Name.Equals("fr-FR"))
         newCulture = new CultureInfo("fr-LU");
      else   
         newCulture = new CultureInfo("fr-FR");
      
      CultureInfo.CurrentCulture = newCulture;
      Console.WriteLine("The current culture is now {0}", 
                        CultureInfo.CurrentCulture.Name);   
   }
}
// The example displays output like the following:
//     The current culture is en-US
//     The current culture is now fr-FR
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current As CultureInfo = CultureInfo.CurrentCulture
      Console.WriteLine("The current culture is {0}", current.Name)
      Dim newCulture As CultureInfo
      If current.Name.Equals("fr-FR") Then
         newCulture = New CultureInfo("fr-LU")
      Else   
         newCulture = new CultureInfo("fr-FR")
      End If
      
      CultureInfo.CurrentCulture = newCulture
      Console.WriteLine("The current culture is now {0}", 
                        CultureInfo.CurrentCulture.Name)   
   End Sub
End Module
' The example displays output like the following:
'     The current culture is en-US
'     The current culture is now fr-FR

O exemplo a seguir recupera a cultura atual.The following example retrieves the current culture. Se for algo diferente da cultura esloveno (Eslovênia), ele alterará a cultura atual para esloveno (Eslovênia).If it is anything other the Slovenian (Slovenia) culture, it changes the current culture to Slovenian (Slovenia). Caso contrário, ele altera a cultura atual para Croata (Croácia).Otherwise, it changes the current culture to Croatian (Croatia).

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo current = CultureInfo.CurrentUICulture;
      Console.WriteLine("The current UI culture is {0}", current.Name);
      CultureInfo newUICulture;
      if (current.Name.Equals("sl-SI"))
         newUICulture = new CultureInfo("hr-HR");
      else   
         newUICulture = new CultureInfo("sl-SI");
      
      CultureInfo.CurrentUICulture = newUICulture;
      Console.WriteLine("The current UI culture is now {0}", 
                        CultureInfo.CurrentUICulture.Name);   
   }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The current UI culture is now sl-SI
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current As CultureInfo = CultureInfo.CurrentUICulture
      Console.WriteLine("The current UI culture is {0}", current.Name)
      Dim newUICulture As CultureInfo
      If current.Name.Equals("sl-SI") Then
         newUICulture = New CultureInfo("hr-HR")
      Else   
         newUICulture = new CultureInfo("sl-SI")
      End If
      
      CultureInfo.CurrentUICulture = newUICulture
      Console.WriteLine("The current UI culture is now {0}", 
                        CultureInfo.CurrentUICulture.Name)   
   End Sub
End Module
' The example displays output like the following:
'     The current UI culture is en-US
'     The current UI culture is now sl-SI

Obtendo todas as culturasGetting all cultures

Você pode recuperar categorias específicas de uma matriz de culturas ou de todas as culturas disponíveis no computador local chamando o método GetCultures.You can retrieve an array specific categories of cultures or of all the cultures available on the local computer by calling the GetCultures method. Por exemplo, você pode recuperar culturas personalizadas, culturas específicas ou culturas neutras, seja sozinha ou em combinação.For example, you can retrieve custom cultures, specific cultures, or neutral cultures either alone or in combination.

O exemplo a seguir chama o método GetCultures duas vezes, primeiro com o membro de enumeração System.Globalization.CultureTypes para recuperar todas as culturas personalizadas e, em seguida, com o membro de enumeração System.Globalization.CultureTypes para recuperar todas as culturas de substituição.The following example calls the GetCultures method twice, first with the System.Globalization.CultureTypes enumeration member to retrieve all custom cultures, and then with the System.Globalization.CultureTypes enumeration member to retrieve all replacement cultures.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      // Get all custom cultures.
      CultureInfo[] custom = CultureInfo.GetCultures(CultureTypes.UserCustomCulture);
      if (custom.Length == 0) { 
         Console.WriteLine("There are no user-defined custom cultures.");
      }
      else {
         Console.WriteLine("Custom cultures:");
         foreach (var culture in custom) 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName);    
      }
      Console.WriteLine();
      
      // Get all replacement cultures.
      CultureInfo[] replacements = CultureInfo.GetCultures(CultureTypes.ReplacementCultures);
      if (replacements.Length == 0) { 
         Console.WriteLine("There are no replacement cultures.");
      }                                             
      else {
         Console.WriteLine("Replacement cultures:");
         foreach (var culture in replacements) 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName);    
      }
      Console.WriteLine();
   }
}
// The example displays output like the following:
//     Custom cultures:
//        x-en-US-sample -- English (United States)
//        fj-FJ -- Boumaa Fijian (Viti)
//     
//     There are no replacement cultures.
Imports System.Globalization

Module Example
   Public Sub Main()
      ' Get all custom cultures.
      Dim custom() As CultureInfo = CultureInfo.GetCultures(CultureTypes.UserCustomCulture)
      If custom.Length = 0 Then 
         Console.WriteLine("There are no user-defined custom cultures.")
      Else
         Console.WriteLine("Custom cultures:")
         For Each culture In custom 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName)
         Next       
      End If
      Console.WriteLine()
      
      ' Get all replacement cultures.
      Dim replacements() As CultureInfo = CultureInfo.GetCultures(CultureTypes.ReplacementCultures)
      If replacements.Length = 0 Then 
         Console.WriteLine("There are no replacement cultures.")
      Else 
         Console.WriteLine("Replacement cultures:")
         For Each culture in replacements 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName)    
         Next
      End If
      Console.WriteLine()
   End Sub
End Module
' The example displays output like the following:
'     Custom cultures:
'        x-en-US-sample -- English (United States)
'        fj-FJ -- Boumaa Fijian (Viti)
'     
'     There are no replacement cultures.

Cultura e threadsCulture and threads

Quando um novo thread de aplicativo é iniciado, sua cultura atual e a cultura da interface do usuário atual são definidas pela cultura do sistema atual e não pela cultura do thread atual.When a new application thread is started, its current culture and current UI culture are defined by the current system culture, and not by the current thread culture. O exemplo a seguir ilustra a diferença.The following example illustrates the difference. Ele define a cultura atual e a cultura da interface do usuário atual de um thread de aplicativo para a cultura francesa (França) (fr-FR).It sets the current culture and current UI culture of an application thread to the French (France) culture (fr-FR). Se a cultura atual já estiver fr-FR, o exemplo a definirá como a cultura Inglês (Estados Unidos) (en-US).If the current culture is already fr-FR, the example sets it to the English (United States) culture (en-US). Ele exibe três números aleatórios como valores de moeda e, em seguida, cria um novo thread, que, por sua vez, exibe três números mais aleatórios como valores de moeda.It displays three random numbers as currency values and then creates a new thread, which, in turn, displays three more random numbers as currency values. Mas como a saída do exemplo mostra, os valores de moeda exibidos pelo novo thread não refletem as convenções de formatação da cultura francesa (França), ao contrário da saída do thread do aplicativo principal.But as the output from the example shows, the currency values displayed by the new thread do not reflect the formatting conventions of the French (France) culture, unlike the output from the main application thread.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   static Random rnd = new Random();
   
   public static void Main()
   {
      if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR") {
         // If current culture is not fr-FR, set culture to fr-FR.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
      }
      else {
         // Set culture to en-US.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
      }
      ThreadProc();
          
      Thread worker = new Thread(ThreadProc);
      worker.Name = "WorkerThread";
      worker.Start();
   }
   
   private static void DisplayThreadInfo()
   {
      Console.WriteLine("\nCurrent Thread Name: '{0}'", 
                        Thread.CurrentThread.Name);
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name);                        
   }
   
   private static void DisplayValues()
   {
      // Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:");
      for (int ctr = 0; ctr <= 3; ctr++)
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);                        
   }
   
   private static void ThreadProc()
   {
      DisplayThreadInfo();
      DisplayValues();
   }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          8,11 €
//          1,48 €
//          8,99 €
//          9,04 €
//       
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: en-US/en-US
//       Some currency values:
//          $6.72
//          $6.35
//          $2.90
//          $7.72
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' If current culture is not fr-FR, set culture to fr-FR.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR")
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
      Else
         ' Set culture to en-US.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US")
      End If
      ThreadProc()
          
       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start()
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc()
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' The example displays output similar to the following:
'       Current Thread Name: ''
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          8,11 €
'          1,48 €
'          8,99 €
'          9,04 €
'       
'       Current Thread Name: 'WorkerThread'
'       Current Thread Culture/UI Culture: en-US/en-US
'       Some currency values:
'          $6.72
'          $6.35
'          $2.90
'          $7.72

Nas versões do .NET Framework antes da .NET Framework 4.5.NET Framework 4.5, a maneira mais comum de garantir que o thread do aplicativo principal compartilhe a mesma cultura com todos os outros threads de trabalho é passar o nome da cultura de todo o aplicativo ou um objeto CultureInfo que representa a cultura de todo o aplicativo para um System.Threading.ParameterizedThreadStart delegado.In versions of the .NET Framework before the .NET Framework 4.5.NET Framework 4.5, the most common way to ensure that the main application thread shares the same culture with all other worker threads is to pass either the name of the application-wide culture or a CultureInfo object that represents the application-wide culture to a System.Threading.ParameterizedThreadStart delegate. O exemplo a seguir usa essa abordagem para garantir que os valores de moeda exibidos por dois threads reflitam as convenções de formatação da mesma cultura.The following example uses this approach to ensure that the currency values displayed by two threads reflect the formatting conventions of the same culture.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   static Random rnd = new Random();
   
   public static void Main()
   {
      if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR") {
         // If current culture is not fr-FR, set culture to fr-FR.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
      }   
      else {
         // Set culture to en-US.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
      }
      DisplayThreadInfo();
      DisplayValues();
          
       Thread worker = new Thread(Example.ThreadProc);
       worker.Name = "WorkerThread";
       worker.Start(Thread.CurrentThread.CurrentCulture);
   }
   
   private static void DisplayThreadInfo()
   {
      Console.WriteLine("\nCurrent Thread Name: '{0}'", 
                        Thread.CurrentThread.Name);
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name);                        
   }
   
   private static void DisplayValues()
   {
      // Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:");
      for (int ctr = 0; ctr <= 3; ctr++)
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);                        
   }
   
   private static void ThreadProc(Object obj) 
   {
      Thread.CurrentThread.CurrentCulture = (CultureInfo) obj;
      Thread.CurrentThread.CurrentUICulture = (CultureInfo) obj;
      DisplayThreadInfo();
      DisplayValues();
   }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          6,83 €
//          3,47 €
//          6,07 €
//          1,70 €
//       
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          9,54 €
//          9,50 €
//          0,58 €
//          6,91 €
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' If current culture is not fr-FR, set culture to fr-FR.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR")
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
      Else
         ' Set culture to en-US.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US")
      End If
      DisplayThreadInfo()
      DisplayValues()
          
       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start(Thread.CurrentThread.CurrentCulture)
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc(obj As Object)
      Thread.CurrentThread.CurrentCulture = CType(obj, CultureInfo)
      Thread.CurrentThread.CurrentUICulture = CType(obj, CultureInfo)
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' The example displays output similar to the following:
'       Current Thread Name: ''
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          6,83 €
'          3,47 €
'          6,07 €
'          1,70 €
'       
'       Current Thread Name: 'WorkerThread'
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          9,54 €
'          9,50 €
'          0,58 €
'          6,91 €

Você pode definir a cultura e a cultura da interface do usuário de threads do pool de threads de maneira semelhante chamando o método ThreadPool.QueueUserWorkItem(WaitCallback, Object).You can set the culture and UI culture of thread pool threads in a similar manner by calling the ThreadPool.QueueUserWorkItem(WaitCallback, Object) method.

Começando com o .NET Framework 4.5.NET Framework 4.5, você pode definir a cultura e cultura de interface do usuário de todos os threads em um domínio de aplicativo mais diretamente, atribuindo um objeto CultureInfo que representa essa cultura às propriedades DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture.Starting with the .NET Framework 4.5.NET Framework 4.5, you can set the culture and UI culture of all threads in an application domain more directly by assigning a CultureInfo object that represents that culture to the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties. O exemplo a seguir usa essas propriedades para garantir que todos os threads no domínio de aplicativo padrão compartilhem a mesma cultura.The following example uses these properties to ensure that all threads in the default application domain share the same culture.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   static Random rnd = new Random();
   
   public static void Main()
   {
      if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR") {
         // If current culture is not fr-FR, set culture to fr-FR.
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
      }   
      else {
         // Set culture to en-US.
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
      }
      ThreadProc();
          
      Thread worker = new Thread(Example.ThreadProc);
      worker.Name = "WorkerThread";
      worker.Start();
   }
   
   private static void DisplayThreadInfo()
   {
      Console.WriteLine("\nCurrent Thread Name: '{0}'", 
                        Thread.CurrentThread.Name);
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name);                        
   }
   
   private static void DisplayValues()
   {
      // Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:");
      for (int ctr = 0; ctr <= 3; ctr++)
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);                        
   }
   
   private static void ThreadProc() 
   {
      DisplayThreadInfo();
      DisplayValues();
   }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          6,83 €
//          3,47 €
//          6,07 €
//          1,70 €
//       
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          9,54 €
//          9,50 €
//          0,58 €
//          6,91 €
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' If current culture is not fr-FR, set culture to fr-FR.
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR")
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
      Else
         ' Set culture to en-US.
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("en-US")
      End If
      ThreadProc()

       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start()
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc()
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' The example displays output similar to the following:
'       Current Thread Name: ''
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          6,83 €
'          3,47 €
'          6,07 €
'          1,70 €
'       
'       Current Thread Name: 'WorkerThread'
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          9,54 €
'          9,50 €
'          0,58 €
'          6,91 €

Aviso

Embora as propriedades DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture sejam membros estáticos, elas definem a cultura padrão e a cultura da interface do usuário padrão somente para o domínio do aplicativo que é atual no momento em que esses valores de propriedade são definidos.Although the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties are static members, they define the default culture and default UI culture only for the application domain that is current at the time these property values are set. Para obter mais informações, consulte a próxima seção, cultura e domínios de aplicativo.For more information, see the next section, Culture and application domains.

Quando você atribui valores às propriedades DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture, a cultura e a cultura da interface do usuário dos threads no domínio do aplicativo também são alteradas se elas não tiverem sido atribuídas explicitamente a uma cultura.When you assign values to the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties, the culture and UI culture of the threads in the application domain also change if they have not explicitly been assigned a culture. No entanto, esses threads refletem as novas configurações de cultura somente enquanto são executadas no domínio do aplicativo atual.However, these threads reflect the new culture settings only while they execute in the current application domain. Se esses threads forem executados em outro domínio de aplicativo, sua cultura se tornará a cultura padrão definida para esse domínio de aplicativo.If these threads execute in another application domain, their culture becomes the default culture defined for that application domain. Como resultado, é recomendável que você sempre defina a cultura do thread do aplicativo principal e não confie nas propriedades DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture para alterá-la.As a result, we recommend that you always set the culture of the main application thread, and not rely on the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties to change it.

Domínios de cultura e de aplicativoCulture and application domains

DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture são propriedades estáticas que definem explicitamente uma cultura padrão somente para o domínio do aplicativo que é atual quando o valor da propriedade é definido ou recuperado.DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture are static properties that explicitly define a default culture only for the application domain that is current when the property value is set or retrieved. O exemplo a seguir define a cultura padrão e a cultura da interface do usuário padrão no domínio do aplicativo padrão como francês (França) e, em seguida, usa a classe AppDomainSetup e o delegado AppDomainInitializer para definir a cultura padrão e a cultura da interface do usuário em um novo domínio de aplicativo para russo ( Rússia).The following example sets the default culture and default UI culture in the default application domain to French (France), and then uses the AppDomainSetup class and the AppDomainInitializer delegate to set the default culture and UI culture in a new application domain to Russian (Russia). Um único thread executa dois métodos em cada domínio de aplicativo.A single thread then executes two methods in each application domain. Observe que a cultura do thread e a cultura da interface do usuário não estão definidas explicitamente; Eles são derivados da cultura padrão e da cultura da interface do usuário do domínio do aplicativo no qual o thread está sendo executado.Note that the thread's culture and UI culture are not explicitly set; they are derived from the default culture and UI culture of the application domain in which the thread is executing. Observe também que as propriedades DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture retornam os valores de CultureInfo padrão do domínio do aplicativo que é atual quando a chamada do método é feita.Note also that the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties return the default CultureInfo values of the application domain that is current when the method call is made.

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

public class Example
{
   public static void Main()
   {
      // Set the default culture and display the current date in the current application domain.
      Info info1 = new Info();
      SetAppDomainCultures("fr-FR");
      
      // Create a second application domain.
      AppDomainSetup setup = new AppDomainSetup();
      setup.AppDomainInitializer = SetAppDomainCultures;
      setup.AppDomainInitializerArguments = new string[] { "ru-RU" };
      AppDomain domain = AppDomain.CreateDomain("Domain2", null, setup);
      // Create an Info object in the new application domain.
      Info info2 = (Info) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName, 
                                                         "Info"); 

      // Execute methods in the two application domains.
      info2.DisplayDate();
      info2.DisplayCultures();
      
      info1.DisplayDate();
      info1.DisplayCultures();            
   }

   public static void SetAppDomainCultures(string[] names)
   {
      SetAppDomainCultures(names[0]);
   }
   
   public static void SetAppDomainCultures(string name)
   {
       try {
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(name);
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture(name);
      }
      // If an exception occurs, we'll just fall back to the system default.
      catch (CultureNotFoundException) {
         return;
      }   
      catch (ArgumentException) {
         return;
      } 
   }
}

public class Info : MarshalByRefObject
{
   public void DisplayDate()
   {
      Console.WriteLine("Today is {0:D}", DateTime.Now);
   }
   
   public void DisplayCultures()
   {
      Console.WriteLine("Application domain is {0}", AppDomain.CurrentDomain.Id);
      Console.WriteLine("Default Culture: {0}", CultureInfo.DefaultThreadCurrentCulture);
      Console.WriteLine("Default UI Culture: {0}", CultureInfo.DefaultThreadCurrentUICulture);
   }
}
// The example displays the following output:
//       Today is 14 октября 2011 г.
//       Application domain is 2
//       Default Culture: ru-RU
//       Default UI Culture: ru-RU
//       Today is vendredi 14 octobre 2011
//       Application domain is 1
//       Default Culture: fr-FR
//       Default UI Culture: fr-FR
Imports System.Globalization
Imports System.Reflection
Imports System.Threading

Module Example
   Public Sub Main()
      ' Set the default culture and display the current date in the current application domain.
      Dim info1 As New Info()
      SetAppDomainCultures("fr-FR")
      
      ' Create a second application domain.
      Dim setup As New AppDomainSetup()
      setup.AppDomainInitializer = AddressOf SetAppDomainCultures
      setup.AppDomainInitializerArguments = { "ru-RU" }
      Dim domain As AppDomain = AppDomain.CreateDomain("Domain2", Nothing, setup)
      ' Create an Info object in the new application domain.
      Dim info2 As Info = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName, 
                                                               "Info"), Info) 

      ' Execute methods in the two application domains.
      info2.DisplayDate()
      info2.DisplayCultures()
      
      info1.DisplayDate()
      info1.DisplayCultures()            
   End Sub
   
   Public Sub SetAppDomainCultures(names() As String)
      SetAppDomainCultures(names(0))
   End Sub
   
   Public Sub SetAppDomainCultures(name As String)
       Try
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(name)
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture(name)
      ' If an exception occurs, we'll just fall back to the system default.
      Catch e As CultureNotFoundException
         Return
      Catch e As ArgumentException
         Return
      End Try      
   End Sub
End Module

Public Class Info : Inherits MarshalByRefObject
   Public Sub DisplayDate()
      Console.WriteLine("Today is {0:D}", Date.Now)
   End Sub
   
   Public Sub DisplayCultures()
      Console.WriteLine("Application domain is {0}", AppDomain.CurrentDomain.Id)
      Console.WriteLine("Default Culture: {0}", CultureInfo.DefaultThreadCurrentCulture)
      Console.WriteLine("Default UI Culture: {0}", CultureInfo.DefaultThreadCurrentUICulture)
   End Sub
End Class
' The example displays the following output:
'       Today is 14 октября 2011 г.
'       Application domain is 2
'       Default Culture: ru-RU
'       Default UI Culture: ru-RU
'       Today is vendredi 14 octobre 2011
'       Application domain is 1
'       Default Culture: fr-FR
'       Default UI Culture: fr-FR

Para obter mais informações sobre culturas e domínios de aplicativo, consulte a seção "domínios e threads de aplicativo" no tópico domínios de aplicativo .For more information about cultures and application domains, see the "Application Domains and Threads" section in the Application Domains topic.

Operações assíncronas baseadas em tarefas e de culturaCulture and task-based asynchronous operations

O padrão de programação assíncrona baseado em tarefa usa objetos Task e Task<TResult> para executar delegados de forma assíncrona em threads do pool de threads.The task-based asynchronous programming pattern uses Task and Task<TResult> objects to asynchronously execute delegates on thread pool threads. O thread específico no qual uma tarefa específica é executada não é conhecido com antecedência, mas é determinado somente no tempo de execução.The specific thread on which a particular task runs is not known in advance, but is determined only at runtime.

Para aplicativos direcionados para o .NET Framework 4.6.NET Framework 4.6 ou versões posteriores, a cultura faz parte de um contexto de operação assíncrona.For apps that target the .NET Framework 4.6.NET Framework 4.6 or later versions, culture is part of an asynchronous operation's context. Em outras palavras, a partir de aplicativos direcionados ao .NET Framework 4.6.NET Framework 4.6, as operações assíncronas, por padrão, herdam os valores das propriedades CurrentCulture e CurrentUICulture do thread do qual elas são iniciadas.In other words, starting with apps that target the .NET Framework 4.6.NET Framework 4.6, asynchronous operations by default inherit the values of the CurrentCulture and CurrentUICulture properties of the thread from which they are launched. Se a cultura atual ou a cultura da interface do usuário atual diferir da cultura do sistema, a cultura atual cruzará os limites do thread e se tornará a cultura atual do thread do pool de threads que está executando uma operação assíncrona.If the current culture or current UI culture differs from the system culture, the current culture crosses thread boundaries and becomes the current culture of the thread pool thread that is executing an asynchronous operation.

O exemplo a seguir fornece uma ilustração simples.The following example provides a simple illustration. Ele usa o atributo TargetFrameworkAttribute para direcionar a .NET Framework 4.6.NET Framework 4.6.It uses the TargetFrameworkAttribute attribute to target the .NET Framework 4.6.NET Framework 4.6. O exemplo define um Func<TResult> delegado, formatDelegate, que retorna alguns números formatados como valores de moeda.The example defines a Func<TResult> delegate, formatDelegate, that returns some numbers formatted as currency values. O exemplo altera a cultura do sistema atual para francês (França) ou, se francês (França) já for a cultura atual, inglês (Estados Unidos).The example changes the current system culture to either French (France) or, if French (France) is already the current culture, English (United States). Em seguida, ele:It then:

  • Invoca o delegado diretamente para que ele seja executado de forma síncrona no thread do aplicativo principal.Invokes the delegate directly so that it runs synchronously on the main app thread.

  • Cria uma tarefa que executa o delegado de forma assíncrona em um thread do pool de threads.Creates a task that executes the delegate asynchronously on a thread pool thread.

  • Cria uma tarefa que executa o delegado de forma síncrona no thread do aplicativo principal chamando o método Task.RunSynchronously.Creates a task that executes the delegate synchronously on the main app thread by calling the Task.RunSynchronously method.

Como a saída do exemplo mostra, quando a cultura atual é alterada para francês (França), a cultura atual do thread do qual as tarefas são invocadas de forma assíncrona se torna a cultura atual dessa operação assíncrona.As the output from the example shows, when the current culture is changed to French (France), the current culture of the thread from which tasks are invoked asynchronously becomes the current culture for that asynchronous operation.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

[assembly:TargetFramework(".NETFramework,Version=v4.6")]

public class Example
{
   
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));
                                                   
                                             output += Environment.NewLine;
                                             return output;
                                           };
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);
       
       // Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:");
       Console.WriteLine(formatDelegate());
       
       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:"); 
       var t1 = Task.Run(formatDelegate);
       Console.WriteLine(t1.Result);
       
       Console.WriteLine("Executing a task synchronously:");
       var t2 = new Task<String>(formatDelegate); 
       t2.RunSynchronously();
       Console.WriteLine(t2.Result);
   }
}
// The example displays the following output:
//         The example is running on thread 1
//         The current culture is en-US
//         Changed the current culture to fr-FR.
//
//         Executing the delegate synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163 025 412,32 €   18 905 365,59 €
//
//         Executing a task asynchronously:
//         Formatting using the fr-FR culture on thread 3.
//         163 025 412,32 €   18 905 365,59 €
//
//         Executing a task synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163 025 412,32 €   18 905 365,59 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

<Assembly:TargetFramework(".NETFramework,Version=v4.6")>

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()                  
       
       ' Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:")
       Console.WriteLine(formatDelegate())
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' The example displays the following output:
'          The example is running on thread 1
'          The current culture is en-US
'          Changed the current culture to fr-FR.
'
'          Executing the delegate synchronously:
'          Formatting Imports the fr-FR culture on thread 1.
'          163 025 412,32 €   18 905 365,59 €
'
'          Executing a task asynchronously:
'          Formatting Imports the fr-FR culture on thread 3.
'          163 025 412,32 €   18 905 365,59 €
'
'          Executing a task synchronously:
'          Formatting Imports the fr-FR culture on thread 1.
'          163 025 412,32 €   18 905 365,59 €

Para aplicativos que visam versões do .NET Framework antes do .NET Framework 4.6.NET Framework 4.6, ou para aplicativos que não têm como alvo uma versão específica do .NET Framework, a cultura do thread de chamada não faz parte do contexto de uma tarefa.For apps that target versions of the .NET Framework prior to the .NET Framework 4.6.NET Framework 4.6, or for apps that do not target a particular version of the .NET Framework, the culture of the calling thread is not part of a task's context. Em vez disso, a menos que um esteja explicitamente definido, a cultura de novos threads por padrão é a cultura do sistema.Instead, unless one is explicitly defined, the culture of new threads by default is the system culture. O exemplo a seguir, que é idêntico ao exemplo anterior, exceto pelo fato de que ele não tem o atributo TargetFrameworkAttribute, ilustra isso.The following example, which is identical to the previous example except that it lacks the TargetFrameworkAttribute attribute, illustrates this. Como a cultura do sistema em que o exemplo foi executado foi o inglês (Estados Unidos), a cultura da tarefa que é executada de forma assíncrona em um thread do pool de threads é en-US em vez de fr-FR.Because the system culture of the system on which the example executed was English (United States), the culture of the task that executes asynchronously on a thread pool thread is en-US rather than fr-FR.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));
                                                   
                                             output += Environment.NewLine;
                                             return output;
                                           };
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);
       
       // Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:");
       Console.WriteLine(formatDelegate());
       
       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:"); 
       var t1 = Task.Run(formatDelegate);
       Console.WriteLine(t1.Result);
       
       Console.WriteLine("Executing a task synchronously:");
       var t2 = new Task<String>(formatDelegate); 
       t2.RunSynchronously();
       Console.WriteLine(t2.Result);
   }
}
// The example displays the following output:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//     
//     Executing the delegate synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163 025 412,32 €   18 905 365,59 €
//     
//     Executing a task asynchronously:
//     Formatting using the en-US culture on thread 3.
//     $163,025,412.32   $18,905,365.59
//     
//     Executing a task synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163 025 412,32 €   18 905 365,59 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()                  
       
       ' Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:")
       Console.WriteLine(formatDelegate())
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' The example displays the following output:
'     The example is running on thread 1
'     The current culture is en-US
'     Changed the current culture to fr-FR.
'     
'     Executing the delegate synchronously:
'     Formatting using the fr-FR culture on thread 1.
'     163 025 412,32 €   18 905 365,59 €
'     
'     Executing a task asynchronously:
'     Formatting using the en-US culture on thread 3.
'     $163,025,412.32   $18,905,365.59
'     
'     Executing a task synchronously:
'     Formatting using the fr-FR culture on thread 1.
'     163 025 412,32 €   18 905 365,59 €

Para aplicativos que têm como destino versões do .NET Framework do .NET Framework 4.5.NET Framework 4.5 e posterior, mas antes da .NET Framework 4.6.NET Framework 4.6, você pode usar as propriedades DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture para garantir que a cultura do thread de chamada seja usada em tarefas assíncronas executadas no pool de threads threads.For apps that target versions of the .NET Framework from the .NET Framework 4.5.NET Framework 4.5 and later but prior to the .NET Framework 4.6.NET Framework 4.6, you can use the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties to ensure that the culture of the calling thread is used in asynchronous tasks that execute on thread pool threads. O exemplo a seguir é idêntico ao exemplo anterior, exceto pelo fato de que ele usa a propriedade DefaultThreadCurrentCulture para garantir que os threads do pool de threads tenham a mesma cultura que o thread do aplicativo principal.The following example is identical to the previous example, except that it uses the DefaultThreadCurrentCulture property to ensure that thread pool threads have the same culture as the main app thread.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));
                                                   
                                             output += Environment.NewLine;
                                             return output;
                                           };
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture;
       
       // Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:");
       Console.WriteLine(formatDelegate());
       
       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:"); 
       var t1 = Task.Run(formatDelegate);
       Console.WriteLine(t1.Result);
       
       Console.WriteLine("Executing a task synchronously:");
       var t2 = new Task<String>(formatDelegate); 
       t2.RunSynchronously();
       Console.WriteLine(t2.Result);
   }
}
// The example displays the following output:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//     
//     Executing the delegate synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163 025 412,32 €   18 905 365,59 €
//     
//     Executing a task asynchronously:
//     Formatting using the fr-FR culture on thread 3.
//     163 025 412,32 €   18 905 365,59 €
//     
//     Executing a task synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163 025 412,32 €   18 905 365,59 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture
       Console.WriteLine()                  
       
       ' Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:")
       Console.WriteLine(formatDelegate())
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' The example displays the following output:
'       The example is running on thread 1
'       The current culture is en-US
'       Changed the current culture to fr-FR.
'       
'       Executing the delegate synchronously:
'       Formatting using the fr-FR culture on thread 1.
'       163 025 412,32 €   18 905 365,59 €
'       
'       Executing a task asynchronously:
'       Formatting using the fr-FR culture on thread 3.
'       163 025 412,32 €   18 905 365,59 €
'       
'       Executing a task synchronously:
'       Formatting using the fr-FR culture on thread 1.
'       163 025 412,32 €   18 905 365,59 €

DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture são propriedades de domínio por aplicativo; ou seja, eles estabelecem uma cultura padrão para todos os threads não atribuídos explicitamente a uma cultura em um domínio de aplicativo específico.DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture are per-app domain properties; that is, they establish a default culture for all threads not explicitly assigned a culture in a specific application domain. No entanto, para aplicativos direcionados ao .NET Framework 4.6.NET Framework 4.6 ou posterior, a cultura do thread de chamada permanece parte do contexto de uma tarefa assíncrona, mesmo que a tarefa cruze os limites do domínio do aplicativo.However, for apps that target the .NET Framework 4.6.NET Framework 4.6 or later, the culture of the calling thread remains part of an asynchronous task's context even if the task crosses app domain boundaries.

O exemplo a seguir mostra que a cultura do thread de chamada permanece a cultura atual de uma operação assíncrona baseada em tarefa, mesmo se o método que a tarefa está executando cruzar os limites do domínio do aplicativo.The following example shows that the calling thread's culture remains the current culture of a task-based asynchronous operation even if the method that the task is executing crosses application domain boundaries. Ele define uma classe, DataRetriever, com um único método, GetFormattedNumber, que retorna um número de ponto flutuante de precisão dupla aleatório entre 1 e 1.000 formatados como um valor de moeda.It defines a class, DataRetriever, with a single method, GetFormattedNumber, that returns a random double-precision floating-point number between 1 and 1,000 formatted as a currency value. Uma primeira tarefa é executada, que simplesmente instancia uma instância DataRetriever e chama seu método GetFormattedNumber.A first task is run that simply instantiates a DataRetriever instance and calls its GetFormattedNumber method. Uma segunda tarefa relata seu domínio de aplicativo atual, cria um novo domínio de aplicativo, instancia uma instância de DataRetriever no novo domínio de aplicativo e chama seu método GetFormattedNumber.A second task reports its current application domain, creates a new application domain, instantiates a DataRetriever instance in the new application domain, and calls its GetFormattedNumber method. Como a saída do exemplo mostra, a cultura atual permaneceu a mesma no thread de chamada, na primeira tarefa e na segunda tarefa quando ela estava em execução no domínio do aplicativo principal e no segundo domínio do aplicativo.As the output from the example shows, the current culture has remained the same in the calling thread, the first task, and the second task both when it was executing in the main application domain and the second application domain.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

[assembly:TargetFramework(".NETFramework,Version=v4.6")]

public class Example
{
   public static void Main()
   {
       string formatString = "C2";
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);
       
       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously in the main appdomain:"); 
       var t1 = Task.Run(() => { DataRetriever d = new DataRetriever();
                                 return d.GetFormattedNumber(formatString);
                               });
       Console.WriteLine(t1.Result);
       Console.WriteLine(); 
       
       Console.WriteLine("Executing a task synchronously in two appdomains:");
       var t2 = Task.Run(() => { Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                                                   Thread.CurrentThread.ManagedThreadId, 
                                                   AppDomain.CurrentDomain.FriendlyName);
                                 AppDomain domain = AppDomain.CreateDomain("Domain2");
                                 DataRetriever d = (DataRetriever) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName,
                                                   "DataRetriever");
                                 return d.GetFormattedNumber(formatString); 
                               }); 
       Console.WriteLine(t2.Result);
   }
}

public class DataRetriever : MarshalByRefObject
{
   public string GetFormattedNumber(String format)
   {
      Thread thread = Thread.CurrentThread;
      Console.WriteLine("Current culture is {0}", thread.CurrentCulture);
      Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                        thread.ManagedThreadId, 
                        AppDomain.CurrentDomain.FriendlyName);
      Random rnd = new Random();
      Double value = rnd.NextDouble() * 1000;
      return value.ToString(format);
   }
}
// The example displays output like the following:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//     
//     Executing a task asynchronously in a single appdomain:
//     Current culture is fr-FR
//     Thread 3 is running in app domain 'AsyncCulture4.exe'
//     93,48 €
//     
//     Executing a task synchronously in two appdomains:
//     Thread 4 is running in app domain 'AsyncCulture4.exe'
//     Current culture is fr-FR
//     Thread 4 is running in app domain 'Domain2'
//     288,66 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

<Assembly:TargetFramework(".NETFramework,Version=v4.6")>

Module Example
   Public Sub Main()
       Dim formatString As String = "C2"
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If

       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously in the main appdomain:") 
       Dim t1 = Task.Run(Function()
                            Dim d As New DataRetriever()
                            Return d.GetFormattedNumber(formatString)
                         End Function)
       Console.WriteLine(t1.Result)
       Console.WriteLine() 
       
       Console.WriteLine("Executing a task synchronously in two appdomains:")
       Dim t2 = Task.Run(Function()
                            Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                                              Thread.CurrentThread.ManagedThreadId, 
                                              AppDomain.CurrentDomain.FriendlyName)
                            Dim domain As AppDomain = AppDomain.CreateDomain("Domain2")
                            Dim d As DataRetriever = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName,
                                                                                          "DataRetriever"), DataRetriever)
                            Return d.GetFormattedNumber(formatString) 
                         End Function) 
       Console.WriteLine(t2.Result)
   End Sub
End Module

Public Class DataRetriever : Inherits MarshalByRefObject
   Public Function GetFormattedNumber(format As String) As String
      Dim thread As Thread = Thread.CurrentThread
      Console.WriteLine("Current culture is {0}", thread.CurrentCulture)
      Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                        thread.ManagedThreadId, 
                        AppDomain.CurrentDomain.FriendlyName)
      Dim rnd As New Random()
      Dim value As Double = rnd.NextDouble() * 1000
      Return value.ToString(format)
   End Function
End Class
' The example displays output like the following:
'     The example is running on thread 1
'     The current culture is en-US
'     Changed the current culture to fr-FR.
'     
'     Executing a task asynchronously in a single appdomain:
'     Current culture is fr-FR
'     Thread 3 is running in app domain 'AsyncCulture4.exe'
'     93,48 €
'     
'     Executing a task synchronously in two appdomains:
'     Thread 4 is running in app domain 'AsyncCulture4.exe'
'     Current culture is fr-FR
'     Thread 4 is running in app domain 'Domain2'
'     288,66 €

Serialização de objeto CultureInfoCultureInfo object serialization

Quando um objeto de CultureInfo é serializado, tudo que é realmente armazenado é Name e UseUserOverride.When a CultureInfo object is serialized, all that is actually stored is Name and UseUserOverride. Ele é desserializado com êxito apenas em um ambiente em que Name tem o mesmo significado.It is successfully de-serialized only in an environment where that Name has the same meaning. Os três exemplos a seguir mostram por que esse não é sempre o caso:The following three examples show why this is not always the case:

  • Se o valor da propriedade CultureTypes for CultureTypes.InstalledWin32Culturese se essa cultura foi introduzida pela primeira vez em uma versão específica do sistema operacional Windows, não será possível desserializá-la em uma versão anterior do Windows.If the CultureTypes property value is CultureTypes.InstalledWin32Cultures, and if that culture was first introduced in a particular version of the Windows operating system, it is not possible to deserialize it on an earlier version of Windows. Por exemplo, se uma cultura foi introduzida no Windows 10, ela não pode ser desserializada no Windows 8.For example, if a culture was introduced in Windows 10, it cannot be deserialized on Windows 8.

  • Se o valor de CultureTypes for CultureTypes.UserCustomCulturee o computador no qual ele é desserializado não tiver essa cultura personalizada de usuário instalada, não será possível desserializá-la.If the CultureTypes value is CultureTypes.UserCustomCulture, and the computer on which it is de-serialized does not have this user custom culture installed, it is not possible to deserialize it.

  • Se o valor de CultureTypes for CultureTypes.ReplacementCulturese o computador no qual ele é desserializado não tiver essa cultura de substituição, ele desserializará para o mesmo nome, mas não todas as mesmas características.If the CultureTypes value is CultureTypes.ReplacementCultures, and the computer on which it is de-serialized does not have this replacement culture, it de-serializes to the same name, but not all of the same characteristics. Por exemplo, se en-US for uma cultura substituta no computador A, mas não no computador B, e se um objeto CultureInfo que faz referência a essa cultura for serializado no computador A e desserializado no computador B, nenhuma das características personalizadas da cultura será transmitida.For example, if en-US is a replacement culture on computer A, but not on computer B, and if a CultureInfo object referring to this culture is serialized on computer A and de-serialized on computer B, then none of the custom characteristics of the culture are transmitted. A cultura é desserializada com êxito, mas com um significado diferente.The culture deserializes successfully, but with a different meaning.

Substituições do painel de controleControl Panel overrides

O usuário pode optar por substituir alguns dos valores associados à cultura atual do Windows por meio da parte de opções regionais e de idioma do painel de controle.The user might choose to override some of the values associated with the current culture of Windows through the regional and language options portion of Control Panel. Por exemplo, o usuário pode optar por exibir a data em um formato diferente ou usar uma moeda diferente do padrão para a cultura.For example, the user might choose to display the date in a different format or to use a currency other than the default for the culture. Em geral, seus aplicativos devem respeitar essas substituições do usuário.In general, your applications should honor these user overrides.

Se UseUserOverride for true e a cultura especificada corresponder à cultura atual do Windows, a CultureInfo usará essas substituições, incluindo as configurações do usuário para as propriedades da instância DateTimeFormatInfo retornada pela propriedade DateTimeFormat e as propriedades da @no__ instância de t_5_ retornada pela propriedade NumberFormat.If UseUserOverride is true and the specified culture matches the current culture of Windows, the CultureInfo uses those overrides, including user settings for the properties of the DateTimeFormatInfo instance returned by the DateTimeFormat property, and the properties of the NumberFormatInfo instance returned by the NumberFormat property. Se as configurações do usuário forem incompatíveis com a cultura associada ao CultureInfo, por exemplo, se o calendário selecionado não for um dos OptionalCalendars, os resultados dos métodos e dos valores das propriedades serão indefinidos.If the user settings are incompatible with the culture associated with the CultureInfo, for example, if the selected calendar is not one of the OptionalCalendars, the results of the methods and the values of the properties are undefined.

Ordens de classificação alternativasAlternate sort orders

Algumas culturas dão suporte a mais de uma ordem de classificação.Some cultures support more than one sort order. Por exemplo:For example:

  • A cultura espanhola (Espanha) tem duas ordens de classificação: a ordem de classificação internacional padrão e a ordem de classificação tradicional.The Spanish (Spain) culture has two sort orders: the default international sort order, and the traditional sort order. Quando você cria uma instância de um objeto CultureInfo com o nome de cultura es-ES, a ordem de classificação internacional é usada.When you instantiate a CultureInfo object with the es-ES culture name, the international sort order is used. Quando você cria uma instância de um objeto CultureInfo com o nome de cultura es-ES-tradnl, a ordem de classificação tradicional é usada.When you instantiate a CultureInfo object with the es-ES-tradnl culture name, the traditional sort order is used.

  • A cultura zh-CN (chinês (simplificado, PRC)) dá suporte a duas ordens de classificação: por pronúncia (o padrão) e por contagem de traços.The zh-CN (Chinese (Simplified, PRC)) culture supports two sort orders: by pronunciation (the default) and by stroke count. Quando você cria uma instância de um objeto CultureInfo com o nome de cultura zh-CN, a ordem de classificação padrão é usada.When you instantiate a CultureInfo object with the zh-CN culture name, the default sort order is used. Quando você cria uma instância de um objeto CultureInfo com um identificador local de 0x00020804, as cadeias de caracteres são classificadas por contagem de traços.When you instantiate a CultureInfo object with a local identifier of 0x00020804, strings are sorted by stroke count.

A tabela a seguir lista as culturas que dão suporte a ordens de classificação alternativas e os identificadores para as ordens de classificação padrão e alternativas.The following table lists the cultures that support alternate sort orders and the identifiers for the default and alternate sort orders.

Nome da culturaCulture name CulturaCulture Identificador e nome de classificação padrãoDefault sort name and identifier Nome de classificação alternativo e identificadorAlternate sort name and identifier
es-ESes-ES Espanhol (Espanha)Spanish (Spain) Internacionais 0x00000C0AInternational: 0x00000C0A Simplifica 0x0000040ATraditional: 0x0000040A
zh-TWzh-TW Chinês (Taiwan)Chinese (Taiwan) Contagem de traços: 0x00000404Stroke Count: 0x00000404 Bopomofo 0x00030404Bopomofo: 0x00030404
zh-CNzh-CN Chinês (RPC)Chinese (PRC) Pronúncia 0x00000804Pronunciation: 0x00000804 Contagem de traços: 0x00020804Stroke Count: 0x00020804
zh-HKzh-HK Chinês (RAE de Hong Kong)Chinese (Hong Kong SAR) Contagem de traços: 0x00000c04Stroke Count: 0x00000c04 Contagem de traços: 0x00020c04Stroke Count: 0x00020c04
zh-SGzh-SG Chinês (Cingapura)Chinese (Singapore) Pronúncia 0x00001004Pronunciation: 0x00001004 Contagem de traços: 0x00021004Stroke Count: 0x00021004
zh-MOzh-MO Chinês (RAE de Macau)Chinese (Macao SAR) Pronúncia 0x00001404Pronunciation: 0x00001404 Contagem de traços: 0x00021404Stroke Count: 0x00021404
ja-JPja-JP Japonês (Japão)Japanese (Japan) Padrão: 0x00000411Default: 0x00000411 Unicode: 0x00010411Unicode: 0x00010411
ko-KRko-KR Coreano (Coreia)Korean (Korea) Padrão: 0x00000412Default: 0x00000412 Coreano Xwansung-Unicode: 0x00010412Korean Xwansung - Unicode: 0x00010412
de-DEde-DE Alemão (Alemanha)German (Germany) Violação 0x00000407Dictionary: 0x00000407 DIN de classificação do catálogo telefônico: 0x00010407Phone Book Sort DIN: 0x00010407
hu-HUhu-HU Húngaro (Hungria)Hungarian (Hungary) Padrão: 0x0000040eDefault: 0x0000040e Classificação técnica: 0x0001040eTechnical Sort: 0x0001040e
Ka-GEka-GE Georgiano (Geórgia)Georgian (Georgia) Simplifica 0x00000437Traditional: 0x00000437 Classificação moderna: 0x00010437Modern Sort: 0x00010437

A cultura atual e os aplicativos UWPThe current culture and UWP apps

Em aplicativos Plataforma Universal do Windows (UWP), as propriedades CurrentCulture e CurrentUICulture são de leitura/gravação, assim como no .NET Framework e nos aplicativos .NET Core.In Universal Windows Platform (UWP) apps, the CurrentCulture and CurrentUICulture properties are read-write, just as they are in .NET Framework and .NET Core apps. No entanto, os aplicativos UWP reconhecem uma única cultura.However, UWP apps recognize a single culture. As propriedades CurrentCulture e CurrentUICulture são mapeadas para o primeiro valor na coleção Windows. ApplicationModel. Resources. Core. ResourceManager. DefaultContext. Languages .The CurrentCulture and CurrentUICulture properties map to the first value in the Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages collection.

Em aplicativos .NET Framework e .NET Core, a cultura atual é uma configuração por thread e as propriedades CurrentCulture e CurrentUICulture refletem a cultura e a cultura da interface do usuário somente do thread atual.In .NET Framework and .NET Core apps, the current culture is a per-thread setting, and the CurrentCulture and CurrentUICulture properties reflect the culture and UI culture of the current thread only. Em aplicativos UWP, a cultura atual é mapeada para a coleção Windows. ApplicationModel. Resources. Core. ResourceManager. DefaultContext. Languages , que é uma configuração global.In UWP apps, the current culture maps to the Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages collection, which is a global setting. Definir a propriedade CurrentCulture ou CurrentUICulture altera a cultura de todo o aplicativo; a cultura não pode ser definida por thread.Setting the CurrentCulture or CurrentUICulture property changes the culture of the entire app; culture cannot be set on a per-thread basis.

Construtores

CultureInfo(Int32)

Inicializa uma nova instância da classe CultureInfo com base na cultura especificada pelo identificador de cultura.Initializes a new instance of the CultureInfo class based on the culture specified by the culture identifier.

CultureInfo(Int32, Boolean)

Inicializa uma nova instância da classe CultureInfo com base na cultura especificada pelo identificador de cultura e no booliano que especifica se é necessário usar as configurações de cultura do selecionadas pelo usuário do sistema.Initializes a new instance of the CultureInfo class based on the culture specified by the culture identifier and on the Boolean that specifies whether to use the user-selected culture settings from the system.

CultureInfo(String)

Inicializa uma nova instância da classe CultureInfo com base na cultura especificada por nome.Initializes a new instance of the CultureInfo class based on the culture specified by name.

CultureInfo(String, Boolean)

Inicializa uma nova instância da classe CultureInfo com base na cultura especificada pelo nome e no booliano que especifica se é necessário usar as configurações de cultura do selecionadas pelo usuário do sistema.Initializes a new instance of the CultureInfo class based on the culture specified by name and on the Boolean that specifies whether to use the user-selected culture settings from the system.

Propriedades

Calendar

Obtém o calendário padrão usado pela cultura.Gets the default calendar used by the culture.

CompareInfo

Obtém o CompareInfo que define como comparar a cultura de cadeias de caracteres.Gets the CompareInfo that defines how to compare strings for the culture.

CultureTypes

Obtém os tipos de cultura que pertencem ao objeto CultureInfo atual.Gets the culture types that pertain to the current CultureInfo object.

CurrentCulture

Obtém ou define o objeto CultureInfo que representa a cultura usada pelo thread atual.Gets or sets the CultureInfo object that represents the culture used by the current thread.

CurrentUICulture

Obtém ou define o objeto CultureInfo que representa a cultura de interface do usuário atual usada pelo Gerenciador de Recursos para procurar recursos específicos da cultura no tempo de execução.Gets or sets the CultureInfo object that represents the current user interface culture used by the Resource Manager to look up culture-specific resources at run time.

DateTimeFormat

Obtém ou define um DateTimeFormatInfo que define o formato culturalmente apropriado de exibição de datas e horas.Gets or sets a DateTimeFormatInfo that defines the culturally appropriate format of displaying dates and times.

DefaultThreadCurrentCulture

Obtém ou define a cultura padrão para threads no domínio de aplicativo atual.Gets or sets the default culture for threads in the current application domain.

DefaultThreadCurrentUICulture

Obtém ou define a cultura padrão interface do usuário para threads no domínio do aplicativo atual.Gets or sets the default UI culture for threads in the current application domain.

DisplayName

Obtém o nome da cultura totalmente localizado.Gets the full localized culture name.

EnglishName

Obtém o nome da cultura no formato languagefull [country/regionfull] em inglês.Gets the culture name in the format languagefull [country/regionfull] in English.

IetfLanguageTag

Preterido.Deprecated. Obtém a identificação de RFC 4646 padrão de um idioma.Gets the RFC 4646 standard identification for a language.

InstalledUICulture

Obtém o CultureInfo que representa a cultura instalada com o sistema operacional.Gets the CultureInfo that represents the culture installed with the operating system.

InvariantCulture

Obtém o objeto CultureInfo que é independente de cultura (invariável).Gets the CultureInfo object that is culture-independent (invariant).

IsNeutralCulture

Obtém um valor que indica se o CultureInfo atual representa uma cultura neutra.Gets a value indicating whether the current CultureInfo represents a neutral culture.

IsReadOnly

Obtém um valor que indica se o objeto CultureInfo é somente leitura.Gets a value indicating whether the current CultureInfo is read-only.

KeyboardLayoutId

Obtém o identificador de localidade de entrada ativo.Gets the active input locale identifier.

LCID

Obtém o identificador de cultura para o CultureInfo atual.Gets the culture identifier for the current CultureInfo.

Name

Obtém o nome de cultura no formato languagecode2-country/regioncode2.Gets the culture name in the format languagecode2-country/regioncode2.

NativeName

Obtém o nome de cultura, composto pelo idioma, o país/região e o script opcional, que a cultura está configurada para exibir.Gets the culture name, consisting of the language, the country/region, and the optional script, that the culture is set to display.

NumberFormat

Obtém ou define um NumberFormatInfo que define o formato culturalmente apropriado de exibição de números, moeda e percentual.Gets or sets a NumberFormatInfo that defines the culturally appropriate format of displaying numbers, currency, and percentage.

OptionalCalendars

Obtém a lista de calendários que pode ser usada pela cultura.Gets the list of calendars that can be used by the culture.

Parent

Obtém o CultureInfo que representa a cultura pai do CultureInfo atual.Gets the CultureInfo that represents the parent culture of the current CultureInfo.

TextInfo

Obtém o TextInfo que define o sistema de escrita associado à cultura.Gets the TextInfo that defines the writing system associated with the culture.

ThreeLetterISOLanguageName

Obtém o código de três letras ISO 639-2 para o idioma do CultureInfo atual.Gets the ISO 639-2 three-letter code for the language of the current CultureInfo.

ThreeLetterWindowsLanguageName

Obtém o código de três letras do idioma, conforme definido na API do Windows.Gets the three-letter code for the language as defined in the Windows API.

TwoLetterISOLanguageName

Obtém o código de duas letras ISO 639-1 para o idioma do CultureInfo atual.Gets the ISO 639-1 two-letter code for the language of the current CultureInfo.

UseUserOverride

Obtém um valor que indica se o objeto CultureInfo atual usa as configurações de cultura selecionadas pelo usuário.Gets a value indicating whether the current CultureInfo object uses the user-selected culture settings.

Métodos

ClearCachedData()

Atualiza as informações relacionadas à cultura armazenadas em cache.Refreshes cached culture-related information.

Clone()

Cria uma cópia das CultureInfo atuais.Creates a copy of the current CultureInfo.

CreateSpecificCulture(String)

Cria um CultureInfo que representa a cultura específica associada ao nome especificado.Creates a CultureInfo that represents the specific culture that is associated with the specified name.

Equals(Object)

Determina se o objeto especificado é a mesma cultura que a CultureInfo atual.Determines whether the specified object is the same culture as the current CultureInfo.

GetConsoleFallbackUICulture()

Obtém uma cultura de interface do usuário alternativa adequada para aplicativos de console quando a cultura padrão da interface gráfica do usuário é inadequada.Gets an alternate user interface culture suitable for console applications when the default graphic user interface culture is unsuitable.

GetCultureInfo(Int32)

Recupera uma instância somente leitura armazenada em cache de uma cultura usando o identificador de cultura especificado.Retrieves a cached, read-only instance of a culture by using the specified culture identifier.

GetCultureInfo(String)

Recupera uma instância armazenada em cache somente leitura de uma cultura usando o nome da cultura especificada.Retrieves a cached, read-only instance of a culture using the specified culture name.

GetCultureInfo(String, String)

Recupera uma instância em cache, somente leitura de uma cultura.Retrieves a cached, read-only instance of a culture. Os parâmetros especificam uma cultura que é inicializada com os objetos TextInfo e CompareInfo especificados por outra cultura.Parameters specify a culture that is initialized with the TextInfo and CompareInfo objects specified by another culture.

GetCultureInfoByIetfLanguageTag(String)

Preterido.Deprecated. Recupera um objeto CultureInfo somente leitura tendo características linguísticas que são identificadas pela marca de idioma RFC 4646 especificada.Retrieves a read-only CultureInfo object having linguistic characteristics that are identified by the specified RFC 4646 language tag.

GetCultures(CultureTypes)

Obtém a lista de culturas com suporte filtradas por parâmetro CultureTypes especificado.Gets the list of supported cultures filtered by the specified CultureTypes parameter.

GetFormat(Type)

Obtém um objeto que define como formatar o tipo especificado.Gets an object that defines how to format the specified type.

GetHashCode()

Funciona como uma função de hash para o CultureInfo atual, adequada para algoritmos de hash e estruturas de dados, como uma tabela de hash.Serves as a hash function for the current CultureInfo, suitable for hashing algorithms and data structures, such as a hash table.

GetType()

Obtém o Type da instância atual.Gets the Type of the current instance.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Object atual.Creates a shallow copy of the current Object.

(Herdado de Object)
ReadOnly(CultureInfo)

Retorna um wrapper somente leitura em torno do objeto CultureInfo especificado.Returns a read-only wrapper around the specified CultureInfo object.

ToString()

Retorna uma cadeia de caracteres que contém o nome do CultureInfo atual no formato languagecode2-country/regioncode2.Returns a string containing the name of the current CultureInfo in the format languagecode2-country/regioncode2.

Aplica-se a

Veja também