أفضل طريقة للتعامل مع عناوين URL في موقع متعدد اللغات في ASP.net
-
01-07-2019 - |
سؤال
أحتاج إلى إنشاء موقع ويب متعدد اللغات، مع عناوين URL مثل
www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish
في الماضي، كنت أقوم بإعداد دليلين ظاهريين في IIS، ثم اكتشاف عنوان URL في global.aspx وتغيير اللغة وفقًا لعنوان 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 الموجود في الجذر لإعادة التوجيه إلى اللغة الافتراضية المستخدمة في قائمة المتصفحات.
ربما يمكن القيام بذلك باستخدام المسار. الإعدادات الافتراضية، ولكنها لا تعمل داخل 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
بعض المصادر:
* مدونة مايك أورموند
* مدونة كريس كافانا
* MSDN
نصائح أخرى
- استخدم urlrewriteing.net لنماذج الويب asp.net، أو التوجيه باستخدام mvc.أعد كتابة www.site.com/en/something.aspx إلى عنوان url:page.aspx?lang=en.
يمكن تكوين UrlRewriteing.net بسهولة عبر regex في web.config.يمكنك أيضًا استخدام التوجيه مع نماذج الويب الآن، وربما يكون الأمر مشابهًا... - باستخدام نماذج الويب، دع كل صفحة aspx ترث من فئة BasePage، والتي ترث بعد ذلك من فئة الصفحة.
في فئة BasePage، قم بتجاوز "InitializeCulture()" وقم بتعيين معلومات الثقافة على مؤشر الترابط، كما هو موضح في السؤال.
من الجيد القيام بذلك بهذا الترتيب:1.تحقق من عنوان url الخاص بـ Lang param, 2.التحقق من ملف تعريف الارتباط، 3.تعيين اللغة الافتراضية - بالنسبة للمحتوى الثابت (نص، عنوان url للصور) على الصفحات، استخدم LocalResources، أو Global إذا كان المحتوى متكررًا عبر الموقع.يمكنك مشاهدة بث الفيديو باستخدام الدقة العالمية/المحلية.على www.asp.net
- إعداد ديسيبل للغات متعددة.لكن هذه قصة أخرى.
أنا شخصيا استخدم ملفات الموارد.
فعالة جدا وبسيطة جدا.
UrlRewriting هو الطريق الصحيح.
هناك مقالة جيدة على MSDN حول أفضل الطرق للقيام بذلك.
نوع من الظل، لكنني في الواقع أتجنب القيام بذلك بمسارات مختلفة ما لم تكن اللغات المختلفة منفصلة تمامًا عن بعضها البعض.
بالنسبة إلى تصنيف 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 جديد يستخدم تقنيات ASP.NET MVC أو ASP.NET Dynamic Data، فاستخدم توجيه ASP.NET.سيستفيد تطبيقك من الدعم الأصلي لعناوين URL النظيفة، بما في ذلك إنشاء عناوين URL النظيفة للروابط الموجودة في صفحات الويب الخاصة بك.لاحظ أن توجيه ASP.NET لا يدعم تطبيقات نماذج الويب القياسية حتى الآن، على الرغم من وجود خطط لدعمها في المستقبل.
إذا كان لديك بالفعل تطبيق ويب ASP.NET قديم ولا تريد تغييره، فاستخدم وحدة إعادة كتابة عنوان URL.تسمح لك وحدة إعادة كتابة عنوان URL بترجمة عناوين URL الملائمة لمحركات البحث إلى تنسيق يستخدمه تطبيقك حاليًا.كما يسمح لك بإنشاء قواعد إعادة التوجيه التي يمكن استخدامها لإعادة توجيه برامج زحف محركات البحث لتنظيف عناوين URL.http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
شكرا ، موليك.