这是一个关于SEO多语言urls/路由和asp.net最佳实践/优势…的两部分问题
问题第1部分)
我被要求创建一个新的ASP.NET MVC网站,将支持至少(在第一)两种语言(英语和法语),也许在未来,3种语言的…
至于本地化应用程序(标签、jQuery错误等),使用资源文件应该没问题,我在这个…上找到了很多示例但我的问题更多的是关于URL。
在搜索引擎优化方面,这两种方式之间的推荐方法是什么?
Fashion 1 (no culture folder)
www.mydomain.com/create-account
www.mydomain.com/creer-un-compte
Fashion 2 (with built in culture folder)
www.mydomain.com/create-account
www.mydomain.com/fr/creer-un-compte <--notice the “fr” folder
在使用一个而不是另一个时,是否存在已知的问题/惩罚?
或者它是如此之小以至于变得无关紧要!
问题第2部分)
为了实现时尚2,我已经在这里找到了一篇文章:ASP.NET MVC - Localization route
但我很好奇如何实现时尚1。
有没有人有链接?
此外,据我所知,网址重写是而不是我正在寻找的,因为我不希望“重定向”用户…我只想让url以适当的语言显示,而不必在url中显示文化。
提前感谢你在这方面的帮助!
发布于 2011-07-21 19:49:50
您可以创建具有如下本地化逻辑的基本控制器:
public abstract class LocalizedController : Controller
{
protected override void ExecuteCore()
{
HttpCookie cookie;
string lang = GetCurrentCulture();
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang, false);
// set the lang value into route data
RouteData.Values["lang"] = lang;
// save the location into cookie
cookie = new HttpCookie("DPClick.CurrentUICulture",
Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName)
{
Expires = DateTime.Now.AddYears(1)
};
HttpContext.Response.SetCookie(cookie);
base.ExecuteCore();
}
private string GetCurrentCulture()
{
string lang;
// set the culture from the route data (url)
if (RouteData.Values["lang"] != null &&
!string.IsNullOrWhiteSpace(RouteData.Values["lang"].ToString()))
{
lang = RouteData.Values["lang"].ToString();
if (Localization.Locales.TryGetValue(lang, out lang))
{
return lang;
}
}
// load the culture info from the cookie
HttpCookie cookie = HttpContext.Request.Cookies["DPClick.CurrentUICulture"];
if (cookie != null)
{
// set the culture by the cookie content
lang = cookie.Value;
if (Localization.Locales.TryGetValue(lang, out lang))
{
return lang;
}
}
// set the culture by the location if not speicified
lang = HttpContext.Request.UserLanguages[0];
if (Localization.Locales.TryGetValue(lang, out lang))
{
return lang;
}
//English is default
return Localization.Locales.FirstOrDefault().Value;
}
}
上面的控制器满足你问题的方式2,如果你想忽略区域性文件夹,只要不在RouteDate中赋值语言即可。当然,为了实现时尚2,你必须为文化添加路由,如下所示:
routes.MapRoute(
"Localization", // Route name
"{lang}/{controller}/{action}/{id}", // URL with parameters
new {controller = "Default", action = "Index", id = UrlParameter.Optional}, // Parameter defaults
new {lang = @"\w{2,3}(-\w{4})?(-\w{2,3})?"}
);
发布于 2016-09-15 06:22:18
为了实现你想要的东西,你基本上需要实现三件事:
处理传入URL的多语言感知路由:
routes.MapRoute(
name: "DefaultLocalized",
url: "{lang}/{controller}/{action}/{id}",
constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})" }, // en or en-US
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
处理这些类型的多语言请求的LocalizationAttribute:
public class LocalizationAttribute : ActionFilterAttribute
{
private string _DefaultLanguage = "en";
public LocalizationAttribute(string defaultLanguage)
{
_DefaultLanguage = defaultLanguage;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string lang = (string)filterContext.RouteData.Values["lang"] ?? _DefaultLanguage;
if (lang != _DefaultLanguage)
{
try
{
Thread.CurrentThread.CurrentCulture =
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
catch (Exception e)
{
throw new NotSupportedException(String.Format("ERROR: Invalid language code '{0}'.", lang));
}
}
}
}
在您的应用程序中一个帮助方法来生成这些URL:这可以通过多种方式完成,具体取决于您的应用程序逻辑。例如,如果您需要在Razor视图中执行此操作,最好的做法是编写几个扩展方法,使Html.ActionLink
和Url.Action
接受CultureInfo
对象作为参数(和/或使用CultureInfo.CurrentCulture
作为默认参数),如下所示:
(两者都是用C#编写的)
您还可以避免使用扩展方法模式,而将它们编写为MultiLanguageActionLink
/ MultiLanguageAction
。
有关这个主题的更多信息和更多示例,您也可以阅读我的博客上的this post。
发布于 2012-08-04 03:44:01
AttributeRouting可以解决时尚1:
https://stackoverflow.com/questions/6749803
复制相似问题