我正在使用MVC 4和razor视图。我们有一个从资源文件中提取的应用程序。目前只有一组资源文件,但我们要求在网站的某些部分进行一些翻译,这些翻译会看到外语的一些额外资源文件。
部分应用程序向用户发送引荐,并且在该引用中,可以选择设置要显示的语言(无论用户客户端的设置如何)。这将在查询字符串上设置为lang=ES
。我们在视图中引用资源变量,如@Resources.Templates.ReferralAcceptance.DefaultAcceptanceMessage
。如果查询字符串中没有可用的lang值,我需要默认使用从客户端发送的cultureCode,如果不可用,将返回到我们的标准英语版本。
我是资源文件的新手,尤其是MVC。我解决这个问题的最佳方式是什么?
答案 0 :(得分:2)
以下是我过去所做的事情:
在web.config
文件中,添加以下设置:
<system.web>
<globalization enableClientBasedCulture="true" />
</system.web>
这将处理后备实例,其中查询字符串中没有设置语言。
现在控制器使用查询字符串“lang”参数:
(我通常会在“BaseController”中使用以下代码并让我的控制器从此继承。)
将以下覆盖方法添加到控制器:
protected override IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state)
{
var culture = requestContext.HttpContext.Request.QueryString["lang"];
//!!Check to see if culture exists and is valid before setting the thread culture
var cultureInfo = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
return base.BeginExecute(requestContext, callback, state);
}
这使您可以读取查询字符串中的“lang”值,然后使用它来设置线程的文化。这应该覆盖enableClientBasedCulture
设置设置的任何文化。
答案 1 :(得分:0)
您最好定义一条新路线,而不是使用查询字符串来指定语言,而不是http://MyHost/Culture/Controller/Action/Id
。
在本文的第2部分中,您需要做的是一个很好的解释: