【问题标题】:MVC5 How to set language based on top level domainMVC5 如何根据顶级域设置语言
【发布时间】:2014-07-15 21:50:54
【问题描述】:

我有一个 MVC5 站点,可通过几个不同的区域 URL 访问。在我的例子中,.co.uk(英国)、.de(德国)和 .fr(法国)。

网站内容使用 RESX 文件进行本地化,用户可以通过 cookie 切换语言以实现持久性和 HttpModule,后者根据 cookie 设置 asp.net 线程区域设置(我使用了this approach)。

我希望默认语言与用户访问网站的顶级域相关。例如,如果用户使用 .de,则默认语言应为 de-DE。用户可以选择更改语言,在这种情况下会覆盖默认语言,但默认语言适合顶级域(对于用户和搜索引擎)非常重要。

如何在 MVC5 中实现这一点?到目前为止我最好的方法是使用 JavaScript 检查 url、设置 cookie 和刷新页面,但我知道这很讨厌,必须有更好的方法。

PS:请注意这是我想要驱动的顶级域。我没有使用区域路由,例如http://whatever.com/DEhttp://whatever.com/EN

PPS:我也不想使用浏览器语言检测功能,因为这会给搜索引擎带来问题。即它可能会导致 .de 网站以 en-GB 显示,因为这是搜索引擎使用的(或者搜索引擎没有语言,因此这是默认设置)。如果发生这种情况,.de 网站将被视为 .co.uk 网站的副本,这对 SEO 永远不利

【问题讨论】:

  • 您应该将解决方案添加为其他用户/未来参考的答案(对您自己的问题)。然后您可以接受自己的答案。

标签: asp.net-mvc-4 multilingual resx


【解决方案1】:

我想出了如何做到这一点。将此添加到 global.asax

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
    if (Request.Cookies[Constants.LanguageCookieName] == null)
    {
        var culture = GetCultureFromHost();
        Thread.CurrentThread.CurrentUICulture = culture;
        Thread.CurrentThread.CurrentCulture = culture;
    }
}

private CultureInfo GetCultureFromHost()
{
    //set default culture of en-GB
    CultureInfo ci = new CultureInfo("en-GB");

    //get top level domain
    string host = Request.Url.Host.ToLower();

    //check for other known domains and set culture accordingly
    if (host.Contains("whatever.de"))
    {
        ci = new CultureInfo("de-DE");
    }

    return ci;
}

【讨论】:

    【解决方案2】:

    在我的例子中,我在 global.asax 中设置了波斯文化并且效果很好

            protected void Application_BeginRequest(object sender, EventArgs e)
        {
            var persianCulture = new PersianCulture();
            persianCulture.DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
            persianCulture.DateTimeFormat.LongDatePattern = "dddd d MMMM yyyy";
            persianCulture.DateTimeFormat.AMDesignator = "صبح";
            persianCulture.DateTimeFormat.PMDesignator = "عصر";
            Thread.CurrentThread.CurrentCulture = persianCulture;
            Thread.CurrentThread.CurrentUICulture = persianCulture;
    
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多