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

StackOverflow https://stackoverflow.com/questions/82380

Вопрос

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

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

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

Редактировать:Вопрос заключается в обработке URL-адресов, а не в ресурсах и т.д.

Это было полезно?

Решение

Я решил использовать новый 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 в корневом каталоге для перенаправления на язык по умолчанию, используемый в списке браузеров.
Возможно, это можно сделать с помощью маршрута.По умолчанию, но не работает внутри 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 веб-форм или маршрутизации с помощью mvc.Переписать www.site.com/en/something.aspx по URL:страница.aspx?lang=ru.
    UrlRewriteing.net может быть легко настроен с помощью регулярного выражения в web.config.Теперь вы также можете использовать маршрутизацию с webforms, вероятно, это похоже...
  2. с помощью webforms пусть каждая страница aspx наследуется от класса BasePage, который затем наследуется от класса Page.
    В классе BasePage переопределите "InitializeCulture()" и установите culture info в thread, как вы описали в вопросе.
    Хорошо бы делать это в таком порядке:1.проверьте URL на наличие параметра Lang, 2.проверьте файл cookie, 3.установите язык по умолчанию
  3. Для статического контента (текст, URL-адрес фотографий) на страницах используйте локальные ресурсы или глобальные, если контент повторяется по всему сайту.Вы можете смотреть видеотрансляцию с использованием глобального / локального разрешения.вкл . www.asp.net
  4. Подготовьте базу данных для нескольких языков.Но это уже совсем другая история.

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

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

Переписывание URL-адресов - это правильный путь.

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

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

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

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

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

CultureInfo.CurrentUICulture

Затем ваш URL-адрес для перевода на английский или испанский:

www.domain.com/products/newproduct

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

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

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

Удобные URL-адреса с маршрутизацией URL

Кроме того, обратите внимание на новый 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 Технологии динамических данных, используйте ASP.NET маршрутизацию.Ваше приложение получит выгоду от встроенной поддержки чистых URL-адресов, включая генерацию чистых URL-адресов для ссылок на ваших веб-страницах.Обратите внимание, что ASP.NET маршрутизация пока не поддерживает стандартные приложения Web Forms, хотя в будущем планируется ее поддержка.

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

Спасибо, Маулик.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top