Globalize seus formatos de data/hora/número

Projete seu aplicativo para estar pronto para uso global formatando adequadamente datas, horas, números, números de telefone e moedas. Mais tarde, você poderá adaptar seu aplicativo para culturas, regiões e idiomas adicionais no mercado global.

Introdução

Ao criar seu aplicativo, se você pensar de maneira mais ampla do que um único idioma e cultura, terá pouco ou nenhum problema inesperado quando seu aplicativo se expandir para novos mercados. Por exemplo, datas, horas, números, calendários, moeda, números de telefone, unidades de medida e tamanhos de papel são todos itens que podem ser exibidos de maneira diferente em culturas ou idiomas diferentes.

Diferentes regiões e culturas usam diferentes formatos de data e hora. Isso inclui convenções para a ordem do dia e do mês na data, para a separação de horas e minutos no tempo e até mesmo para qual pontuação é usada como separador. Além disso, as datas podem ser exibidas em vários formatos longos ("quarta-feira, 28 de março de 2012") ou formatos curtos ("28/03/12"), que variam entre culturas. E, claro, os nomes e as abreviaturas para os dias da semana e meses do ano diferem entre os idiomas.

Você pode visualizar os formatos usados para diferentes idiomas. Vá para Configurações>Hora e idioma>Região e idioma e clique em Configurações adicionais de data, hora e região>Alterar formatos de data, hora ou número. Na guia Formatos, selecione um idioma na lista suspensa Formato e visualize os formatos em Exemplos.

Este tópico usa os termos "lista de idiomas de perfil de usuário", "lista de idiomas de manifesto do aplicativo" e "lista de idiomas do runtime de aplicativo". Para obter detalhes sobre exatamente o que esses termos significam e como acessar seus valores, consulte Compreender os idiomas do perfil de usuário e os idiomas do manifesto do aplicativo.

Formatar datas e horas para a lista de idiomas de runtime do aplicativo

Se você precisar permitir que os usuários escolham uma data ou selecionem uma hora, use os controles padrão de calendário, data e hora. Eles usam automaticamente o melhor formato de data e hora para a lista de linguagem de runtime do aplicativo.

Se você mesmo precisar exibir datas ou horas, poderá usar a classe DateTimeFormatter. Por padrão, DateTimeFormatter usa automaticamente o melhor formato de data e hora para a lista de linguagem de runtime do aplicativo. Assim, o código abaixo formata uma determinada DateTime da melhor maneira para essa lista. Como exemplo, suponha que a lista de idiomas do manifesto do aplicativo inclua inglês (Estados Unidos), que também é seu padrão, e alemão (Alemanha). Se a data atual for 6 de novembro de 2017 e a lista de idiomas do perfil de usuário contiver alemão (Alemanha) primeiro, o formatador fornecerá "06.11.2017". Se a lista de idiomas do perfil de usuário contiver inglês (Estados Unidos) primeiro (ou se não contiver inglês nem alemão), o formatador apresentará "11/6/2017" (já que "en-US" corresponde ou é usado como padrão).

    // Use the DateTimeFormatter class to display dates and times using basic formatters.

    var shortDateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("shortdate");
    var shortTimeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("shorttime");

    var dateTimeToFormat = DateTime.Now;

    var shortDate = shortDateFormatter.Format(dateTimeToFormat);
    var shortTime = shortTimeFormatter.Format(dateTimeToFormat);

    var results = "Short Date: " + shortDate + "\n" +
                  "Short Time: " + shortTime;

Você pode testar o código acima em seu próprio computador como este.

Formatar datas e horas para a lista de idiomas do perfil de usuário.

Lembre-se de que, por padrão, DateTimeFormatter corresponde à lista de idiomas do runtime do aplicativo. Dessa forma, se você exibir sequências como "A data é <data>", o idioma corresponderá ao formato de data.

Se, por qualquer motivo, você quiser formatar datas e/ou horas apenas de acordo com a lista de idiomas do perfil de usuário, poderá fazer isso usando um código como o exemplo abaixo. Porém, se você fizer isso, entenda que o usuário pode escolher um idioma para o qual seu aplicativo não tenha cadeias de caracteres traduzidas. Por exemplo, se seu aplicativo não estiver localizado em alemão (Alemanha), mas o usuário escolher esse como seu idioma preferido, isso poderá resultar na exibição de sequências de caracteres de aparência discutivelmente estranha, como "A data é 06.11.2017".

    // Use the DateTimeFormatter class to display dates and times using basic formatters.

    var userLanguages = Windows.System.UserProfile.GlobalizationPreferences.Languages;

    var shortDateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("shortdate", userLanguages);

    var results = "Short Date: " + shortDateFormatter.Format(DateTime.Now);

Formatar números e moedas adequadamente

Culturas diferentes formatam números de modo diferente. As diferenças de formato podem incluir quantos dígitos decimais exibir, quais caracteres usar como separadores decimais e qual símbolo da moeda usar. Use classes no namespace NumberFormatting para exibir decimais, porcentagem, números por milhagem e moedas. Na maioria das vezes, você desejará que essas classes de formatador usem o melhor formato para o perfil de usuário. Mas você pode usar os formatadores para exibir uma moeda para qualquer região ou formato.

Este exemplo mostra como exibir moedas de acordo com o perfil de usuário e para um determinado sistema de moeda específico.

    // This scenario uses the CurrencyFormatter class to format a number as a currency.

    var userCurrency = Windows.System.UserProfile.GlobalizationPreferences.Currencies[0];

    var valueToBeFormatted = 12345.67;

    var userCurrencyFormatter = new Windows.Globalization.NumberFormatting.CurrencyFormatter(userCurrency);
    var userCurrencyValue = userCurrencyFormatter.Format(valueToBeFormatted);

    // Create a formatter initialized to a specific currency,
    // in this case US Dollar (specified as an ISO 4217 code) 
    // but with the default number formatting for the current user.
    var currencyFormatUSD = new Windows.Globalization.NumberFormatting.CurrencyFormatter("USD");
    var currencyValueUSD = currencyFormatUSD.Format(valueToBeFormatted);

    // Create a formatter initialized to a specific currency.
    // In this case it's the Euro with the default number formatting for France.
    var currencyFormatEuroFR = new Windows.Globalization.NumberFormatting.CurrencyFormatter("EUR", new[] { "fr-FR" }, "FR");
    var currencyValueEuroFR = currencyFormatEuroFR.Format(valueToBeFormatted);

    // Results for display.
    var results = "Fixed number (" + valueToBeFormatted + ")\n" +
                    "With user's default currency: " + userCurrencyValue + "\n" +
                    "Formatted US Dollar: " + currencyValueUSD + "\n" +
                    "Formatted Euro (fr-FR defaults): " + currencyValueEuroFR;

Você pode testar o código acima em seu próprio PC alterando o país ou região em Configurações>Hora e idioma>Região e idioma>País ou região. Escolha um país ou região (talvez Islândia) e execute o código novamente.

Usar um calendário culturalmente apropriado

O calendário difere entre regiões e idiomas. O calendário gregoriano não é o padrão para todas as regiões. Os usuários em algumas regiões podem escolher calendários alternativos, como o calendário da era japonesa ou calendários lunares árabes. As datas e horas no calendário também são sensíveis a diferentes fusos horários e horário de verão.

Para garantir que o formato de calendário preferencial seja usado, você pode usar os controles padrão de calendário, data e hora. Para cenários mais complexos, em que pode ser necessário trabalhar diretamente com operações em datas de calendário, Windows.Globalization fornece uma classe Calendar que fornece uma representação de calendário apropriada para determinada cultura, região e tipo de calendário.

Formatar números de telefone adequadamente

Os números de telefone são formatados de modo diferente entre as regiões. O número de dígitos, como os dígitos são agrupados e a significância de certas partes do número de telefone variam entre os países. Do Windows 10, versão 1607, em diante você pode usar classes no namespace PhoneNumberFormatting para formatar números de telefone de modo adequado para a região atual.

PhoneNumberInfo analisa uma sequência de dígitos e permite: determinar se os dígitos são um número de telefone válido na região atual, comparar dois números para igualdade e extrair as diferentes partes funcionais do número de telefone, como código do país ou código de área geográfica.

PhoneNumberFormatter formata uma sequência de dígitos ou uma PhoneNumberInfo para exibição, mesmo quando a sequência de dígitos representa um número de telefone parcial. Você pode usar essa formatação de número parcial para formatar um número à medida que um usuário está inserindo o número.

O exemplo abaixo mostra como usar PhoneNumberFormatter para formatar um número de telefone à medida que ele está sendo inserido. Cada vez que o texto é alterado em uma TextBox chamada phoneNumberInputTextBox, o conteúdo da caixa de texto é formatado usando a região padrão atual e exibido em um TextBlock chamado phoneNumberOutputTextBlock. Para fins de demonstração, a sequência de caracteres também é formatada usando a região da Nova Zelândia e exibida em um TextBlock chamado phoneNumberOutputTextBlockNZ.

    using Windows.Globalization.PhoneNumberFormatting;

    PhoneNumberFormatter currentFormatter, NZFormatter;

    public MainPage()
    {
        this.InitializeComponent();

        // Use the default formatter for the current region
        this.currentFormatter = new PhoneNumberFormatter();

        // Create an explicit formatter for New Zealand. 
        PhoneNumberFormatter.TryCreate("NZ", out this.NZFormatter);
    }

    private void phoneNumberInputTextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        // Format for the default region.
        this.phoneNumberOutputTextBlock.Text = currentFormatter.FormatPartialString(this.phoneNumberInputTextBox.Text);

        // If the NZFormatter was created successfully, format the partial string for the NZ TextBlock.
        if(this.NZFormatter != null)
        {
            this.phoneNumberOutputTextBlockNZ.Text = this.NZFormatter.FormatPartialString(this.phoneNumberInputTextBox.Text);
        }
    }

Você pode testar o código acima em seu próprio PC alterando o país ou região em Configurações>Hora e idioma>Região e idioma>País ou região. Escolha um país ou região (talvez Nova Zelândia para confirmar se os formatos correspondem) e execute o código novamente. Para dados de teste, você pode fazer uma pesquisa na Web para o número de telefone de uma empresa na Nova Zelândia.

Preferências linguísticas e culturais do usuário

Para cenários em que você deseja fornecer funcionalidades diferentes com base apenas no idioma, região ou preferências culturais do usuário, o Windows oferece um modo de acessar essas preferências por meio de Windows.System.UserProfile.GlobalizationPreferences. Quando necessário, use a classe GlobalizationPreferences para obter o valor da região geográfica atual do usuário, idiomas preferenciais, moedas preferenciais e assim por diante. Porém, lembre-se de que, se as cadeias de caracteres/imagens do seu aplicativo não estiverem localizadas para o idioma preferido do usuário, as datas e horas e outros dados formatados para esse idioma preferido não corresponderão às cadeias de caracteres exibidas.

APIs importantes

Exemplos