ASP.NET MVC Многоязычный сайт не работает должным образом - PullRequest
0 голосов
/ 27 августа 2018

Я работаю над сайтом, который должен быть на английском и испанском языках. Я использовал файлы resx и адаптирую настройку культуры на основе языковых настроек браузера, как показано в коде ниже (это на global.asax.cs):

        protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        string culture = "en-US";
        if (Request.UserLanguages != null)
        {
            culture = Request.UserLanguages[0];
        }
        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
    }

Это работает! Тем не менее, пользователь также должен иметь возможность изменить язык. Для этого я создал CultureController, как показано в приведенном ниже коде, который используется сайтом по ссылке:

    public class CultureController : Controller
{
    public ActionResult SetLanguage(string name)
    {
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

        System.Web.HttpContext.Current.Session["culture"] = name;

        return RedirectToAction("Index", "Home");
    }

}

И у меня есть следующие ссылки на моем сайте:

        <li><a href="@Url.Action("SetLanguage", "Culture", new { @name = "es-ES" })">Español</a></li>
        <li><a href="@Url.Action("SetLanguage", "Culture", new { @name = "en-US" })">English</a></li>

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

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Кажется, у вас нет маршрута для локализации. Сначала вам нужно определить маршруты, как показано ниже.

 routes.MapRoute(
           name: "LocalizedDefault",
           url: "{lang}/{controller}/{action}",
           defaults: new { controller = "Home", action = "Index"},
           constraints: new {lang="es-ES|fr-FR|en-US"}
       );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}",
            defaults: new { controller = "Home", action = "Index", lang = en-US }
        );

После установки языка тем вы должны направить его с помощью lang, как показано ниже.

filterContext.HttpContext.Response.RedirectToRoute("LocalizedDefault", 
            new { lang=culture,
                    controller = filterContext.RouteData.Values["controller"],
                    action = filterContext.RouteData.Values["action"]
            });
            return;

Для полной реализации взгляните на эту статью.

0 голосов
/ 27 августа 2018

Будет ли работать другой URL для языков?

Я сделал это у предыдущего работодателя, чтобы нам не приходилось менять язык браузера, чтобы тестировать разные языки, а также, если пользователь предпочитает один язык другому (ситуационно), но его браузер не ' настроены правильно, они имеют контроль.

Пример:

http://example.com/en/home против http://example.com/es/home

Мне удалось использовать перезапись URL-адреса для извлечения этого в параметр строки запроса (совершенно не требуется для MVC, поскольку вы можете использовать параметры маршрутизации)

Вы можете довольно легко добавить некоторый код для определения языка браузера и перенаправить пользователя на правильный URL-адрес, а также разрешить куки-файлу переопределять эти настройки.

Я знаю, что это совершенно другой ответ, чем вы искали, но его было очень просто протестировать ("/ en /" было взломом, который мы на самом деле не создавали сами; я только что сделал это работает так, что мы можем отлаживать страницы без необходимости переводить текст.)

Было довольно легко выкинуть 6 версий страницы в разные вкладки и убедиться, что все выглядит правильно. У нас был немецкий и китайский, и это хорошие тестовые языки: немецкие существительные получают long , и очень легко определить, пропустили ли вы перевод любых фраз с китайского.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...