Trabajo en una aplicación bastante grande ASP .NET Web Forms que actualmente se usa principalmente en los Estados Unidos. Estamos en proceso de lanzarlo a otras partes del mundo, lo que por supuesto significa que estamos trabajando en la localización de todas las áreas de la aplicación. En términos generales, nuestro enfoque ha sido establecer las propiedades CurrentCulture y CurrentUICulture del subproceso actual al comienzo de cada solicitud para admitir el formato adecuado y la extracción de recursos en función de la configuración regional del usuario actual.¿Es este un buen enfoque para cambiar temporalmente la cultura del hilo actual?
En algunos casos, sin embargo, tenemos la necesidad de ejecutar un cierto código usando una cultura que no sea la cultura del usuario actual. Por ejemplo, 'Usuario A' vive en Alemania, pero trabaja para una empresa que hace negocios con otras compañías en Francia. Cuando 'Usuario A' desea crear una factura (PDF) para una de esas compañías francesas, queremos que ese código de generación de factura se ejecute con la cultura 'fr-FR' en lugar de la cultura 'de-DE'.
He considerado un par de maneras de hacerlo fácilmente y me pregunto si estoy haciendo esto correctamente. Mis principales preocupaciones están relacionadas con el rendimiento y la seguridad de las secuencias.
Un enfoque implica un método estático diseñado para ejecutar una tarea determinada con una cultura proporcionada. Algo como esto:
public static void RunWithCulture(CultureInfo culture, Action task)
{
if (culture == null)
throw new ArgumentNullException("culture");
var originalCulture = new
{
Culture = Thread.CurrentThread.CurrentCulture,
UICulture = Thread.CurrentThread.CurrentUICulture
};
try
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
task();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture.Culture;
Thread.CurrentThread.CurrentUICulture = originalCulture.UICulture;
}
}
Este método podría entonces ser invocada como esto:
var customerCulture = new CultureInfo(currentCustomer.Locale);
CultureRunner.RunWithCulture(customerCulture,() => invoiceService.CreateInvoice(currentCustomer.CustomerId));
También he considerado la creación de una clase que implementa IDisposable que sería responsable de establecer la cultura de rosca en su ctor y luego regresar las culturas originales de vuelta en el método Dispose, por lo que se podría llamar así:
var customerCulture = new CultureInfo(currentCustomer.Locale);
using(new CultureRunner(currentCustomer.Locale))
{
invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
¿Voy sobre todo mal? ¿Cuál de estos enfoques es preferible?
Me gusta el enfoque 'using'. –
el enfoque de uso es el mejor para mí también. –