我需要建立一个多语言网站,网址如
www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish
过去,我会在IIS中设置两个虚拟目录,然后在global.aspx中检测URL并根据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处理,而不是关于资源等。
答案 0 :(得分: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
最后,我使用root中的default.aspx重定向到浏览器列表中使用的默认语言。
也许这可以通过route.Defaults来完成,但是在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
有些消息来源:
* Mike Ormond's blog
* Chris Cavanagh’s Blog
* MSDN
答案 1 :(得分:1)
答案 2 :(得分:0)
我个人使用the resources files。非常高效,非常简单。
答案 3 :(得分:0)
答案 4 :(得分:0)
有点切线,但我实际上避免用不同的路径做这个,除非不同的语言完全相互分离。
对于Google排名或共享网址的用户(“干净”网址的一大优势),您希望地址尽可能保持不变。
您可以从浏览器设置中找到用户的语言偏好设置:
CultureInfo.CurrentUICulture
然后是您的英语或西班牙语网址:
www.domain.com/products/newproduct
任何语言的地址相同,但用户以所选语言获取页面。
我们在加拿大使用此功能同时提供英语和法语系统。
答案 5 :(得分:0)
要使用URL路由执行此操作,请参阅以下文章:
答案 6 :(得分:0)
另外,请注意新的IIS 7.0 - URL重写。这里有优秀的文章http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
我喜欢这部分 您应该使用哪种选项?
如果您正在开发使用ASP.NET MVC或ASP.NET动态数据技术的新ASP.NET Web应用程序,请使用ASP.NET路由。您的应用程序将受益于对干净URL的本机支持,包括为网页中的链接生成干净的URL。请注意,ASP.NET路由不支持标准Web窗体应用程序,尽管计划在将来支持它。
如果您已有旧的ASP.NET Web应用程序但不想更改它,请使用URL-rewrite模块。 URL重写模块允许您将搜索引擎友好的URL转换为应用程序当前使用的格式。此外,它还允许您创建可用于将搜索引擎抓取工具重定向到干净URL的重定向规则。 http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
谢谢, Maulik。