2010-01-27 23 views
18

के साथ एक से अधिक भाषा यूआरएल को रूट करने के लिए मुझे मौजूदा नियंत्रक के बहु भाषा यूआरएल रूट की आवश्यकता है। मुझे और बताएं:एमवीसी

मेरे पास "उत्पाद" नाम वाला नियंत्रक है और नाम "सॉफ्टवेयर" के साथ देखें; इसलिए, डिफ़ॉल्ट रूप से उपयोगकर्ता में प्रवेश करती है, तो "http://example.com/en/Product/Software", है, है ना सामग्री (जो वास्तव में http://example.com/Product/Software में मौजूद है) मिल

हालांकि, अगर किसी अन्य उपयोगकर्ता - एक फ्रांसीसी उपयोगकर्ता - प्रकार "http://example.com/fr/Produits/logiciels", नियंत्रक और शो ऊपर प्राप्त करना होगा सही सामग्री के साथ (उसी http://example.com/Product/Software लेकिन फ्रेंच पाठ के साथ)।

नोट: मैं के साथ "{भाषा}/{नियंत्रक}/{कार्रवाई}/{आईडी}" मार्ग मेज सेट

किसी भी अन्य अमान्य URL 404 पृष्ठ दिखाना चाहिए।

क्या यह संभव है?

+0

असल में यह बहुत अच्छा विचार नहीं है कि आप खोज इंजन रैंकिंग के बारे में चिंतित हैं। आप हमेशा अंग्रेजी पृष्ठ पर रीडायरेक्ट कर सकते हैं या एक ही इकाई के सभी उदाहरणों के लिए मानक कैननिकल यूआरएल का उपयोग कर सकते हैं। –

उत्तर

6

दान की पोस्ट पर बिल्डिंग, मैं अपने नियंत्रक और क्रिया नामों का अनुवाद करने के लिए नीचे का उपयोग कर रहा हूं।

मैंने मूल्यों को संग्रहीत करने के लिए एक टेबल बनाई, यह संभवतः संसाधन फ़ाइलों में सब कुछ एक साथ रखने के लिए आयोजित किया जा सकता है; हालांकि मैंने डेटाबेस तालिका का उपयोग किया क्योंकि यह मेरी कंपनियों की प्रक्रियाओं के साथ बेहतर काम करता है।

CREATE TABLE [dbo].[RoutingTranslations](
[RouteId] [int] IDENTITY(1,1) NOT NULL, 
[ControllerName] [nvarchar](50) NOT NULL, 
[ActionName] [nvarchar](50) NOT NULL, 
[ControllerDisplayName] [nvarchar](50) NOT NULL, 
[ActionDisplayName] [nvarchar](50) NOT NULL, 
[LanguageCode] [varchar](10) NOT NULL) 

RouteConfig.cs फ़ाइल तो में बदल गया था:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     //Build up routing table based from the database. 
     //This will stop us from having to create shedloads of these statements each time a new language, controller or action is added 
     using (GeneralEntities db = new GeneralEntities()) 
     { 
      List<RoutingTranslation> rt = db.RoutingTranslations.ToList(); 
      foreach (var r in rt) 
      { 
       routes.MapRoute(
        name: r.LanguageCode + r.ControllerDisplayName + r.ActionDisplayName, 
        url: r.LanguageCode + "/" + r.ControllerDisplayName + "/" + r.ActionDisplayName + "/{id}", 
        defaults: new { culture = r.LanguageCode, controller = r.ControllerName, action = r.ActionName, id = UrlParameter.Optional }, 
        constraints: new { culture = r.LanguageCode } 
       ); 
      }     
     } 

     //Global catchall 
     routes.MapRoute(
      name: "Default", 
      url: "{culture}/{controller}/{action}/{id}", 
      defaults: new {culture = CultureHelper.GetDefaultCulture(), controller = "Default", action = "Index", id = UrlParameter.Optional } 
      //defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

    } 
} 

डिफ़ॉल्ट रूप से यह हमेशा अंग्रेजी नियंत्रक और कार्रवाई नामों का उपयोग होगा, लेकिन आप में मान दर्ज करके एक ओवरराइड प्रदान करने के लिए अनुमति देता है तालिका।

(मेरे अंतर्राष्ट्रीयकरण कोड काफी हद तक इस महान ब्लॉग पोस्ट से आधारित है। http://afana.me/post/aspnet-mvc-internationalization-part-2.aspx)

+0

यह नए जोड़े गए मार्गों के साथ काम नहीं करेगा हालांकि, क्या यह रजिस्टर मार्गों से ही स्टार्टअप निष्पादित किया जाएगा? – alex

2

आपको अंग्रेजी के लिए "http://mysite.com/en/Product/Software" और फ्रेंच के लिए "http://mysite.com/fr/Product/Software" जैसे कुछ यूआरएल होना चाहिए, जो अधिक समझ में आता है।

दोनों के लिए एक ही दृश्य का उपयोग करें।

हैप्पी कोडिंग।

+0

इस गैर के अनुकूल यूआरएल का मतलब है, के बाद से दुनिया में हर किसी न अंग्रेजी – erikkallen

+0

बोलती है डिफ़ॉल्ट रूप से आप अंग्रेजी erikkallen चाहिए उपयोग – Ravia

+0

कारण है कि आप नीचे वोट आदमी – Ravia

4

जैसा कि पहले सुझाव दिया गया है, यह सम्मेलन से निकलता है जहां वेबसाइट यूआरएल (और मार्ग) अंग्रेजी का उपयोग करती है।

फिर भी, यह संभव है, लेकिन ऐसा करने के लिए, आपको शायद हर विदेशी भाषा के लिए प्रति मार्ग एक मार्ग उत्पन्न करना होगा। तो 20 कार्यों और तीन भाषाओं (अंग्रेजी, फ्रेंच, और जर्मन) वाली वेबसाइट के लिए, आपको 41 मार्ग (20 फ्रेंच, 20 जर्मन और 1 अंग्रेजी) की आवश्यकता होगी। सबसे कुशल प्रणाली नहीं, मैं मानता हूं, लेकिन यह काम करता है जैसा आप चाहते हैं।

//You'll only need one of these, which is the default. 
routes.MapRoute(
    "English route", 
    "en/{controller}/{action}/{id}" 
    new { controller = "Home", action = "Index", language = "en" }, 
); 

routes.MapRoute(
    "FrenchHome", 
    "fr/Demarrer/Index/{id}", 
    new { controller = "Home", action = "Index", language = "fr" } 
); 

routes.MapRoute(
    "GermanHome", 
    "de/Heim/Index/{id}", //'Heim' is, I believe the correct usage of Home in German. 
    new { controller = "Home", action = "Index", language = "de" } 
); 

//Some more routes... 

routes.MapRoute(
    "FrenchSoftware", 
    "fr/Produit/Logiciels/{id}", 
    new { controller = "Product", action = "Software", language = "fr" } 
); 

routes.MapRoute(
    "GermanSoftware", 
    "de/Produkt/Software/{id}", //In this instance, Software should be the same in German and English. 
    new { controller = "Product", action = "Software", language = "de" } 
); 

//And finally, the 404 action. 
routes.MapRoute(
    "Catchall", 
    "{language}/{*catchall}", 
    new { controller = "Home", action = "PageNotFound", language = "en" }, 
    new { language = "^(en|fr|de)$" } 
); 

//This is for the folks who didn't put a language in their url. 
routes.MapRoute(
    "Catchall", 
    "{*catchall}", 
    new { controller = "Home", action = "PageNotFound", language = "en" } 
); 

अपने कार्यों में, उदाहरण के उत्पाद/सॉफ्टवेयर के लिए ...

public ActionResult Software(string language, int id) 
{ 
    //This would go off to the DAL and get the content in whatever language you want. 
    ProductModel model = ProductService.GetSoftware(language, id); 

    return View(model); 
} 

मैं करूंगा लव यह कि कोई साथ आया था और कहा ऐसा करने का एक बेहतर तरीका है कि वहाँ है, क्योंकि मैं इस बात से सहमत कि एक विदेशी भाषा में यूआरएल अच्छा नहीं है, और यह देखते हुए कि इंटरनेट स्वयं यूआरएल में गैर-रोमन पात्रों को अनुमति देने की ओर बढ़ रहा है, जितनी जल्दी हम इसके समाधान को बेहतर मानेंगे।

केवल इतना ही नहीं, लेकिन मुझे गर्व है कि फ्रांसीसी लोग अपनी वेबसाइट यूआरएल को अंग्रेजी में देखना पसंद नहीं करते हैं। :)

+1

द्वारा उत्तर दिया गया है (कोई बेहतर तरीका के साथ आ रहा है ...) कार्रवाई विधि में क्या पारित किया जाता है इसकी देखभाल नहीं करने के बारे में क्या? इसके बजाय, इसे सामान्य की तरह रूट करें। लेकिन अपने बेस कंट्रोलर (ऑन) पर OnActionExecuting() के लिए अधिभार है जो तदनुसार संस्कृतियूआई को मार्ग पर आधारित करता है (उदाहरण के लिए यह फ़िल्टरकॉन्टेक्स्ट में Request.Url पर देखेगा)। या एक अधिक दृढ़ता से टाइप किया गया संस्करण रूट से विरासत में अपना स्वयं का LangaugeRoute() वर्ग बनाना होगा। उस पर एक नई संपत्ति जोड़ें, LanguageCode, और इसे अपने उत्तर में अपने MapRoute में सेट करें। फिर, आप इसे अपने OnActionExecuting() में दृढ़ता से टाइप कर सकते हैं। – eduncan911

+0

मुझे यह पसंद है, लेकिन वर्तमान संस्कृति की जांच करने से इसके जोखिम हैं, मुख्य रूप से इस संभावना से संबंधित है कि आपके पास वास्तव में वेबसाइट का संस्करण नहीं हो सकता है। उदाहरण के लिए, जब संस्कृति की बात आती है तो तुर्की में कुछ मुद्दे हैं (Google तुर्की-मैं समस्या)। किसी भी मामले में, यदि आपके पास सही नहीं है तो आपको किसी दूसरे को डिफ़ॉल्ट रूप से अनुवाद करने के लिए आपके पास होने वाले अनुवादों को संभालने के लिए कहीं और/या आवरण कथन का एक गुच्छा बनाना होगा। –

+1

इसके अलावा, यह विषय पर मार्टिन Balliauw द्वारा एक उत्कृष्ट ब्लॉग पोस्ट है। http://blog.maartenballiauw.be/post/2010/01/26/translating-routes-(ASPNET-MVC-and-Webforms).aspx –

0

मैं दृढ़ता से एक MVC 5 (और <) वेब अनुप्रयोग में बहु भाषा को लागू करने के लिए निम्न दृष्टिकोण की सलाह देते हैं, क्योंकि मुझे लगता है यह उन वर्षों में सबसे बहुमुखी है जो मैंने हाल के वर्षों में कोशिश की है। भेजे यूआरएल को संभालने के लिए (यदि आप MVC5 या आप ऊपर का उपयोग कर रहे भी के लिए गुण-आधारित रूटिंग जा सकते हैं

  • एक बहु भाषा अवगत मार्ग:

    आप मूल रूप से तीन बातों को लागू करने की जरूरत है इसके बजाए, लेकिन मैं अभी भी इसे संभालने के लिए वैश्विक नियम का उपयोग करना पसंद करता हूं)।

  • इस तरह के बहु भाषा अनुरोधों को संभालने के लिए एक स्थानीयकरण एट्रिब्यूट
  • आपके यूआरएल को अपने एप्लिकेशन के भीतर उत्पन्न करने के लिए एक सहायक विधि और/या Url.Action विस्तार विधियां)।

this answer और विवरण और कोड नमूने के लिए देखें।

इस विषय पर अतिरिक्त जानकारी और आगे के नमूने के लिए आप this post भी पढ़ सकते हैं।