¿Hay alguna manera de establecer la cultura para una aplicación completa? Todos los hilos actuales y nuevos hilos?
Tenemos el nombre de la cultura almacenada en una base de datos, y cuando se inicia nuestra aplicación, lo hacemos
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Pero, por supuesto, esto se "pierde" cuando queremos hacer algo en un nuevo hilo. ¿Hay alguna forma de configurar eso CurrentCulture
y CurrentUICulture
para toda la aplicación? ¿Entonces esos nuevos hilos también adquieren esa cultura? ¿O se produce algún evento cada vez que se crea un nuevo hilo al que puedo conectarme?
c#
multithreading
cultureinfo
Svish
fuente
fuente
Respuestas:
En .NET 4.5, puede usar la
CultureInfo.DefaultThreadCurrentCulture
propiedad para cambiar la cultura de un dominio de aplicación.Para las versiones anteriores a la 4.5, debe usar la reflexión para manipular la cultura de un AppDomain. Hay un campo estático privado en
CultureInfo
(m_userDefaultCulture
en .NET 2.0 mscorlib,s_userDefaultCulture
en .NET 4.0 mscorlib) que controla lo que seCurrentCulture
devuelve si un hilo no ha establecido esa propiedad en sí mismo.Esto no cambia la configuración regional del hilo nativo y probablemente no sea una buena idea enviar código que cambie la cultura de esta manera. Sin embargo, puede ser útil para probar.
fuente
Esto se pregunta mucho. Básicamente, no, no hay, no para .NET 4.0. Debe hacerlo manualmente al comienzo de cada nuevo hilo (o
ThreadPool
función). Tal vez podría almacenar el nombre de la cultura (o solo el objeto de la cultura) en un campo estático para evitar tener que presionar la base de datos, pero eso es todo.fuente
Si está utilizando recursos, puede forzarlo manualmente:
En el administrador de recursos, hay un código generado automáticamente que es el siguiente:
Ahora, cada vez que se refiere a su cadena individual dentro de este recurso, anula la cultura (hilo o proceso) con la ResourceCulture especificada.
Puede especificar el idioma como "fr", "de" etc. o poner el código del idioma como 0x0409 para en-US o 0x0410 para it-IT. Para obtener una lista completa de códigos de idioma, consulte: Identificadores de idioma y configuraciones regionales
fuente
Resource1.Culture = Null;
Para .net 4.5 y superior, debe usar
fuente
En realidad, puede establecer la cultura de subprocesos predeterminada y la cultura de la interfaz de usuario, pero solo con Framework 4.5+
Puse en este constructor estático
y poner un punto de interrupción en el método Convert de un ValueConverter para ver qué llegó al otro extremo. CultureInfo.CurrentUICulture dejó de ser en-US y se convirtió en en-AU completo con mi pequeño truco para que respete la configuración regional de ShortTimePattern.
¡Hurra, todo está bien en el mundo! O no. El parámetro de cultura pasado al método Convert todavía está en EE. UU. Erm, ¿WTF? Pero es un comienzo. Al menos de esta manera
CultureInfo.CurrentUICulture
string.Format("{0}", DateTime.Now)
utilizará su configuración regional personalizadaSi no puede usar la versión 4.5 del marco, deje de configurar CurrentUICulture como una propiedad estática de CultureInfo y configúrelo como una propiedad estática de una de sus propias clases. Esto no solucionará el comportamiento predeterminado de string.Format o hará que StringFormat funcione correctamente en enlaces, luego recorra el árbol lógico de su aplicación para recrear todos los enlaces en su aplicación y establecer su cultura de conversión.
fuente
Para ASP.NET5, es decir, ASPNETCORE, puede hacer lo siguiente en
configure
:Aquí hay una serie de publicaciones de blog que brindan más información.
fuente
Esta respuesta es un poco de expansión para la gran respuesta de @ rastating. Puede usar el siguiente código para todas las versiones de .NET sin preocupaciones:
fuente
DefaultThreadCurrentCulture
y tambiénDefaultThreadCurrentUICulture
están presentes en Framework 4.0, pero son privados. Usando Reflection puedes configurarlos fácilmente. Esto afectará a todos los subprocesos dondeCurrentCulture
no se establece explícitamente (ejecutando subprocesos también).fuente
Aquí está la solución para c # MVC:
Primero: cree un atributo personalizado y anule un método como este:
Segundo: en App_Start, busque FilterConfig.cs, agregue este atributo. (esto funciona para TODA la aplicación)
Eso es !
Si desea definir la cultura para cada controlador / acción en lugar de la aplicación completa, puede usar este atributo de esta manera:
O:
fuente
Solución de trabajo para configurar CultureInfo para todos los hilos y ventanas.
fuente