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

Мне нужно сделать многоязычный веб-сайт с 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 голосов
/ 18 сентября 2008

Я решил пойти с новой маршрутизацией ASP.net.
Почему бы не переписать URL? Потому что я не хочу менять чистый 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

Наконец, я использую default.aspx в корневом каталоге для перенаправления на язык по умолчанию, используемый в списке браузеров.
Может быть, это можно сделать с помощью route. По умолчанию, но не работает внутри 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 голос
/ 17 сентября 2008
  1. Используйте urlrewriteing.net для веб-форм asp.net или маршрутизации с помощью mvc. Перепишите www.site.com/en/something.aspx на URL: page.aspx? Lang = ru.
    UrlRewriteing.net может быть легко настроен с помощью регулярных выражений в web.config. Теперь вы также можете использовать маршрутизацию с веб-формами, она, вероятно, похожа ...
  2. с веб-формами, пусть каждая страница aspx наследуется от класса BasePage, который затем наследуется от класса Page.
    В классе BasePage переопределите «InitializeCulture ()» и установите информацию о культуре в поток, как вы описали в вопросе.
    Это хорошо сделать в следующем порядке: 1. проверьте URL для параметра Lang, 2. проверьте cookie, 3. установите значение по умолчанию lang
  3. Для статического контента (текст, URL фото) на страницах используйте LocalResources или Global, если контент повторяется по всему сайту. Вы можете смотреть видеокасту об использовании глобального / локального разрешения. на www.asp.net
  4. Подготовка базы данных для нескольких языков. Но это другая история.
0 голосов
/ 17 декабря 2008

Также обратите внимание на новый IIS 7.0 - перезапись URL. Отличная статья здесь http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

Мне понравилась эта часть Какой вариант использовать?

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

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

Спасибо, Maulik.

0 голосов
/ 08 ноября 2008

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

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

0 голосов
/ 09 октября 2008

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

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

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

CultureInfo.CurrentUICulture

Тогда ваш URL для английского или испанского:

www.domain.com / продукты / NewProduct

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

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

0 голосов
/ 17 сентября 2008

UrlRewriting это путь.

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

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

0 голосов
/ 17 сентября 2008

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

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

...