Pregunta

Nuestra aplicación permite al usuario cambiar la cultura de que se ejecutan bajo y que la cultura puede ser diferente a la cultura del sistema operativo subyacente. La única manera que he encontrado para hacer esto es mediante el establecimiento de Thread.CurrentThread.CurrentCulture y Thread.CurrentThread.CurrentUICulture para cada hilo.

El único problema con esto es que hay que establecer la cultura de cada hilo y tenemos que recordar hacer esto cada vez que se crea un nuevo hilo. Si se establece un hilo a otra cultura, a continuación, crear un nuevo hilo, se pone la cultura del sistema operativo, no de la rosca que lo creó.

Me gustaría encontrar una mejor manera de hacer esto. Sólo puedo pensar en dos cosas, pero no sé si alguno son posibles.

  1. Establecer la cultura a nivel de aplicación para que todos los temas por defecto a esa cultura. ¿Es esto posible?
  2. ¿Hay un evento de creación del hilo en cualquier lugar que pueda suscribirse? De esta manera puedo configurar un controlador para establecer la cultura en la creación del hilo.

Cualquier idea o ayuda sería bienvenida, incluso si tengo que PInvoke a la API de Win32. Gracias de antemano.

EDIT: se encontró que esta cuestión que es similar, pero ninguna respuesta.

¿Fue útil?

Solución 3

Dos nuevas propiedades se añadieron a la clase CultureInfo en .NET 4.5 que resolver este problema, DefaultThreadCurrentCulture y DefaultThreadCurrentUICulture .

Ahora se puede establecer estas dos propiedades y todos los nuevos temas se establecerá en la cultura por defecto en lugar de la cultura del sistema. Estas propiedades también establecer la cultura de todos los hilos existentes que no tienen explícitamente su conjunto cultura.

Otros consejos

Puede que no sea la solución exacta, pero ¿qué hay de la creación de una clase que se encarga de la creación de su hilo?

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

Uso:

Thread newThread = MyThreadFactory.getThread();
  1. Usted puede colocar toda la lógica de la cultura y archivos de recursos estáticos en la capa de interfaz de usuario / Presentación y sólo preocuparse por la cultura del subproceso de interfaz de usuario (suponiendo la aplicación de Escritorio aquí). Esto incluiría cualquier traducción que se encuentran en los archivos de recursos, ningún formato específico de la cultura, etc.
  2. Si la primera idea no puede ser implementado, puede crear una clase de ayuda hilo que establece la cultura para que cuando se crean las discusiones de larga duración. También tendrá que establecer la cultura de todos los hilos de rosca de la piscina.

La cultura es un concepto-hilo específico en Windows, y los hilos de Windows son en realidad agnóstico de un proceso o dominio de aplicación. No hay un nivel de abstracción entre un hilo y el sistema operativo que contiene información sobre la cultura (que yo sepa), así que hay que establecer en cada hilo.

Sólo para añadir a @ Rob respuesta Prouse. Aquí es una demostración rápida.

  1. Configuración de la cultura en App inicialización:

      if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$")
      {
           CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
           customCulture.NumberFormat.CurrencySymbol = "N$";
    
           CultureInfo.DefaultThreadCurrentCulture = customCulture;
           CultureInfo.DefaultThreadCurrentUICulture = customCulture;
       }
    
  2. El uso de la información de la cultura en mi .ToString ().

     .ToString("C", CultureInfo.DefaultThreadCurrentCulture)
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top