Лучший способ обработки URL-адресов на многоязычном сайте в ASP.net


Мне нужно сделать многоязычный сайт, с URL-адресами, такими как

www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish

В прошлом я настраивал два виртуальных каталога в IIS, а затем обнаруживал URL-адрес в global.aspx и изменить язык в соответствии с URL

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim lang As String
    If HttpContext.Current.Request.Path.Contains("/en/") Then
        lang = "en"
    Else
        lang = "es"
    End If
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang)
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang)


End Sub

Решение больше похоже на взлом. Я подумываю об использовании маршрутизации для нового веб-сайта.

Знаете ли вы лучший или более элегантный способ сделать это?

Edit: речь идет об обработке URL, а не о ресурсах и т. д.

7 7

7 ответов:

Я решил пойти с новым ASP.net маршрутизация.
Почему не urlRewriting? Потому что я не хочу менять чистый URL, который дает вам маршрутизация.

Вот код:

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Code that runs on application startup
    RegisterRoutes(RouteTable.Routes)
End Sub


Public Sub RegisterRoutes(ByVal routes As RouteCollection)
    Dim reportRoute As Route
    Dim DefaultLang As String = "es"

    reportRoute = New Route("{lang}/{page}", New LangRouteHandler)
    '* if you want, you can contrain the values
    'reportRoute.Constraints = New RouteValueDictionary(New With {.lang = "[a-z]{2}"})
    reportRoute.Defaults = New RouteValueDictionary(New With {.lang = DefaultLang, .page = "home"})

    routes.Add(reportRoute)
End Sub

Затем LangRouteHandler.класс vb:

Public Class LangRouteHandler
     Implements IRouteHandler

  Public Function GetHttpHandler(ByVal requestContext As System.Web.Routing.RequestContext) As System.Web.IHttpHandler _
      Implements System.Web.Routing.IRouteHandler.GetHttpHandler

    'Fill the context with the route data, just in case some page needs it
    For Each value In requestContext.RouteData.Values
        HttpContext.Current.Items(value.Key) = value.Value
    Next

    Dim VirtualPath As String
    VirtualPath = "~/" + requestContext.RouteData.Values("page") + ".aspx"

    Dim redirectPage As IHttpHandler
    redirectPage = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, GetType(Page))
    Return redirectPage

  End Function
End Class

Наконец, я использую значение по умолчанию.aspx в корне для перенаправления на язык по умолчанию, используемый в списке браузера.
Может быть, это можно сделать с маршрутом.По умолчанию, но не работают внутри Visual Studio (возможно, это работает на сервере)

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim DefaultLang As String = "es"
    Dim SupportedLangs As String() = {"en", "es"}
    Dim BrowserLang As String = Mid(Request.UserLanguages(0).ToString(), 1, 2).ToLower
    If SupportedLangs.Contains(BrowserLang) Then DefaultLang = BrowserLang

    Response.Redirect(DefaultLang + "/")
End Sub

Некоторые источники:
* блог Майка Ормонда
* блог Криса Кавано
* MSDN

  1. Использование urlrewriteing.net ибо asp.net webforms, или маршрутизация с помощью mvc. Переписать www.site.com/en/something.aspx к url: страница.аспн?lang=en.
    UrlRewriteing.net может быть легко настроен с помощью регулярных выражений в интернете.конфиг. Вы также можете использовать маршрутизацию с веб-формами сейчас, это, вероятно, похоже...
  2. с webforms, пусть каждая страница aspx наследует от класса BasePage, который затем наследует от класса Page.
    В классе BasePage переопределите "InitializeCulture ()" и установите информацию о культуре в поток, как вы описано в вопросе.
    Это хорошо делать в следующем порядке: 1. проверьте url для Lang param, 2. проверьте печенье, 3. установить по умолчанию lang
  3. для статического контента (текст, url-адрес pics) на страницах используйте LocalResources или Global, если контент повторяется по всему сайту. Вы можете смотреть видео-трансляцию с помощью global / local res. on www.asp.net
  4. Подготовка БД для нескольких языков. Но это уже другая история.

Я лично использую файлы ресурсов.

Очень эффективно, очень просто.

UrlRewriting - это правильный путь.

Есть хорошая статья на MSDN о лучших способах сделать это.

Http://msdn.microsoft.com/en-us/library/ms972974.aspx

Своего рода тангенс, но я бы на самом деле избегал делать это с разными путями, если только разные языки не являются полностью независимыми друг от друга.

Для Google rank или для пользователей, совместно использующих URL-адреса (одно из больших преимуществ "чистых" URL-адресов), вы хотите, чтобы адрес оставался как можно более постоянным.

Вы можете найти языковые предпочтения пользователей в настройках их браузера:

CultureInfo.CurrentUICulture

Затем Ваш URL для английского или испанского языка:

Www.domain.com/products/newproduct

Тот же адрес для любого языка, но пользователь получает страницу на выбранном им языке.

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

Чтобы сделать это с маршрутизацией URL, обратитесь к этой записи:

Дружественные URL-адреса с маршрутизацией URL-адресов

Кроме того, следите за новым ПЕРЕЗАПИСЫВАНИЕМ URL - адресов IIS 7.0. Отличная статья здесь http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

Эта часть мне понравилась. Какой Вариант Следует Использовать?

  1. Если вы разрабатываете новый ASP.NET веб-приложение, которое использует либо ASP.NET MVC или ASP.NET технологии динамических данных, использование ASP.NET маршрутизация. Ваше приложение будет воспользоваться встроенной поддержкой чистые URL-адреса, включая производство экологически чистых URL-адреса ссылки на ваших веб-страницах. Обратите внимание, что ASP.NET маршрутизация пока не поддерживает стандартные приложения веб-форм, хотя в будущем планируется ее поддержка.

  2. Если у вас уже есть наследство ASP.NET веб-приложение и не хотите его менять, используйте модуль URL-rewrite. Модуль URL-rewrite позволяет переводить удобные для поисковых систем URL-адреса в формат, используемый в настоящее время вашим приложением. Кроме того, он позволяет создавать правила перенаправления, которые можно использовать для перенаправления поисковые роботы для очистки URL-адресов. http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

Спасибо, Maulik убыл.