MVC5如何基于顶级域设置语言

时间:2014-07-15 21:50:55

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

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

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

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

如何在MVC5中实现这一目标?到目前为止,我所使用的最好的方法是使用JavaScript检查网址,设置cookie并刷新页面,但我知道这很糟糕,必须有更好的方法。

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

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

2 个答案:

答案 0 :(得分:2)

我想出了如何做到这一点。将其添加到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;
}

答案 1 :(得分:0)

在我的情况下,我在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;


    }