asp.net многоязычные ссылки / маршрутизация mvc - PullRequest
19 голосов
/ 19 июля 2011

Это вопрос из двух частей, касающийся многоязычных URL-адресов / маршрутизации 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)

Чтобы достичь Моды 2, я уженашел статью здесь: ASP.NET MVC - Маршрут локализации

Но мне было бы любопытно узнать, как добиться моды 1.

У кого-нибудь есть ссылки?

Кроме того, насколько я знаю, перезапись URL-адресов не , что я ищу, так как я не хочу «перенаправлять» пользователей… Я просто хочу, чтобы URL отображалисьна соответствующем языке без необходимости указывать культуру в URL

Заранее благодарен за любую помощь по этому вопросу!

Ответы [ 3 ]

18 голосов
/ 21 июля 2011

вы можете создать базовый контроллер с логикой локализации, как показано ниже:

 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})?"}
            );
1 голос
/ 15 сентября 2016

Чтобы достичь желаемого, вам в основном необходимо реализовать три вещи:

Многоязычный маршрут для обработки входящих 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 вместо.

Для получения дополнительной информации и дополнительных примеров по этой теме вы также можете прочитать этот пост в моем блоге.

0 голосов
/ 03 августа 2012

AttributeRouting может решить Мода 1:

AttributeRouting - Локализация

...