أفضل طريقة للتعامل مع عناوين URL في موقع متعدد اللغات في ASP.net

StackOverflow https://stackoverflow.com/questions/82380

سؤال

أحتاج إلى إنشاء موقع ويب متعدد اللغات، مع عناوين 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

نصائح أخرى

  1. استخدم urlrewriteing.net لنماذج الويب asp.net، أو التوجيه باستخدام mvc.أعد كتابة www.site.com/en/something.aspx إلى عنوان url:page.aspx?lang=en.
    يمكن تكوين UrlRewriteing.net بسهولة عبر regex في web.config.يمكنك أيضًا استخدام التوجيه مع نماذج الويب الآن، وربما يكون الأمر مشابهًا...
  2. باستخدام نماذج الويب، دع كل صفحة aspx ترث من فئة BasePage، والتي ترث بعد ذلك من فئة الصفحة.
    في فئة BasePage، قم بتجاوز "InitializeCulture()" وقم بتعيين معلومات الثقافة على مؤشر الترابط، كما هو موضح في السؤال.
    من الجيد القيام بذلك بهذا الترتيب:1.تحقق من عنوان url الخاص بـ Lang param, 2.التحقق من ملف تعريف الارتباط، 3.تعيين اللغة الافتراضية
  3. بالنسبة للمحتوى الثابت (نص، عنوان url للصور) على الصفحات، استخدم LocalResources، أو Global إذا كان المحتوى متكررًا عبر الموقع.يمكنك مشاهدة بث الفيديو باستخدام الدقة العالمية/المحلية.على www.asp.net
  4. إعداد ديسيبل للغات متعددة.لكن هذه قصة أخرى.

أنا شخصيا استخدم ملفات الموارد.

فعالة جدا وبسيطة جدا.

UrlRewriting هو الطريق الصحيح.

هناك مقالة جيدة على MSDN حول أفضل الطرق للقيام بذلك.

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

نوع من الظل، لكنني في الواقع أتجنب القيام بذلك بمسارات مختلفة ما لم تكن اللغات المختلفة منفصلة تمامًا عن بعضها البعض.

بالنسبة إلى تصنيف Google، أو للمستخدمين الذين يشاركون عناوين URL (إحدى المزايا الكبيرة لعناوين URL "النظيفة")، فإنك تريد أن يظل العنوان ثابتًا قدر الإمكان.

يمكنك العثور على تفضيلات اللغة الخاصة بالمستخدمين من إعدادات المتصفح الخاصة بهم:

CultureInfo.CurrentUICulture

ثم عنوان URL الخاص بك للغة الإنجليزية أو الإسبانية:

www.domain.com/products/newproduct

نفس العنوان لأي لغة، ولكن يحصل المستخدم على الصفحة باللغة التي اختارها.

نحن نستخدم هذا في كندا لتوفير أنظمة باللغتين الإنجليزية والفرنسية في نفس الوقت.

للقيام بذلك باستخدام توجيه URL، راجع هذا المنشور:

عناوين URL ودية مع توجيه URL

انتبه أيضًا إلى IIS 7.0 الجديد - إعادة كتابة عنوان URL.مقالة ممتازة هنا http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

اعجبني هذا الجزءما هو الخيار الذي يجب عليك استخدامه؟

  1. إذا كنت تقوم بتطوير تطبيق ويب ASP.NET جديد يستخدم تقنيات ASP.NET MVC أو ASP.NET Dynamic Data، فاستخدم توجيه ASP.NET.سيستفيد تطبيقك من الدعم الأصلي لعناوين URL النظيفة، بما في ذلك إنشاء عناوين URL النظيفة للروابط الموجودة في صفحات الويب الخاصة بك.لاحظ أن توجيه ASP.NET لا يدعم تطبيقات نماذج الويب القياسية حتى الآن، على الرغم من وجود خطط لدعمها في المستقبل.

  2. إذا كان لديك بالفعل تطبيق ويب ASP.NET قديم ولا تريد تغييره، فاستخدم وحدة إعادة كتابة عنوان URL.تسمح لك وحدة إعادة كتابة عنوان URL بترجمة عناوين URL الملائمة لمحركات البحث إلى تنسيق يستخدمه تطبيقك حاليًا.كما يسمح لك بإنشاء قواعد إعادة التوجيه التي يمكن استخدامها لإعادة توجيه برامج زحف محركات البحث لتنظيف عناوين URL.http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

شكرا ، موليك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top