Asp.net mvc 4 MVC5如何基于顶级域设置语言

Asp.net mvc 4 MVC5如何基于顶级域设置语言,asp.net-mvc-4,multilingual,resx,Asp.net Mvc 4,Multilingual,Resx,我有一个单一的MVC5网站,可以通过几个不同的区域URL访问。在我的例子中.co.uk(代表英国),.de(代表德国)和.fr(代表法国) 站点内容使用RESX文件进行本地化,用户可以通过cookie进行持久化和HttpModule切换语言,HttpModule根据cookie(我使用的)设置asp.net线程区域设置 我希望默认语言与用户访问站点的顶级域相关。例如,如果用户在.de上,则默认语言应为de-de。用户可以选择更改语言,在这种情况下,默认语言将被覆盖,但默认语言适用于顶级域(对于用

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

站点内容使用RESX文件进行本地化,用户可以通过cookie进行持久化和HttpModule切换语言,HttpModule根据cookie(我使用的)设置asp.net线程区域设置

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

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

PS:请注意,这是顶级域名,我想推动这一点。例如,我没有使用区域路由,或者


PPS:我也不想使用浏览器语言检测功能,因为这会给搜索引擎带来问题。i、 e.它可能导致.de站点以en GB显示,因为这是搜索引擎使用的语言(或者搜索引擎没有语言,因此这是默认语言)。如果发生这种情况,.de网站将被视为.co.uk网站的复制品,这对SEO从来都不好

我知道怎么做了。将此添加到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;
}

在我的例子中,我在global.asax中设置了波斯语cluture,效果很好

        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;


    }

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