ASP.NET MVC多语言站点无法正常工作

时间:2018-08-27 15:12:29

标签: c# asp.net asp.net-mvc visual-studio

我正在一个必须同时使用英语和西班牙语的网站上工作。我已经使用过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>

这不起作用。这很奇怪,因为当我调试它时,实际上已使用该方法,并且数据流似乎正确,它获取了name参数并进行了设置,但是在重定向之后,语言没有改变,并且请求显示为失败。您有什么建议我在做什么错了吗?

2 个答案:

答案 0 :(得分:0)

语言使用的URL是否会不同?

我是在以前的雇主那里做的,所以我们不必为了测试不同的语言而更改浏览器的语言,并且如果该用户(在地理位置上)偏爱一种语言而不是另一种语言,但他们的浏览器是“如果配置正确,他们就可以控制。

示例:

http://example.com/en/homehttp://example.com/es/home

我能够使用URL重写将其提取到querystring参数中(对于MVC,这是不必要的,因为您可以使用路由参数)

您可以很容易地添加一些代码来检测浏览器语言,并将用户重定向到正确的URL,并允许Cookie覆盖这些首选项。

我知道这是与您所寻找的答案完全不同的答案,但这使测试变得轻而易举(“ / en /”是我们实际上并未真正设置的hack;我只是做了它可以正常工作,以便我们可以调试页面而不必翻译文本。)

很容易将页面的6个版本放在不同的选项卡中,并检查所有内容是否正确。我们有德语和中文,并且这些语言都是很好的测试语言:德语名词长 long ,很容易确定您是否错过了用汉语翻译任何短语的机会。

答案 1 :(得分:0)

似乎您没有用于本地化的路由。首先,您必须定义如下所示的路由。

 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;

有关完整实施的信息,请查看this文章。