Pergunta

Nosso aplicativo permite que o usuário altere a cultura em que a executa e que a cultura pode ser diferente da cultura subjacente do sistema operacional. A única maneira que eu encontrei sobre isso é definir o thread.currentThread.currentculture and thread.currentThread.currentuiculture para cada thread.

O único problema com isso é que devemos definir a cultura para cada thread e precisamos lembrar de fazer isso sempre que criarmos um novo thread. Se você definir um segmento para outra cultura, criar um novo thread, ele obtém a cultura do sistema operacional, não do thread que o criou.

Eu gostaria de encontrar uma maneira melhor de fazer isso. Só consigo pensar em duas coisas, mas não sei se são possíveis.

  1. Defina a cultura no nível do aplicativo para que todos os threads padrão para essa cultura. Isso é possível?
  2. Existe um evento de criação de threads em qualquer lugar que eu possa me inscrever? Dessa forma, posso configurar um manipulador para definir a cultura na criação de threads.

Quaisquer idéias ou ajuda seriam bem -vindas, mesmo que eu precise prender a API Win32. Desde já, obrigado.

EDITAR: eu encontrei essa questão o que é semelhante, mas nenhuma resposta foi encontrada.

Foi útil?

Solução 3

Duas novas propriedades foram adicionadas à classe CultureInfo no .NET 4.5, que resolve esse problema, DefaultThreadCurrentCulture e DefaultThreadCurrentuiculture.

Agora você pode definir essas duas propriedades e todos os novos threads serão definidos para a cultura padrão em vez da cultura do sistema. Essas propriedades também definirão a cultura para todos os tópicos existentes que não têm explicitamente seu conjunto de cultura.

Outras dicas

Pode não ser a solução exata, mas que tal criar uma classe responsável pela sua criação de threads?

class MyThreadFactory
{
    public static Thread getThread()
    {
        Thread a = new Thread(..);
        a.CurrentCulture = xxxx;
        return a;
    }
}

Uso:

Thread newThread = MyThreadFactory.getThread();
  1. Você pode colocar toda a sua lógica de cultura e arquivos de recursos estáticos na camada de interface do usuário/apresentação e apenas se preocupar com a cultura do encadeamento da interface do usuário (assumindo o aplicativo de desktop aqui). Isso incluiria quaisquer traduções que estejam em arquivos de recursos, qualquer formatação específica da cultura, etc.
  2. Se a primeira ideia não puder ser implementada, você poderá criar uma classe de thread auxiliar que define a cultura para você quando os threads de longa data são criados. Você também precisará definir a cultura de todos os threads de threads.

A cultura é um conceito específico de threads no Windows, e os threads no Windows são realmente agnósticos de um processo ou aplicativo. Não há nível de abstração entre um encadeamento e o sistema operacional que contém informações de cultura (que eu conheço), então você deve defini -lo em cada thread.

Apenas para adicionar a resposta @ROB Prouse. Aqui está uma demonstração rápida.

  1. Definindo a cultura na intialização do aplicativo:

      if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$")
      {
           CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
           customCulture.NumberFormat.CurrencySymbol = "N$";
    
           CultureInfo.DefaultThreadCurrentCulture = customCulture;
           CultureInfo.DefaultThreadCurrentUICulture = customCulture;
       }
    
  2. Usando as informações da cultura no meu .ToString ().

     .ToString("C", CultureInfo.DefaultThreadCurrentCulture)
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top