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

.
Foi útil?

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

  1. 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 ...
  2. 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
  3. 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
  4. 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.

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

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:

URLs amigáveis ??com URL Routing

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?

  1. 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.

  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top