LifeAct
@LifeAct
Создаем и раскручиваем, не ставим на конвейер

Как правильно организовать два языка на сайте asp mvc?

Всем привет!
Задача такая: организовать два языка, причем чтобы определялся автоматический язык пользователя и выдавалась нужная версия, причем в 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 как для англ так и для рус версии. Все отлично работает, за исключением того, что когда добавляют сайт или любую страницу в гугл - он ругается, ошибка на сайте. Я так понимаю, что бот гугла как и другой не содержит переменную языка.... как это можно пофиксить? как то определять бота и отдавать ему всегда ру представления?
  • Вопрос задан
  • 224 просмотра
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
Немножко выхвачу из контекста
if (cultureName == "en") { cultureName = "en-US"; }
            if (cultureName == "ru") { cultureName = "ru-RU"; }

1) Тут else не помешает.
2) Вы говорите что у вас 2 языка. Что будет если cultureName = 'de'? Может все-таки сделать значение по умолчанию?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы