2017-02-09 34 views
1

Существует хорошая нить здесь: Get CultureInfo from current visitorПолучить выбранный (активный) язык в браузере

Объяснив, что мы можем легко получить броузер с помощью:

var userLanguages = Request.UserLanguages; 

Проблема здесь состоит в том, что это только дает мне настроены языки в браузере, но не выбранные. В то же время первый язык в массиве ([0]) может быть неактивным.

Есть ли способ найти активный сервер на стороне сервера? Я знаю, что могу сделать это на стороне клиента, используя javascript, но я хочу избежать двойных звонков.

+1

Что такое «выбранный», точно? Значок флага где-то на вашем сайте не изменяет заголовок запроса Accept-Language браузера. – CodeCaster

+0

Имейте в виду, что 'UserLanguages' происходит от заголовка. Заголовки могут быть изменены брандмауэрами. Таким образом, вы не обязательно получаете * * пользовательскую культуру при просмотре этого заголовка. Это гораздо лучший пользовательский интерфейс, который вы делаете частью культуры в URL-адресе, как в [этом ответе] (http://stackoverflow.com/a/32839796/181087). Это также имеет преимущество, гарантируя, что каждая культура индексируется поисковыми системами, а не только языком по умолчанию. – NightOwl888

ответ

2

Вам необходимо установить эту информацию с помощью файла 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); 
} 
+1

Это лишь небольшая часть решения всей проблемы. Да, вы можете _save_ языковые настройки в cookie, но это само по себе ничего не делает, кроме добавления cookie к каждому запросу. Кроме того, вы не можете доверять рефереру - если у вас его есть (HTTPS нет, а некоторые плагины конфиденциальности очищают его). – CodeCaster