【问题标题】:ASP.NET MVC Mulitlingual site not working properlyASP.NET MVC 多语言站点无法正常工作
【发布时间】:2018-08-27 15:12:29
【问题描述】:

我正在开发一个必须同时使用英语和西班牙语的网站。我使用了 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>

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

【问题讨论】:

  • 你设置了Session["culture"]。然后我希望还有代码可以读取它,请edit 显示您(尝试)在何处以及如何应用存储值的问题。

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


【解决方案1】:

对这些语言使用不同的 URL 会起作用吗?

我在以前的雇主那里做过,这样我们就不必更改浏览器语言来测试不同的语言,而且如果用户更喜欢一种语言而不是另一种语言(根据情况),但他们的浏览器不是' t 配置正确,他们有控制权。

例子:

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

我能够使用 URL 重写将其提取到查询字符串参数中(在 MVC 中完全不需要,因为您可以使用路由参数)

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

我知道这与您正在寻找的答案大不相同,但它让测试变得轻而易举(“/en/”是我们实际上并没有设置的 hack;我只是做了这样我们就可以调试页面而无需翻译文本。)

将页面的 6 个版本放在不同的选项卡中并检查一切看起来是否正确非常容易。我们有德语和中文,这些都是很好的测试语言:德语名词会long,很容易确定你是否错过了用中文翻译任何短语。

【讨论】:

  • 像魅力一样工作!谢谢!虽然这确实是一个与我所寻找的完全不同的答案,但它是一个很好的解决方案。
【解决方案2】:

您似乎没有本地化路线。首先您必须定义如下路线。

 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 文章。

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多