在 ASP.net 中处理多语言站点中的 URL 的最佳方法
-
01-07-2019 - |
题
我需要建立一个多语言网站,网址如下
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 处理,而不是关于资源等。
解决方案
我决定使用新的 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 重定向到浏览器列表中使用的默认语言。
也许这可以通过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
一些来源:
* 迈克·奥蒙德的博客
* 克里斯·卡瓦纳的博客
* 微软软件定义网络
其他提示
- 将 urlrewriteing.net 用于 asp.net webforms,或使用 mvc 进行路由。将 www.site.com/en/something.aspx 重写为 url:page.aspx?lang=en。
UrlRewriteing.net 可以通过 web.config 中的正则表达式轻松配置。您现在还可以将路由与网络表单一起使用,它可能类似...... - 使用webforms,让每个aspx页面都继承自BasePage类,然后BasePage类又继承自Page类。
在 BasePage 类中重写“InitializeCulture()”并将区域性信息设置为线程,就像您在问题中所描述的那样。
最好按以下顺序执行此操作:1.检查 url 的 Lang 参数,2。检查cookie,3。设置默认语言 - 对于页面上的静态内容(文本、图片 url),使用 LocalResources;如果内容在整个网站上重复,则使用 Global。您可以使用全球/本地资源观看视频广播。在 www.asp.net 上
- 为多种语言准备数据库。但那是另一个故事了。
我个人使用 资源文件.
非常高效,非常简单。
有点切线,但我实际上会避免使用不同的路径来执行此操作,除非不同的语言的内容完全彼此分离。
对于 Google 排名或共享 URL 的用户(“干净”URL 的一大优势),您希望地址尽可能保持不变。
您可以从用户的浏览器设置中找到用户的语言首选项:
CultureInfo.CurrentUICulture
然后是英语或西班牙语的 URL:
www.domain.com/products/newproduct
任何语言的地址都相同,但用户会以自己选择的语言获得页面。
我们在加拿大使用它来同时提供英语和法语系统。
要使用 URL 路由来执行此操作,请参阅这篇文章:
另外,请注意新的 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 重写模块。URL 重写模块允许您将搜索引擎友好的 URL 转换为您的应用程序当前使用的格式。此外,它还允许您创建重定向规则,用于将搜索引擎爬网程序重定向到干净的 URL。http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
谢谢,毛利克。