10

इसका इस विशिष्ट प्रश्न का उत्तर खोजने के लिए मुश्किल है, इसलिए बीमार यह पॉप अप यहाँ:मेक यूआरएल भाषा-विशिष्ट (मार्गों के माध्यम से)

हम विशिष्ट भाषा पूरी तरह से हमारे यूआरएल का निर्माण करना चाहते हैं, जिसका अर्थ है

www.mysite.com/EN

www.mysite.com/DE

इस

साथ RouteConfig में किया जाता है
url: "{language}/{controller}/{action}/{id}" 

लेकिन फिर मुश्किल हिस्सा:

www.mysite.com/EN/Categories

www.mysite.com/DE/Kategorien

अर्थात नियंत्रण कोड को कई भाषाओं में प्रकट करें, लेकिन उसी नियंत्रक को इंगित करें। क्या यह भी संभव है?

+0

एक पूर्ण समाधान के लिए [एएसपी.नेट एमवीसी 5 संस्कृति और यूआरएल में संस्कृति] देखें (http://stackoverflow.com/a/32839796/181087)। – NightOwl888

उत्तर

13

अच्छा, यह आंशिक रूप से संभव है (केवल भाषा भाग)। एक अलग भाषा में नियंत्रक का नाम निश्चित रूप से एक दिलचस्प बिंदु है, लेकिन मुझे लगता है कि इसे हासिल करना मुश्किल होगा। इस बारे में सोचें कि यह अरबी और हिब्रू जैसी बिडी भाषाओं के लिए कैसा दिखता है। अलग-अलग भाषाओं में नियंत्रक का उपयोग करना शायद एक अच्छा विचार होगा लेकिन आप अपने लिए एक विनाश बनाएंगे और मुझे विश्वास है कि इसके लिए आपको अंतर्निहित एमवीसी संरचना को बदलना होगा।

भाषा बदलने वाला हिस्सा आसान है और नीचे जैसा किया जा सकता है।

जो आप देखना चाहते हैं वैश्वीकरण है। असल में भाषा भाग वर्तमान धागे यूआई संस्कृति से मेल खाता है।

  1. एक मार्ग को परिभाषित करें, कुछ इस तरह:

    var lang = System.Threading.Thread.CurrentThread.CurrentUICulture.Name; 
    
    routes.MapRoute(
        name: "Default", 
        url: "{language}/{controller}/{action}/{id}", 
        defaults: new { language = lang, controller = "Home", 
            action = "Index", id = UrlParameter.Optional } 
    ); 
    
  2. रजिस्टर Application_AcquireRequestState और यह कुछ इस तरह परिभाषित करते हैं:

    protected void Application_AcquireRequestState() 
    { 
        var routes = RouteTable.Routes; 
    
        var httpContext = Request.RequestContext.HttpContext; 
        if (httpContext == null) return; 
    
        var routeData = routes.GetRouteData(httpContext); 
    
        var language = routeData.Values["language"] as string; 
        var cultureInfo = new CultureInfo(language); 
    
        System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
        System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
    } 
    

    हालांकि CurrentUICulture क्या है क्या आप की जरूरत निम्नलिखित है आपको संसाधन फ़ाइल से भाषा लोड जानकारी की आवश्यकता होती है, आपको CurrentCulture को उसीमें भी बदलना चाहिए;

  3. अंतिम, सुनिश्चित करें कि आपके पास संबंधित संसाधन फ़ाइलें और फ़ॉलबैक संसाधन फ़ाइल है।

मैं CultureInfo की Name संपत्ति का इस्तेमाल किया है ताकि आप जर्मन की जाएगी डी-डे, अंग्रेजी en-US, आदि इस चाल करना चाहिए।

यदि आपको अधिक जानकारी चाहिए तो मैं जांचने के लिए एक नमूना एमवीसी प्रोजेक्ट अपलोड कर सकता हूं।

अद्यतन: तुम क्या चाहते करने का एक कच्चा रास्ता कुछ इस तरह करने के लिए मार्ग क्षेत्रों के आदेश को पलट करने के लिए है:

routes.MapRoute(
    name: "NewDefault", 
    url: "{language}/{id}/{action}/{controller}", 
    defaults: new { language = lang, controller = "Home", action = "Index", id = "Category"} 
); 

इस तरह आप एक निम्न अनुरोध http://www.your_url.com/de/Kategorien बना सकता है। इस मामले में श्रेणी नियंत्रक के बजाय id पर नक्शा। आप नियंत्रक अंग्रेजी या जर्मन में रहता है (इस पर निर्भर करता है कि आपने इसे कैसे नामित किया है) लेकिन उपयोगकर्ता एक अलग भाषा देखता है। पृष्ठभूमि में आपके विचार कुछ इस तरह हो सकता है:

public ActionResult Index(string id, string categoryName) 
{ 
    // Fetch data based on category name (categoryName) 
    return View(); 
} 

आप पैरामीटर के रूप में अतिरिक्त जानकारी दे सकते हैं, लेकिन आप की तरह कुछ देखने के लिए अपने मार्ग को ठीक करने की आवश्यकता होगी: {भाषा}/{श्रेणी}/{} उपश्रेणी/{action}/{नियंत्रक}

बस जानते हैं कि यह लंबे समय तक गर्दन में दर्द हो सकता है और यदि आप इसे आजमाते हैं, तो सुनिश्चित करें कि आप इसे अच्छी तरह से दस्तावेज करते हैं।

+0

हाय ह्यूसीन, आपके उत्तर के लिए धन्यवाद। वह भाषा कार्यान्वयन अच्छा दिखता है, मैं इसे इस तरह कार्यान्वित करूंगा। लेकिन असली (मुश्किल) समस्या 5 अलग-अलग भाषाओं के बीच भिन्नता है। /एन/श्रेणियाँ /NL/श्रेणियाँ /डे/श्रेणियाँ /एफआर/श्रेणियों पी एल/Kategorie ... एक ही नियंत्रक करने के लिए सभी बिंदु होना चाहिए। मुझे यकीन नहीं है कि यह भी संभव है, शायद इन 5 टेक्स्टस्ट्रिंग्स के लिए बाधाओं के साथ ... – stefjnl

+0

मैंने अपने उत्तर को एक ऐसे विचार के साथ अपडेट किया है जो मेरे साथ हुआ था। आशा करता हूँ की ये काम करेगा। –

+0

हाय रॉन, सिर्फ एक सिर ऊपर है कि मैंने अंततः आपके अद्यतन उत्तर को कम या कम लागू किया, जिससे श्रेणियां एक परिवर्तनीय बना रही हैं। routes.MapRoute ( नाम: "CategoryOverview", यूआरएल: "{भाषा}/{श्रेणी}", चूक: नए {भाषा = लैंग, नियंत्रक = "श्रेणी", कार्रवाई = "सूचकांक"} ) ; – stefjnl