首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >asp.net mvc多语言urls/路由

asp.net mvc多语言urls/路由
EN

Stack Overflow用户
提问于 2011-07-19 23:29:39
回答 3查看 18.3K关注 0票数 21

这是一个关于SEO多语言urls/路由和asp.net最佳实践/优势…的两部分问题

问题第1部分)

我被要求创建一个新的ASP.NET MVC网站,将支持至少(在第一)两种语言(英语和法语),也许在未来,3种语言的…

至于本地化应用程序(标签、jQuery错误等),使用资源文件应该没问题,我在这个…上找到了很多示例但我的问题更多的是关于URL。

在搜索引擎优化方面,这两种方式之间的推荐方法是什么?

代码语言:javascript
复制
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中显示文化。

提前感谢你在这方面的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-21 19:49:50

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

代码语言:javascript
复制
 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,你必须为文化添加路由,如下所示:

代码语言:javascript
复制
            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})?"}
            );
票数 19
EN

Stack Overflow用户

发布于 2016-09-15 06:22:18

为了实现你想要的东西,你基本上需要实现三件事:

处理传入URL的多语言感知路由

代码语言:javascript
复制
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

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2012-08-04 03:44:01

AttributeRouting可以解决时尚1:

AttributeRouting - Localization

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6749803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档