asp.net mvc多语言网址/路由
这是一个关于asp.net mvc多语言网址/路由和SEO最佳实践/好处的两个部分问题...
问题第1部分)
我被要求创建一个新的ASP.NET MVC网站,这个网站可能支持至少两种语言(英语和法语),至少支持3种语言......
就本地化应用程序(标签,jQuery错误等)而言,使用资源文件应该没问题,并且我已经找到了很多这方面的例子......但是我的关注/问题更多地是关于URL。
在SEO方面,这两种时尚之间推荐的方法是什么?
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部分)
为了实现Fashion 2,我已经在这里找到了一篇文章:ASP.NET MVC - 本地化路线
但我会很好奇如何去实现时尚1。
有没有人有任何链接?
此外,据我所知,URL重写不是我所期待的,因为我不想“重定向”用户......我只是希望URL以合适的语言显示,而不必在网址
预先感谢您的帮助!
您可以创建具有本地化逻辑的基本控制器,如下所示:
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中分配lang。 为了实现时尚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})?"}
);
为了实现你想要的东西,你基本上需要实现三件事情:
一种处理传入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 Views中执行此操作,则可以做的最好的事情是编写几个扩展方法,以使您的Html.ActionLink
和Url.Action
接受CultureInfo
对象作为参数(和/或使用CultureInfo.CurrentCulture
作为默认值),如下所示:
(都是用C#编写的)
您也可以避免使用扩展方法模式,并将它们写成MultiLanguageActionLink
/ MultiLanguageAction
。
有关此主题的更多信息和更多示例,您还可以阅读本文。
AttributeRouting可以解决时尚1:
AttributeRouting - 本地化
链接地址: http://www.djcxy.com/p/46533.html