ASP.net の多言語サイトで URL を処理する最良の方法
-
01-07-2019 - |
質問
次のような URL を含む多言語 Web サイトを作成する必要があります。
www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish
以前は、IIS に 2 つの仮想ディレクトリを設定し、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を使用して、ブラウザーのリストで使用されるデフォルトのlangにリダイレクトします。
おそらくこれは、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
いくつかの情報源:
* マイク・オーモンドのブログ
* Chris Cavanagh のブログ
* MSDN
他のヒント
- asp.net Web フォームには urlrewriteing.net を使用するか、mvc によるルーティングを使用します。www.site.com/en/something.aspx を次の URL に書き換えます。page.aspx?lang=ja。
UrlRewriteing.net は、web.config の正規表現を使用して簡単に構成できます。Web フォームでルーティングを使用することもできるようになりました。おそらく似たようなものです... - Web フォームでは、すべての aspx ページが BasePage クラスから継承され、BasePage クラスが Page クラスから継承されます。
BasePage クラスで「InitializeCulture()」をオーバーライドし、質問で説明したように、カルチャ情報をスレッドに設定します。
次の順序で行うと良いでしょう。1.Lang param の URL を確認します。2.クッキーをチェック、3.デフォルトの言語を設定する - ページ上の静的コンテンツ (テキスト、写真 URL) の場合は LocalResources を使用し、コンテンツがサイト全体で繰り返される場合は Global を使用します。グローバル/ローカル解像度を使用してビデオキャストを視聴できます。www.asp.net で
- 多言語対応のデータベースを用意します。しかし、それはまた別の話です。
私は個人的に使用しています リソースファイル.
非常に効率的で、非常にシンプルです。
URLリライトが最適な方法です。
これを行うための最良の方法については、MSDN に優れた記事があります。
話が逸れましたが、異なる言語のコンテンツが互いに完全に分離されていない限り、異なるパスでこれを行うことは実際には避けたいと思います。
Google のランクや URL を共有するユーザー (「クリーン」 URL の大きな利点の 1 つ) のためには、アドレスを可能な限り一定に保つ必要があります。
ユーザーの言語設定はブラウザ設定から確認できます。
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 Dynamic Data テクノロジを使用する新しい ASP.NET Web アプリケーションを開発している場合は、ASP.NET ルーティングを使用します。アプリケーションは、Web ページ内のリンクのクリーンな 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/
ありがとう、マウリク。