Всем привет!
Задача такая: организовать два языка, причем чтобы определялся автоматический язык пользователя и выдавалась нужная версия, причем в URL никаких изменений, все одинаково.
Вот что сделал:
это базовый контроллер
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Is it View ?
ViewResultBase view = filterContext.Result as ViewResultBase;
if (view == null) // if not exit
return;
filterContext.HttpContext.Request.UserLanguages[0]; // needs validation return "en-us" as default
string cultureName = "";
// Attempt to read the culture cookie from Request
HttpCookie cultureCookie = Request.Cookies["_culture"];
if (cultureCookie != null)
cultureName = cultureCookie.Value;
else
cultureName = filterContext.HttpContext.Request.UserLanguages[0];
Request.UserLanguages.Length > 0 ? Request.UserLanguages[0] : null; // obtain it from HTTP header AcceptLanguages
if (cultureName == "en") { cultureName = "en-US"; }
if (cultureName == "ru") { cultureName = "ru-RU"; }
// Are views implemented separately for this culture? if not exit
bool viewImplemented = CultureHelper.IsViewSeparate(cultureName);
if (viewImplemented == false)
return;
string viewName = view.ViewName;
int i = 0;
if (string.IsNullOrEmpty(viewName))
viewName = filterContext.RouteData.Values["action"] + "." + cultureName; // Index.en-US
else if ((i = viewName.IndexOf('.')) > 0)
{
// contains . like "Index.cshtml"
viewName = viewName.Substring(0, i + 1) + cultureName + viewName.Substring(i);
}
else
viewName += "." + cultureName; // e.g. "Index" ==> "Index.en-Us"
view.ViewName = viewName;
filterContext.Controller.ViewBag._culture = "." + cultureName;
base.OnActionExecuted(filterContext);
}
protected override void ExecuteCore()
{
string cultureName = null;
// Attempt to read the culture cookie from Request
HttpCookie cultureCookie = Request.Cookies["_culture"];
if (cultureCookie != null)
cultureName = cultureCookie.Value;
else
cultureName = Request.UserLanguages[0]; // obtain it from HTTP header AcceptLanguages
// Validate culture name
cultureName = CultureHelper.GetValidCulture(cultureName); // This is safe
// Modify current thread's culture
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(cultureName);
Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(cultureName);
base.ExecuteCore();
}
как видно из кода, проверяется язык в браузере (также есть ли настройка в кукисах), и под соответствующий язык формируется представление (Index.ru-ru.cshtml или Index.en-us.cshtml)
Причем в HomeController все как обычно
public ActionResult Index()
{
ViewBag.ClassMain = "active";
return View();
}
УРЛ всегда - Index как для англ так и для рус версии. Все отлично работает,
за исключением того, что когда добавляют сайт или любую страницу в гугл - он ругается, ошибка на сайте. Я так понимаю, что бот гугла как и другой не содержит переменную языка.... как это можно пофиксить? как то определять бота и отдавать ему всегда ру представления?