C# -  Alterando temporariamente a cultura atual


 Nesta dica veremos como alterar temporariamente a cultura atual.

A propriedade CurrentCulture é uma configuração definida por thread; ou seja, cada thread pode ter sua própria cultura e você obtém a cultura da thread atual recuperando o valor do CultureInfo.

Pode acontecer, mesmo apenas para testar algumas funcionalidades, que você queira alterar a Cultura da thread na qual seu aplicativo está sendo executado.

De forma simples e direta você pode usar o método o  Thread.CurrentThread.CurrentCulture  para definir a cultura da thread atual

CultureInfo minhaCultura = new CultureInfo("pt-BR");
Thread.CurrentThread.CurrentCulture = minhaCultura;

De formaOu usar o método Thread.CurrentThread.CurrentUICulture para definir a cultura da interface do usuário da thread atual:

CultureInfo minhaCultura = new CultureInfo("pt-BR");
Thread.CurrentThread.CurrentUICulture = minhaCultura;

Como podemos mudar temporariamente a cultura atual ?

Outra abordagem é criar uma classe que implemente a interface IDisposable para criar uma seção, delimitada por um bloco using, com a nova Culture.

Abaixo temos a classe MudarCulturaAtual :

using System.Globalization;
namespace MudarCulturaAtual;
public class CulturaTemporaria : IDisposable
{
    CultureInfo _culturaAntiga;
    public CulturaTemporaria(CultureInfo novaCultura)
    {
        _culturaAntiga = CultureInfo.CurrentCulture;
        Thread.CurrentThread.CurrentCulture = novaCultura;
    }
    public void Dispose()
    {
        Thread.CurrentThread.CurrentCulture = _culturaAntiga;
    }
} 

No construtor da classe , armazenamos a Cultura atual em um campo privado. Então, quando chamamos o método Dispose (que é chamado implicitamente ao fechar o bloco using), usamos esse valor para restaurar a Cultura original.

Exemplo de uso

A seguir temos um exemplo de uso da implementação desta classe:

using MudarCulturaAtual;
using System.Globalization;
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-gb");
ExibirSimboloMoeda();
using (new CulturaTemporaria(new CultureInfo("en-us")))
{
    ExibirSimboloMoeda();
}
using (new CulturaTemporaria(new CultureInfo("pt-br")))
{
    ExibirSimboloMoeda();
}
ExibirSimboloMoeda();
Console.ReadKey();
static void ExibirSimboloMoeda()
{
   Console.WriteLine($"moeda :
    {Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol}");
}

Iniciamos definindo a Cultura da thread atual para a Grã-Bretanha para que o símbolo da moeda seja o euro.

A seguir  mudamos temporariamente para a cultura americana e imprimimos o símbolo do dólar.

Depois alteramos novamenta para a cultura do português brasileiro exibindo o símbolo do Real.

Finalmente, quando saímos do bloco using, voltamos para a cultura da Grã-Bretanha com o euro.

Abaixo o resultado:

Usar uma classe que implementa IDisposable é uma boa maneira de criar um ambiente temporário com características diferentes do ambiente principal.

Podemos usar essa abordagem para experimentar diferentes culturas para entender como o código se comporta quando não estamos usando a cultura ocidental.

E estamos conversados...

"Já estou crucificado com Cristo; e vivo, não mais eu, mas Cristo vive em mim; e a vida que agora vivo na carne, vivo-a pela fé do Filho de Deus, o qual me amou, e se entregou a si mesmo por mim"
Gálatas 2:20

Referências:


José Carlos Macoratti