ASP.NET MVC: 何时设置Thread.CurrentThread.CurrentUICulture?

28

我刚开始本地化一个ASP.NET MVC应用程序。大部分的字符串将在资源文件中定义,并通过Matt的本地化助手检索。其他字符串必须存储在数据库中。

我的问题: 我应该在请求管道中早期设置CurrentUICulture并在整个应用程序中使用它,还是每次需要时直接使用Request.UserLanguages[0]

现在我认为应该在Application_BeginRequest中设置CurrentUICulture。实现看起来会像这样:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var cultureName = HttpContext.Current.Request.UserLanguages[0];
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);
}

这是否是设置CurrentUICulture的最佳位置,而Request.UserLanguages[0]是否是获取该信息的最佳位置?


更新:

Ariel的帖子显示可以使用web.config在不编写代码的情况下定义此内容。

<system.web>
  <!--If enableClientBasedCulture is true, ASP.NET can set the UI culture and culture for a Web page automatically, based on the values that are sent by a browser.-->
  <globalization enableClientBasedCulture="true" culture="auto:en-US" uiCulture="auto:en"/>
2个回答

13

这个方法在最近版本的ASP.NET MVC中引入了AsyncController后是否仍然有效?因为从技术上讲,它们可能不会在与Thread.CurrentThread相同的线程下运行。 - Pierre-Alain Vigeant
不是开箱即用的。请参见https://dev59.com/SWIj5IYBdhLWcg3wHh3_。 - Mathias F

6

Request.UserLanguages[0]只能作为用户希望查看的语言的提示。大多数用户不知道如何更改浏览器语言。

另一点:不要确定Request.UserLanguages[0]是一个有效的语言。它甚至可能为空。(我不确定机器人有什么)

通常在页面上会有一个语言选择器。一旦用户在那里选择了一种语言,它就会被存储在cookie、session或url中。我喜欢使用url,因为我认为它看起来很漂亮。

如果用户在未设置语言的情况下查看您的页面,则应检查Request.UserLanguages[0]是否是您支持的语言,并设置Thread.CurrentThread.CurrentUICulture。

我使用一个过滤器来设置Thread.CurrentThread.CurrentUICulture。只要没有其他过滤器使用Thread.CurrentThread.CurrentUICulture,那就没问题了。否则,您需要为过滤器设置正确的执行顺序。

我还使用马特的助手,到目前为止它工作得非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接