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: