在MVC 4中获取当前区域设置或浏览器语言环境

3

如何在MVC 4中获取当前区域性或浏览器语言。

我找到了一些从HttpContext和HttpRequest获取的示例,但这在MVC 4上不起作用。

在MVC 4上要如何实现呢?

2个回答

13
我发现一些样例是从HttpContext和HttpRequest中获取数据的,但这在MVC 4上不起作用。
我真的很喜欢“它不起作用”的问题描述!!!就像对一个你不想付工资的机械师说:“我的车坏了,告诉我问题出在哪里,这样我就可以自己修理”,当然不给他看你的车。
无论如何,在您的控制器操作中仍然有HttpRequest。看看UserLanguages属性:
public ActionResult SomeAction()
{
    string[] userLanguages = Request.UserLanguages;
    ...
}

注意:如果用户代理没有发送 Accept-Languages 请求头,则此属性的值将为 null。因此,在访问其值之前,请确保检查它不为 null,以避免出现 NREs。

数组是因为浏览器可以发送多个项目,特别是当用户配置了回退语言时,如此处所述:https://dev59.com/HGoy5IYBdhLWcg3wcNlO - Dominic Zukiewicz
是的,没错。这就是为什么UserLanguages属性返回一个字符串数组的原因。 - Darin Dimitrov
你真的可以省略那些歧视机械操作的言论,也许教他如何适当地提问会更好?建设性的反馈总是更好的选择。 - Mario Lopez

0
我们在 NuGetGallery 中使用以下代码。
 /// <summary>
/// Extensions on <see cref="HttpRequest"/> and <see cref="HttpRequestBase"/>
/// </summary>
public static class HttpRequestExtensions
{
    /// <summary>
    /// Retrieve culture of client. 
    /// </summary>
    /// <param name="request">Current request.</param>
    /// <returns><c>null</c> if not to be determined.</returns>
    public static CultureInfo DetermineClientCulture(this HttpRequest request)
    {
        return DetermineClientCulture(new HttpRequestWrapper(request));
    }

    /// <summary>
    /// Retrieve culture of client. 
    /// </summary>
    /// <param name="request">Current request.</param>
    /// <returns><c>null</c> if not to be determined.</returns>
    public static CultureInfo DetermineClientCulture(this HttpRequestBase request)
    {
        if (request == null)
        {
            return null;
        }

        string[] languages = request.UserLanguages;
        if (languages == null)
        {
            return null;
        }

        //first try parse of full langcodes. Stop with first success.
        foreach (string language in languages)
        {
            string lang = language.ToLowerInvariant().Trim();
            try
            {
                return CultureInfo.GetCultureInfo(lang);
            }
            catch (CultureNotFoundException)
            {
            }
        }

        //try parse again with first 2 chars.  Stop with first success.
        foreach (string language in languages)
        {
            string lang = language.ToLowerInvariant().Trim();
            if (lang.Length > 2)
            {
                string lang2 = lang.Substring(0, 2);
                try
                {
                    return CultureInfo.GetCultureInfo(lang2);
                }
                catch (CultureNotFoundException)
                {
                }
            }
        }

        return null;
    }
}

用法:

    /// <summary>
    /// Called before the action method is invoked.
    /// </summary>
    /// <param name="filterContext">Information about the current request and action.</param>
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.IsChildAction)
        {
            //no need to do the hassle for a child action
            //set the culture from the request headers
            var clientCulture = Request.DetermineClientCulture();
            if (clientCulture != null)
            {
                //and/or CurrentUICulture 
                Thread.CurrentThread.CurrentCulture = clientCulture;
            }
        }

        base.OnActionExecuting(filterContext);
    }

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