TOC

This article has been localized into Portuguese by the community.

Trabalhando com Culture & Regions:

A classe CultureInfo

Nos últimos artigos, falamos sobre a utilidade da classe CultureInfo quando você precisa ter controle total de como os números e as datas são exibidos em seu aplicativo. Também falamos sobre como você pode verificar e modificar qual cultura seu aplicativo deve usar como fallback. Com tudo isso no lugar, é hora de ir mais fundo na classe CultureInfo real, para ver como podemos tirar proveito disso.

Um lembrete rápido antes de começarmos: A classe CultureInfo é parte do namespace System.Globalization , portanto, certifique-se de importá-lo sempre que você tentar os exemplos:

using System.Globalization;

Culturas neutras e específicas

Nos exemplos anteriores deste capítulo, usamos apenas culturas específicas, que é uma cultura que especifica tanto um idioma quanto um país/região. Um exemplo disso é a cultura en-US , que afirma claramente que o idioma desejado deve ser o inglês e a região é os EUA. Uma alternativa para isso é a cultura en-GB , que é o mesmo idioma (inglês), mas com a Grã-Bretanha como a região em vez dos EUA.

Haverá momentos em que essas diferenças são importantes para você, nesse caso você deve usar essas versões específicas da região da classe CultureInfo. Por outro lado, também haverá situações em que o inglês é apenas um idioma e você não quer vincular esse idioma a um país ou região específicos. Para isso, o framework .NET define as chamadas culturas neutras, que apenas especificam uma linguagem. De fato, tanto en-US quanto en-GB herdam de uma cultura tão neutra (o que faz todo o sentido, já que eles compartilham a mesma linguagem!) E você pode acessá-la da propriedade Parent . Deixe-me ilustrar com um exemplo:

CultureInfo enGb = new CultureInfo("en-GB");
CultureInfo enUs = new CultureInfo("en-US");
Console.WriteLine(enGb.DisplayName);
Console.WriteLine(enUs.DisplayName);
Console.WriteLine(enGb.Parent.DisplayName);
Console.WriteLine(enUs.Parent.DisplayName);

Não é um exemplo muito útil, mas deve dar uma ideia melhor da estrutura interna da classe CultureInfo. A saída deve ficar assim:

English (United Kingdom)
English (United States)
English
English

Obtendo o CultureInfo correto

De nossos exemplos anteriores, você viu que podemos buscar a classe CultureInfo desejada passando o identificador country-country/region para o construtor da classe. Mas como você pode estar procurando por uma cultura neutra, como descrito acima, você também pode simplesmente passar um identificador de idioma:

CultureInfo en = new CultureInfo("en");

O .NET framework retornará uma instância CultureInfo de região neutra em inglês para você. Para obter uma lista completa dos possíveis identificadores de idioma e/ou idioma do país/região, sugiro que você consulte o MSDN documentation.

Outra maneira de identificar uma cultura específica é com o chamado LCID (LoCale ID). Você vai encontrá-lo como uma propriedade em instâncias CultureInfo existentes, mas se você souber o ID, você também pode usá-lo para instanciar um objeto CultureInfo. Por exemplo, o LCID para en-US é 1033:

CultureInfo enUs = new CultureInfo(1033);

No entanto, na maioria das situações, é muito mais fácil usar o especificador de idioma do país/região, conforme demonstrado anteriormente.

Obtendo uma lista de culturas disponíveis

Agora podemos obter uma cultura específica e usá-la para vários fins, mas talvez você precise de uma lista das culturas disponíveis, por exemplo, para permitir que o usuário selecione um idioma e/ou país/região. Felizmente, o .NET framework torna isso fácil para nós também - aqui está um exemplo:

CultureInfo[] specificCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
foreach (CultureInfo ci in specificCultures)
    Console.WriteLine(ci.DisplayName);
Console.WriteLine("Total: " + specificCultures.Length);

Como você pode ver na primeira linha de código, eu uso o método estático GetCultures na classe CultureInfo para obter uma lista de culturas. Isso requer o parâmetro CultureTypes , que especifica o tipo de cultura que você está procurando. Neste caso, pedi as culturas específicas, as quais, como falamos anteriormente, são as culturas ligadas a uma língua e a um país/região. É uma lista bastante longa, a propósito - neste computador, eu tenho um total de 563 culturas disponíveis!

Mas talvez você esteja mais interessado nas culturas neutras? Isso faria, por exemplo, perfeito sentido se você estivesse criando uma lista de idiomas disponíveis, sem se preocupar com qual país ou região eles estavam relacionados. Fazê-lo é tão simples quanto mudar o parâmetro CultureTypes:

CultureInfo[] neutralCultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
foreach (CultureInfo ci in neutralCultures)
    Console.WriteLine(ci.DisplayName);
Console.WriteLine("Total: " + neutralCultures.Length);

Ao fazer isso, você também verá que não há tantas culturas neutras quanto culturas específicas - no meu computador/versão do framework .NET, o resultado é um total de 280 culturas neutras.

Propriedades importantes & amp; métodos de CultureInfo

Depois de ter uma instância da classe CultureInfo, você obtém imediatamente acesso a uma ampla variedade de propriedades e métodos utilizáveis. Esses membros podem ajudá-lo a realizar muitas coisas úteis em relação à cultura - vamos dar uma olhada em alguns deles!

DateTimeFormat

Com a propriedade DateTimeFormat, você obtém acesso a informações sobre como a data e a hora devem ser formatadas, além de muitas informações úteis sobre o calendário da cultura em questão. Um bom exemplo disso são as propriedades FirstDayOfWeek e CalendarWeekRule - elas podem informar em qual dia uma semana começa (geralmente domingo ou segunda-feira) e como a primeira semana do calendário ano é decidido (por exemplo, apenas o primeiro dia ou a primeira semana completa):

CultureInfo enUs = new CultureInfo("en-US");
Console.WriteLine("First day of the: " + enUs.DateTimeFormat.FirstDayOfWeek.ToString());
Console.WriteLine("First calendar week starts with: " + enUs.DateTimeFormat.CalendarWeekRule.ToString());

Tente mudar a instância CultureInfo para sua própria cultura ou outra cultura que você conhece, para ver como essas propriedades variam!

Outra coisa legal é que você pode obter informações sobre os nomes de mês e dia da cultura específica usando propriedades como MonthNames e métodos como GetMonthName() . Aqui está um exemplo rápido:

CultureInfo enUs = new CultureInfo("en-US");

foreach (string monthName in enUs.DateTimeFormat.MonthNames)
    Console.WriteLine(monthName);
Console.WriteLine("Current month: " + enUs.DateTimeFormat.GetMonthName(DateTime.Now.Month));

E exatamente a mesma coisa pode ser realizada por dias, usando a propriedade DayNames e o método GetDayName() :

CultureInfo enUs = new CultureInfo("en-US");

foreach (string dayName in enUs.DateTimeFormat.DayNames)
    Console.WriteLine(dayName);
Console.WriteLine("Today is: " + enUs.DateTimeFormat.GetDayName(DateTime.Now.DayOfWeek));

Existem muitas propriedades e métodos mais úteis na propriedade DateTimeFormat, por ex. DateSeparator, YearMonthPattern e assim por diante. Dê uma olhada para si mesmo - pode muito bem haver uma solução para seu problema relacionado a data/hora escondido lá: DateTimeFormatInfo documentation.

Formato numérico

Assim como o DateTimeFormat tem informações sobre datas, você pode acessar informações sobre como a cultura específica trata os números da propriedade NumberFormat . Essa informação é usada toda vez que você solicita uma representação visual de um número, por exemplo, ao convertê-lo em uma string e gravá-lo no console, mas você também pode acessar as informações, usando as propriedades e métodos na propriedade NumberFormat - aqui está um exemplo:

CultureInfo enUs = new CultureInfo("en-US");  
Console.WriteLine(enUs.DisplayName + ":");  
Console.WriteLine("NumberGroupSeparator: " + enUs.NumberFormat.NumberGroupSeparator);  
Console.WriteLine("NumberDecimalSeparator: " + enUs.NumberFormat.NumberDecimalSeparator);  

CultureInfo deDe = new CultureInfo("de-DE");  
Console.WriteLine(deDe.DisplayName + ":");  
Console.WriteLine("NumberGroupSeparator: " + deDe.NumberFormat.NumberGroupSeparator);  
Console.WriteLine("NumberDecimalSeparator: " + deDe.NumberFormat.NumberDecimalSeparator);

Usamos as propriedades NumberGroupSeparator e NumberDecimalSeparator para obter informações sobre como um número é exibido (por exemplo, 1.000,00 ou 1.000,00) para as culturas inglesa e alemã. Se você der uma olhada, você encontrará propriedades correspondentes para moedas ( CurrencyGroupSeparator e CurrencyDecimalSeparator ), bem como porcentagens ( PercentGroupSeparator e PercentDecimalSeparator ).

Falando em moeda, a propriedade NumberFormat também pode informar qual símbolo uma determinada cultura usa para exibir um valor monetário - basta usar a propriedade CurrencySymbol :

CultureInfo enUs = new CultureInfo("en-US");
Console.WriteLine(enUs.DisplayName + " - currency symbol: " + enUs.NumberFormat.CurrencySymbol);
CultureInfo deDe = new CultureInfo("de-DE");
Console.WriteLine(deDe.DisplayName + " - currency symbol: " + deDe.NumberFormat.CurrencySymbol);
CultureInfo ruRu = new CultureInfo("ru-RU");
Console.WriteLine(ruRu.DisplayName + " - currency symbol: " + ruRu.NumberFormat.CurrencySymbol);

Todas essas propriedades são interessantes de se conhecer, mas na maioria das situações, você não terá que lidar com elas, já que o C # usará as informações silenciosamente para formatar números, porcentagens e moedas para você, desde que você especifique o formato correto quando você liga o número em uma string.

Nomes & amp; identificadores

Por fim, vamos dar uma olhada nas propriedades que representam a instância CultureInfo. Nós já usamos alguns deles, por exemplo Nome e DisplayName , mas como eles realmente funcionam? Primeiro, aqui está uma lista das propriedades disponíveis usadas para identificar um CultureInfo:

  • Nome identificará um CultureInfo no formato de código de país/região languagecode, por exemplo "en-US" para inglês nos EUA, en-GB para inglês na Grã-Bretanha e assim por diante. Se nenhum país/região for especificado, somente a primeira parte será retornada, por ex. "en" para inglês.
  • TwoLetterISOLanguageName fará praticamente o mesmo que Name, mas só retornará o código do idioma, independentemente de um país/região ter sido especificado ou não. Por exemplo, "en" será retornado para "en-US" e "en-GB". As cartas retornadas são especificadas no padrão ISO 639-1 .
  • ThreeLetterISOLanguageName funciona muito como TwoLetterISOLanguageName, mas retorna três letras em vez de duas, conforme especificado pela ISO 639 -2 padrão .
  • EnglishName retornará o nome do idioma (em inglês). Se um país/região tiver sido especificado, isso será anexado ao resultado, dentro de um conjunto de parênteses.
  • NomeNativo retornará o nome do idioma (no idioma especificado pela instância CultureInfo). Se um país/região tiver sido especificado, isso será anexado ao resultado, dentro de um conjunto de parênteses.

Resumo

Como você pode aprender com a extensão deste artigo, lidar com a cultura em geral não é uma tarefa simples. Felizmente para nós, o framework .NET torna muito mais fácil com a classe CultureInfo. Ele é usado silenciosamente em toda a sua aplicação ao formatar números e datas, mas é bom que você saiba como funciona para que você possa modificar o comportamento, se necessário. Espero que este artigo tenha lhe ensinado a maior parte do que você precisa saber sobre a classe CultureInfo.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!