【发布时间】:2011-08-13 04:11:48
【问题描述】:
我在一个相当大的 ASP .NET Web 窗体应用程序上工作,该应用程序目前主要在美国使用。我们正在将其推广到世界其他地区,这当然意味着我们目前正在努力本地化应用程序的所有领域。一般来说,我们的方法是在每个请求开始时设置当前线程的 CurrentCulture 和 CurrentUICulture 属性,以支持基于当前用户区域设置的正确格式和资源提取。
然而,在某些情况下,我们需要使用不同于当前用户的文化的文化来运行某段代码。例如,“用户 A”居住在德国,但在一家与法国其他公司开展业务的公司工作。当“用户 A”想要为其中一家法国公司创建发票 (PDF) 时,我们希望发票生成代码以“fr-FR”文化而不是“de-DE”文化运行。
我已经考虑了几种轻松完成此操作的方法,并且想知道我是否正确地进行了此操作。我主要关心的是性能和线程安全。
一种方法涉及一种静态方法,旨在以提供的文化运行给定任务。像这样的:
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;
}
}
然后可以像这样调用此方法:
var customerCulture = new CultureInfo(currentCustomer.Locale);
CultureRunner.RunWithCulture(customerCulture, () => invoiceService.CreateInvoice(currentCustomer.CustomerId));
我还考虑创建一个实现 IDisposable 的类,该类负责在其 ctor 中设置线程文化,然后在 Dispose 方法中返回原始文化,因此您可以这样称呼它:
var customerCulture = new CultureInfo(currentCustomer.Locale);
using(new CultureRunner(currentCustomer.Locale))
{
invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
我做错了吗?如果这些方法中的任何一种更可取?
【问题讨论】:
-
使用方法对我来说也是最好的。
标签: c# .net localization cultureinfo