基于mvc中的查询字符串变量切换语言资源文件的最佳方法是什么?

时间:2013-07-17 22:48:51

标签: asp.net-mvc asp.net-mvc-4 culture razor-2 resource-files

我正在使用MVC 4和razor视图。我们有一个从资源文件中提取的应用程序。目前只有一组资源文件,但我们要求在网站的某些部分进行一些翻译,这些翻译会看到外语的一些额外资源文件。

部分应用程序向用户发送引荐,并且在该引用中,可以选择设置要显示的语言(无论用户客户端的设置如何)。这将在查询字符串上设置为lang=ES。我们在视图中引用资源变量,如@Resources.Templates.ReferralAcceptance.DefaultAcceptanceMessage。如果查询字符串中没有可用的lang值,我需要默认使用从客户端发送的cultureCode,如果不可用,将返回到我们的标准英语版本。

我是资源文件的新手,尤其是MVC。我解决这个问题的最佳方式是什么?

2 个答案:

答案 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部分中,您需要做的是一个很好的解释:

Creating a bilingual asp.net MVC application - Part 1

Creating a bilingual asp.net MVC application - Part 2