2012-06-27 14 views
5

मैं अपने विचार एमवीसी 3 में दो भाषाओं के बीच स्विच करना चाहता हूं - पीएल और एन। मैंने व्यू-एन और पीएल में दो फ़ोल्डर्स बनाए हैं।विश्व स्तर पर मार्गों को कैसे बदला जाए?

routes.MapRoute(
       "pl", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "PL", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
      ); 

करने के लिए:: तो किसी भी साइट पर उपयुक्त भाषा लिंक पर क्लिक करने के बाद मैंने अपने मार्ग परिवर्तन चाहते

routes.MapRoute(
       "en", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "EN", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
      ); 

जब मैं उपयुक्त लिंक (भाषा स्विचर) पर क्लिक करें यह परिवर्तन CultureInfo जो सभी धागे को लगातार है । स्विचर साथ _Layout दृश्य:

<ul> 
    <li>@Html.ActionLink("En", "ChangeCulture", null, new { lang = "en"}, null)</li> 
    <li>@Html.ActionLink("Pl", "ChangeCulture", null, new { lang = "pl"}, null)</li> 
</ul> 

और नियंत्रक (जो भी स्थिर चर लैंग हर नियंत्रक की विधि में देखा जा सकता है कि और अनुरोधों के बीच लगातार हो सेट):

public ActionResult ChangeCulture(string lang) 
    { 

     PLController.lang = lang; 
     CultureSettings setCulture = new CultureSettings(); 
     setCulture.InitializeCulture(lang); 
     cookie.Value = CultureInfo.CurrentCulture.Name; 
     this.ControllerContext.HttpContext.Response.Cookies.Add(cookie); 
     return View("Index"); 
    } 

InitializeCulture विधि पृष्ठ से ओवरराइड है निम्नानुसार वर्ग:

public class CultureSettings : Page{ 

    public void InitializeCulture(string culture) 
    { 
      String selectedLanguage; 
      if(culture == null) 
      { 
       selectedLanguage = "pl"; 
      } 
      else 
      { 
       selectedLanguage = culture; 
      } 

      UICulture = selectedLanguage; 
      Culture = selectedLanguage; 

      Thread.CurrentThread.CurrentCulture = 
       CultureInfo.CreateSpecificCulture(selectedLanguage); 
      Thread.CurrentThread.CurrentUICulture = new 
       CultureInfo(selectedLanguage); 

     base.InitializeCulture(); 
    } 
} 

यह संस्कृतिइन्फो को ठीक से सेट करता है। अब मैं चाहता हूं (मौजूदा संस्कृतिइन्फो के मुताबिक) प्रत्येक नेविगेशन लिंक के लिए मार्ग स्विच करें और mysite.com/PL/{controller}/{action} से mysite.com/EN/{controller}/{action} पर रूट पैटर्न बदलें।

क्या किसी के पास इस समस्या के लिए कोई विचार या शायद बेहतर दृष्टिकोण है? लेकिन शर्त यह है कि पता इस mysite.com/EN या mysite.com/PL की तरह दिखना चाहिए - अलग नहीं (यानी en.mysite.com)

उत्तर

6

पहली बात यह है कि आपको यह तय करना होगा कि वर्तमान उपयोगकर्ता कहां स्टोर करना है भाषा। हर यूआरएल

  • कुकी
  • सत्र
  • IMHO एसईओ प्रयोजनों के लिए यूआरएल के हिस्से के रूप में यह है करने के लिए सबसे अच्छा है की

    • हिस्सा: वहाँ विभिन्न संभावनाएं हैं।

      public class LocalizedRoute : Route 
      { 
          public LocalizedRoute() 
           : base(
            "{lang}/{controller}/{action}/{id}", 
            new RouteValueDictionary(new 
            { 
             lang = "en-US", 
             controller = "home", 
             action = "index", 
             id = UrlParameter.Optional 
            }), 
            new RouteValueDictionary(new 
            { 
             lang = @"[a-z]{2}-[a-z]{2}" 
            }), 
            new MvcRouteHandler() 
           ) 
          { 
          } 
      
          public override RouteData GetRouteData(HttpContextBase httpContext) 
          { 
           var rd = base.GetRouteData(httpContext); 
           if (rd == null) 
           { 
            return null; 
           } 
      
           var lang = rd.Values["lang"] as string; 
           if (string.IsNullOrEmpty(lang)) 
           { 
            // pick a default culture 
            lang = "en-US"; 
           } 
      
           var culture = new CultureInfo(lang); 
      
           Thread.CurrentThread.CurrentCulture = culture; 
           Thread.CurrentThread.CurrentUICulture = culture; 
      
           return rd; 
          } 
      } 
      

      अब हम Global.asax में इस कस्टम मार्ग रजिस्टर सकता है::

      public static void RegisterRoutes(RouteCollection routes) 
      { 
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      
          routes.Add("Default", new LocalizedRoute()); 
      } 
      

      तो मैं जो यूआरएल से भाषा को पार्स और वर्तमान धागा संस्कृति सेट हो जाएगा एक कस्टम मार्ग लेखन की सिफारिश करेंगे

      ठीक है, अब चलिए एक मॉडल है:

      public class MyViewModel 
      { 
          [DisplayFormat(DataFormatString = "{0:d}")] 
          public DateTime Date { get; set; } 
      } 
      

      ए सी ontroller:

      public class HomeController : Controller 
      { 
          public ActionResult Index() 
          { 
           return View(new MyViewModel 
           { 
            Date = DateTime.Now 
           }); 
          } 
      
          public ActionResult Test() 
          { 
           return Content(DateTime.Now.ToLongDateString()); 
          } 
      } 
      

      और एक दृश्य:

      @model MyViewModel 
      
      @Html.DisplayFor(x => x.Date) 
      
      <ul> 
          <li>@Html.ActionLink("switch to fr-FR", "index", new { lang = "fr-FR" })</li> 
          <li>@Html.ActionLink("switch to de-DE", "index", new { lang = "de-DE" })</li> 
          <li>@Html.ActionLink("switch to en-US", "index", new { lang = "en-US" })</li> 
      </ul> 
      
      @Html.ActionLink("Test culture", "test") 
      

      अब जब आप लिंक हम भाषा बदल रहे हैं और इस भाषा अब मार्गों का हिस्सा है पर क्लिक करें। ध्यान दें कि एक बार जब आपने भाषा चुनी है तो test लिंक के लिए मार्गों में इस भाषा को जारी रखा जा रहा है।

      स्कॉट हंसेलमैन ने ASP.NET में स्थानीयकरण और वैश्वीकरण पर भी लिखा है जो जांच के लायक है।

    +1

    आपको बहुत बहुत धन्यवाद! मैं इस दृष्टिकोण की कोशिश करूंगा! – lukaleli

    +0

    और मेरे पास आपके लिए एक और सवाल है क्योंकि यह काम नहीं कर रहा है:/ मुझे नहीं पता क्यों, लेकिन मुझे लगता है कि आवेदन शुरू होने के बाद मार्ग स्थापित नहीं किए गए हैं। त्रुटि है: '/' अनुप्रयोग में सर्वर त्रुटि। संसाधन नहीं मिला। विवरण: HTTP 404. जिस संसाधन को आप ढूंढ रहे हैं (या इसकी निर्भरताओं में से एक) को हटा दिया जा सकता था, इसका नाम बदल गया था, या अस्थायी रूप से अनुपलब्ध है। कृपया निम्नलिखित यूआरएल की समीक्षा करें और सुनिश्चित करें कि यह सही वर्तनी है। अनुरोधित यूआरएल:/ कोई विचार? मैं एएसपी.नेट और एमवीसी – lukaleli

    +0

    में कुल नौसिखिया हूं ठीक है, यह अब काम कर रहा है। मैं नियंत्रक का नाम बदलना भूल गया;) – lukaleli

    0

    यह समाधान इस समस्या को हल नहीं:

    english: /en/home 
    
    french: /fr/accueil 
    
    english: /en/contactus 
    
    french: /fr/contacteznous 
    

    यह सिर्फ

    /en/home 
    
    /fr/home 
    

    क्या करेंगे आप भी एक शब्दकोश में मार्गों स्थानीय बनाना चाहिए और एक देखने से करते हैं।

    संबंधित मुद्दे