【问题标题】:Get selected (active) language on browser在浏览器上获取选定(活动)语言
【发布时间】:2017-02-09 08:57:24
【问题描述】:

这里有一个很好的线程: Get CultureInfo from current visitor

说明我们可以使用以下方法轻松获取浏览器语言:

var userLanguages = Request.UserLanguages;

这里的问题是这只会给我浏览器中配置的语言,而不是选择的语言。同时,数组中的第一种语言 ([0]) 可能不是活动语言。

有没有办法在服务器端找到活动的?我知道我可以使用 javascript 在客户端执行此操作,但我想避免双重调用。

【问题讨论】:

  • 究竟什么是“被选中的”?在您网站的某处有一个标志图标不会更改浏览器的 Accept-Language 请求标头。
  • 请记住,UserLanguages 来自标头。标头可以被防火墙更改。因此,在查看此标头时,您不一定会获得 用户的 文化。像this answer 一样,将文化作为 URL 的一部分是一种更好的用户体验。它还具有确保每种文化都被搜索引擎索引的优势,而不仅仅是默认语言。

标签: asp.net asp.net-mvc globalization cultureinfo culture


【解决方案1】:

您需要通过 cookie 设置此信息(可以通过页面上的设置进行切换)。

public ActionResult SetCulture(string culture) //culture is something like en-US, you can validate it ahead of time.
{
    HttpCookie cookie = Request.Cookies["currentCulture"];
    if (cookie != null)
        cookie.Value = culture;   // update cookie value
    else //create the cookie here
    {
        cookie = new HttpCookie("currentCulture");
        cookie.Value = culture;
        cookie.Expires = DateTime.Now.AddYears(1);
    }
    Response.Cookies.Add(cookie);
    return Redirect(Request.UrlReferrer.ToString()); //send them back to the site they were at (in a translated form).
}

要确定服务器端的文化,只需在执行操作时读取 cookie。

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{

    HttpCookie cultureCookie = Request.Cookies["currentCulture"];
    string cultureName = cultureCookie== null ? "en-US" : cultureCookie.Value;        
    if (cultureCookie != null)
        cultureName = cultureCookie.Value;

    // Modify current thread's cultures            
    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

    return base.BeginExecuteCore(callback, state);
}

【讨论】:

  • 这只是解决整个问题的一小部分。是的,您可以在 cookie 中保存语言首选项,但仅此一项除了为每个请求添加一个 cookie 外什么也没做。此外,您不能信任推荐人 - 如果您甚至有一个(HTTPS 没有,并且某些隐私插件会清除它)。
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 2018-08-29
  • 2013-07-13
  • 2023-03-08
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多