多语言,使用服务器上的资源总是提供服务器语言

时间:2016-02-06 18:35:01

标签: c# asp.net-mvc multilingual resx

TL; TR:如果用户决定使用语言(url参数),则使用多语言资源,类库将继续使用服务器语言。

环境:ASP.NET 4.5.2,Visual Studio 2015 RC。

所以我使用Resources在多语言中设置了相当大的网站。我的解决方案中有一个单独的项目,只包含两种语言的.resx个文件。默认语言为荷兰语,其次为英语,因此资源文件的名称为:Resources.resxResources-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)。

希望任何人都有一些设置类库的经验,以便使用多语言(用于设置数据库属性)。我有共享主机,所以我无法控制服务器,但它必须是多语言,取决于用户的选择。谢谢!

0 个答案:

没有答案