Melhor maneira de URLs punho em um site multilingue em ASP.net
-
01-07-2019 - |
Pergunta
Eu preciso fazer um website multilingue, com urls como
www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish
No passado, eu iria criar dois diretórios virtuais no IIS, e depois detectar o URL em global.aspx e alterar o idioma de acordo com a 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
A solução é mais como um hack. Eu estou pensando em usar o roteamento para um novo site.
Você sabe uma maneira melhor ou mais elegante para fazê-lo?
edit: A pergunta é sobre a manipulação de URL, e não sobre recursos, etc
.Solução
Eu decidi ir com o novo ASP.net Routing.
Por que não urlRewriting? Porque eu não quero mudar a URL limpa que roteamento dá a você.
Aqui está o código:
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
Depois classe 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
Finalmente eu uso o default.aspx na raiz para redirecionar para o padrão lang utilizada na lista browser.
Talvez isso possa ser feito com as route.Defaults, mas não fazer o trabalho dentro do Visual Studio (talvez ele funciona no servidor)
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
Algumas fontes:
Mike Ormond do blogue
* Blog Chris Cavanagh
MSDN
Outras dicas
- Use urlrewriteing.net para asp.net webforms ou roteamento com MVC. Rewrite www.site.com/en/something.aspx a url:?. Page.aspx lang = en
UrlRewriteing.net pode ser facilmente configurado via regex em web.config. Você também pode usar o roteamento com webforms Agora, é provavelmente semelhante ... - com webforms, deixe cada herda página aspx de classe BasePage, que então herda da classe de página.
Em BasePage class override "InitializeCulture ()" e conjunto de informações cultura ao tópico, como você descreveu em questão.
É bom fazer isso na seguinte ordem: 1. Verifique url para Lang param, 2. cookie de cheque, 3. conjunto padrão lang - Para conteúdo estático (texto, fotos url) em páginas usar LocalResources ou global se o conteúdo está repetindo através site. Você pode assistir videocast sobre o uso res globais / locais. em www.asp.net
- Preparar db para vários idiomas. Mas isso é outra história.
Eu personnaly usar os recursos arquivos .
Muito eficiente, muito simples.
UrlRewriting é o caminho a percorrer.
Há um bom artigo sobre MSDN sobre as melhores maneiras de fazer isso.
Uma espécie de tangente, mas eu realmente evitar fazer isso com caminhos diferentes, a menos que as diferentes línguas são completamente conteúdo separados uns dos outros.
Para rank do Google, ou para usuários compartilhando URLs (uma das grandes vantagens de URLs ‘limpos’), você quer o endereço para ficar o mais constante possível.
Você pode encontrar as preferências de idioma dos usuários de suas configurações do navegador:
CultureInfo.CurrentUICulture
Em seguida, o URL para Inglês ou Espanhol:
www.domain.com/products/newproduct
Mesmo endereço para qualquer idioma, mas o usuário recebe a página em sua língua escolhida.
Nós usamos isso no Canadá para fornecer sistemas de Inglês e Francês, ao mesmo tempo.
Para fazer isso com URL roteamento, consulte este post:
Além disso, atente novo IIS 7.0 - URL reescrita. Excelente artigo aqui http: // aprender. iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Eu gostei desta parte Qual opção você deve usar?
-
Se você estiver desenvolvendo um novo aplicativo ASP.NET Web que utiliza o ASP.NET MVC ou tecnologias ASP.NET Dynamic Data, use ASP.NET roteamento. Sua aplicação vai beneficiar de suporte nativo para URLs limpas, incluindo a geração de URLs limpas para os links em suas páginas da Web. Nota que o roteamento ASP.NET não suporta aplicações Web Forms padrão ainda, embora haja planos para apoiá-lo no futuro.
-
Se você já tem um legado aplicação ASP.NET Web e não quer mudá-lo, use o módulo URL-reescrita. O módulo de URL-reescrita permite traduzir URLs de pesquisa-friendly de motores em um formato que, atualmente, a aplicação utiliza. Além disso, ele permite que você crie regras de redirecionamento que podem ser usados ??para redirecionar rastreadores de motores de busca para URLs limpas. http://learn.iis.net /page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Obrigado, Maulik.