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

Vli*_*nce 19 asp.net-mvc asp.net-mvc-routing

这是关于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 
Run Code Online (Sandbox Code Playgroud)

使用一个而不是另一个已知的问题/惩罚?

或者它是如此之小,以至于变得无关紧要!


问题第2部分)

为了实现Fashion 2,我已经在这里找到了一篇文章: ASP.NET MVC - 本地化路线

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

有没有人有任何链接?

另外,据我所知,URL重写不是我想要的,因为我不想"重定向"用户...我只是希望用适当的语言显示网址,而不必在网址

在此先感谢您的帮助!

小智 19

您可以创建具有如下本地化逻辑的基本控制器:

 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;

     }

 }
Run Code Online (Sandbox Code Playgroud)

如果你想忽略文化文件夹只是不在RouteDate中分配lang,上面的控制器满足你问题的方式2.当然要实现时尚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})?"}
            );
Run Code Online (Sandbox Code Playgroud)

  • @FerasKayyali Hi Feras,感谢分享信息.我正在使用您的代码,但发现VS 2012无法识别本地化.它的命名空间和DLL是什么?谢谢 (5认同)