Лучший способ обработки 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 ответов:
Я решил пойти с новым 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
- Использование urlrewriteing.net ибо asp.net webforms, или маршрутизация с помощью mvc. Переписать www.site.com/en/something.aspx к url: страница.аспн?lang=en.
UrlRewriteing.net может быть легко настроен с помощью регулярных выражений в интернете.конфиг. Вы также можете использовать маршрутизацию с веб-формами сейчас, это, вероятно, похоже...- с webforms, пусть каждая страница aspx наследует от класса BasePage, который затем наследует от класса Page.
В классе BasePage переопределите "InitializeCulture ()" и установите информацию о культуре в поток, как вы описано в вопросе.
Это хорошо делать в следующем порядке: 1. проверьте url для Lang param, 2. проверьте печенье, 3. установить по умолчанию lang- для статического контента (текст, url-адрес pics) на страницах используйте LocalResources или Global, если контент повторяется по всему сайту. Вы можете смотреть видео-трансляцию с помощью global / local res. on www.asp.net
- Подготовка БД для нескольких языков. Но это уже другая история.
Я лично использую файлы ресурсов.
Очень эффективно, очень просто.
Своего рода тангенс, но я бы на самом деле избегал делать это с разными путями, если только разные языки не являются полностью независимыми друг от друга.
Для Google rank или для пользователей, совместно использующих URL-адреса (одно из больших преимуществ "чистых" URL-адресов), вы хотите, чтобы адрес оставался как можно более постоянным.
Вы можете найти языковые предпочтения пользователей в настройках их браузера:
CultureInfo.CurrentUICulture
Затем Ваш URL для английского или испанского языка:
Www.domain.com/products/newproduct
Тот же адрес для любого языка, но пользователь получает страницу на выбранном им языке.
Мы используем это в Канаде, чтобы обеспечить системы на английском и французском языках одновременно.
Кроме того, следите за новым ПЕРЕЗАПИСЫВАНИЕМ URL - адресов IIS 7.0. Отличная статья здесь http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Эта часть мне понравилась. Какой Вариант Следует Использовать?
Если вы разрабатываете новый ASP.NET веб-приложение, которое использует либо ASP.NET MVC или ASP.NET технологии динамических данных, использование ASP.NET маршрутизация. Ваше приложение будет воспользоваться встроенной поддержкой чистые URL-адреса, включая производство экологически чистых URL-адреса ссылки на ваших веб-страницах. Обратите внимание, что ASP.NET маршрутизация пока не поддерживает стандартные приложения веб-форм, хотя в будущем планируется ее поддержка.
Если у вас уже есть наследство ASP.NET веб-приложение и не хотите его менять, используйте модуль URL-rewrite. Модуль URL-rewrite позволяет переводить удобные для поисковых систем URL-адреса в формат, используемый в настоящее время вашим приложением. Кроме того, он позволяет создавать правила перенаправления, которые можно использовать для перенаправления поисковые роботы для очистки URL-адресов. http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Спасибо, Maulik убыл.