TL; TR:如果用户决定使用语言(url参数),则使用多语言资源,类库将继续使用服务器语言。
环境:ASP.NET 4.5.2,Visual Studio 2015 RC。
所以我使用Resources在多语言中设置了相当大的网站。我的解决方案中有一个单独的项目,只包含两种语言的.resx
个文件。默认语言为荷兰语,其次为英语,因此资源文件的名称为:Resources.resx
和Resources-en.resx
。
我通过url确定语言,我有一个Localization属性,它被添加到FilterConfig
中并用于MVC路由。 (链接如下)
所以网站 example.com / 会给荷兰人, example.com/en 会给英文。
解决方案中还有两个项目。一个类库,一个MVC应用程序和前面提到的语言项目。
这一切都很好,我可以从我想要的每个点调用Resources.Resources.xx
。所有模型都在类库中,并且它们还具有多种语言DataAnnotations
,它们可以在两种语言中正常工作,我可以使用多语言错误消息抛出异常,该消息也使用正确的语言。
但我有一个问题(否则我不在这里,对吧?)。
在选择某些产品的基础上,购物车会增加额外费用。这些动态添加到购物车并保存在数据库中。这些额外费用的描述和标题也使用这些资源,但它们总是用英语(不是所选语言!)。这发生在类库中,并且根据服务器语言,它使用该资源语言。
同样适用于生成Invoices,它也使用Resources项目,它总是使用服务器语言来确定要获取的文本。当我在本地测试时(在设置为荷兰语的计算机语言上),它在荷兰语和荷兰语的发票描述中给出了额外的费用描述,但是当选择英语时,它仍然提供荷兰语中的所有内容,因此它保留了服务器语言。
所以你想要一些代码?
使用this blog post获取本地化设置(不在此广告,而不是我的广告)
因此,在每个请求中,都执行此代码:
CultureInfo info = new CultureInfo(lang);//nl-NL or en-EN
info.NumberFormat = numberInfo;
info.DateTimeFormat.DateSeparator = "/";
info.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
Thread.CurrentThread.CurrentUICulture = info;
Thread.CurrentThread.CurrentCulture = info;
一点点代码:
AdditionalCost adcost = new AdditionalCost()
{
//unrelated stuff here
title = Resources.Resources.additionalCostsDepositTitle,
description = Resources.Resources.additionalCostsDepositDescription,
//unrelated stuff here
};
当我得到CultureInfo.CurrentCulture
它是nl-NL
时,即使整个网站都是英文(因为当前的网址是example.com/en)。
希望任何人都有一些设置类库的经验,以便使用多语言(用于设置数据库属性)。我有共享主机,所以我无法控制服务器,但它必须是多语言,取决于用户的选择。谢谢!