Jes*_*ber 21 .net c# localization cultureinfo
我在一个相当大的ASP .NET Web Forms应用程序上工作,该应用程序目前主要在美国使用.我们正在将其推广到世界其他地区,这当然意味着我们正在努力本地化应用程序的所有领域.一般来说,我们的方法是在每个请求开始时设置当前线程的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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以像这样调用此方法:
var customerCulture = new CultureInfo(currentCustomer.Locale);
CultureRunner.RunWithCulture(customerCulture, () => invoiceService.CreateInvoice(currentCustomer.CustomerId));
Run Code Online (Sandbox Code Playgroud)
我还考虑创建一个实现IDisposable的类,它负责在它的ctor中设置线程文化,然后在Dispose方法中返回原始文化,所以你可以像这样调用它:
var customerCulture = new CultureInfo(currentCustomer.Locale);
using(new CultureRunner(currentCustomer.Locale))
{
invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
Run Code Online (Sandbox Code Playgroud)
我错了吗?哪个,如果这些方法中的任何一个更可取?
Jor*_*dão 16
我喜欢这种using方法.我还创建了一个扩展方法来使事情更好地阅读:
var customerCulture = new CultureInfo(currentCustomer.Locale);
using (customerCulture.AsCurrent()) {
invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
Run Code Online (Sandbox Code Playgroud)
像这样的东西:
public static class CultureInfoExtensions {
public static IDisposable AsCurrent(this CultureInfo culture) {
return new CultureRunner(culture);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果始终是您的客户对象设置文化,另一种扩展方法将进一步提升抽象:
public class CultureRunner : IDisposable
{
readonly CultureInfo originalCulture;
readonly CultureInfo originalUICulture;
public CultureRunner(CultureInfo culture)
{
if (culture == null)
throw new ArgumentNullException(nameof(culture));
originalCulture = Thread.CurrentThread.CurrentCulture;
originalUICulture = Thread.CurrentThread.CurrentUICulture;
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
public void Dispose()
{
Thread.CurrentThread.CurrentCulture = originalCulture;
Thread.CurrentThread.CurrentUICulture = originalUICulture;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4239 次 |
| 最近记录: |