我有一个MVC5站点,可以通过几个不同的区域URL访问。在我的情况下.co.uk(英国),。de(德国)和.fr(法国)。
网站内容使用RESX文件进行本地化,用户可以通过cookie切换语言以实现持久性,并使用HttpModule根据cookie设置asp.net线程区域设置(我使用this approach)。
我希望默认语言与用户访问网站的顶级域相关。例如,如果用户在.de上,则默认语言应为de-DE。用户可以选择更改语言,在这种情况下会覆盖默认语言,但默认语言适合顶级域(对于用户和搜索引擎)非常重要。
如何在MVC5中实现这一目标?到目前为止,我所使用的最好的方法是使用JavaScript检查网址,设置cookie并刷新页面,但我知道这很糟糕,必须有更好的方法。
PS:请注意,这是我想要推动的顶级域名。我没有使用区域路由,例如http://whatever.com/DE或http://whatever.com/EN
PPS:我不想使用浏览器语言检测功能,因为这会导致搜索引擎出现问题。即它可能导致.de站点以en-GB显示,因为这是搜索引擎使用的(或搜索引擎没有语言,因此这是默认值)。如果发生这种情况,.de网站将被视为.co.uk网站的副本,这对SEO来说永远不会有好处
答案 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;
}