asp.net mvc多语言网址/路由

时间:2011-07-19 15:29:39

标签: asp.net-mvc asp.net-mvc-routing

这是关于asp.net mvc多语言网址/路由和SEO最佳实践/好处的两部分问题......

问题第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部分)

为了实现Fashion 2,我在这里找到了一篇文章: ASP.NET MVC - Localization route

但我很想知道如何实现时装1.

有没有人有任何链接?

另外据我所知,URL重写我正在寻找什么,因为我不想“重定向”用户......我只是希望网址显示在适当的语言,而无需在网址中显示文化

提前感谢您提供任何帮助!

3 个答案:

答案 0 :(得分:18)

答案 1 :(得分:1)

要实现您的目标,您基本上需要实现三件事:

用于处理传入网址的多语言感知路径

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.ActionLinkUrl.Action接受CultureInfo对象为参数(和/或使用CultureInfo.CurrentCulture作为默认参数),例如:

(两者都是用C#编写的)

您也可以避免使用扩展方法模式,并将其写为MultiLanguageActionLink / MultiLanguageAction

有关此主题的其他信息和更多示例,您还可以在我的博客上阅读this post

答案 2 :(得分:0)

AttributeRouting可以解决时尚1:

AttributeRouting - Localization