Existe uma maneira de definir a cultura para um aplicativo inteiro? Todos os tópicos atuais e novos tópicos?
Temos o nome da cultura armazenada em um banco de dados e, quando nosso aplicativo é iniciado, fazemos
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Mas, é claro, isso se "perde" quando queremos fazer algo em um novo segmento. Existe uma maneira de definir isso CurrentCulture
e CurrentUICulture
para todo o aplicativo? Para que novos tópicos também recebam essa cultura? Ou é algum evento acionado sempre que um novo encadeamento é criado que eu posso conectar?
c#
multithreading
cultureinfo
Svish
fonte
fonte
Respostas:
No .NET 4.5, você pode usar a
CultureInfo.DefaultThreadCurrentCulture
propriedade para alterar a cultura de um AppDomain.Para versões anteriores à 4.5, é necessário usar a reflexão para manipular a cultura de um AppDomain. Há um campo estático privado no
CultureInfo
(m_userDefaultCulture
no .NET 2.0 mscorlib,s_userDefaultCulture
no .NET 4.0 mscorlib) que controla o queCurrentCulture
retorna se um thread não tiver definido essa propriedade por si só.Isso não altera o código do idioma nativo do encadeamento e provavelmente não é uma boa ideia enviar código que altera a cultura dessa maneira. No entanto, pode ser útil para testar.
fonte
Isso é muito solicitado. Basicamente, não, não existe, não para o .NET 4.0. Você deve fazer isso manualmente no início de cada novo thread (ou
ThreadPool
função). Talvez você possa armazenar o nome da cultura (ou apenas o objeto da cultura) em um campo estático para evitar ter que acessar o banco de dados, mas é isso.fonte
Se você estiver usando recursos, poderá forçá-lo manualmente:
No gerenciador de recursos, há um código gerado automaticamente, que é o seguinte:
Agora, toda vez que você se refere à sua sequência individual nesse recurso, ela substitui a cultura (encadeamento ou processo) pelo resourceCulture especificado.
Você pode especificar o idioma como em "fr", "de" etc., ou colocar o código do idioma como em 0x0409 para en-US ou 0x0410 para it-IT. Para obter uma lista completa dos códigos de idioma, consulte: Identificadores de idioma e localidades
fonte
Resource1.Culture = Null;
Para .net 4.5 e superior, você deve usar
fonte
Na verdade, você pode definir a cultura de thread padrão e a cultura da interface do usuário, mas apenas com o Framework 4.5+
Eu coloquei nesse construtor estático
e coloque um ponto de interrupção no método Convert de um ValueConverter para ver o que chegou ao outro extremo. CultureInfo.CurrentUICulture deixou de ser en-US e tornou-se en-AU completo com meu pequeno truque para fazer respeitar as configurações regionais de ShortTimePattern.
Viva, tudo está bem no mundo! Ou não. O parâmetro de cultura passado para o método Convert ainda é en-US. Erm, WTF ?! Mas é um começo. Pelo menos assim
CultureInfo.CurrentUICulture
string.Format("{0}", DateTime.Now)
usará suas configurações regionais personalizadasSe você não pode usar a versão 4.5 da estrutura, desista de configurar o CurrentUICulture como uma propriedade estática de CultureInfo e defina-a como uma propriedade estática de uma de suas próprias classes. Isso não corrige o comportamento padrão de string.Format ou faz com que o StringFormat funcione corretamente nas ligações e percorre a árvore lógica do aplicativo para recriar todas as ligações no aplicativo e definir a cultura do conversor.
fonte
Para o ASP.NET5, ou seja, ASPNETCORE, você pode fazer o seguinte em
configure
:Aqui está uma série de postagens no blog que fornece mais informações.
fonte
Esta resposta é um pouco de expansão para a ótima resposta do @ rastating. Você pode usar o código a seguir para todas as versões do .NET sem preocupações:
fonte
DefaultThreadCurrentCulture
e tambémDefaultThreadCurrentUICulture
estão presentes no Framework 4.0, mas são privados. Usando o Reflection, você pode configurá-los facilmente. Isso afetará todos os threads em queCurrentCulture
não está explicitamente definido (executando threads também).fonte
Aqui está a solução para c # MVC:
Primeiro: crie um atributo personalizado e substitua o método como este:
Segundo: no App_Start, localize FilterConfig.cs, adicione este atributo. (isso funciona para aplicação INTEIRA)
É isso aí !
Se você deseja definir a cultura para cada controlador / ação em vez de todo o aplicativo, você pode usar este atributo como este:
Ou:
fonte
Solução de trabalho para definir CultureInfo para todos os threads e janelas.
fonte