11

हाय मैं वर्तमान में System.Web.Optimization के साथ एएसपीएनटी एमवीसी 4 आरसी का उपयोग कर रहा हूं। चूंकि मेरी साइट को उपयोगकर्ता वरीयता के अनुसार स्थानीयकृत करने की आवश्यकता है, इसलिए मैं jquery.globalize प्लगइन के साथ काम कर रहा हूं।एक स्थानीय स्क्रिप्टबंडल समाधान

मैं स्क्रिप्टबंडल कक्षा को उप-वर्ग करना चाहता हूं और System.Threading.Thread.CurrentThread.CurrentUICulture के अनुसार फ़ाइलों को बंडल करना चाहता हूं। यही कारण है कि इस प्रकार दिखाई देगा:

bundles.Add(new LocalizedScriptBundle("~/bundles/jqueryglobal") 
          .Include("~/Scripts/jquery.globalize/globalize.js") 
          .Include("~/Scripts/jquery.globalize/cultures/globalize.culture.{0}.js", 
             () => new object[] { Thread.CurrentThread.CurrentUICulture }) 
        )); 

उदाहरण के लिए यदि ui संस्कृति है "en-GB" मैं निम्न फ़ाइलों को उठाया जा चाहते हैं (बेशक न्यूनतम किया गया और यदि संभव हो तो एक स्क्रिप्ट फ़ाइल या जब तक अच्छी तरह से कैश की गई वर्तमान में संस्कृति परिवर्तन)।

  • "~/स्क्रिप्ट/jquery.globalize/globalize.js"
  • "~/स्क्रिप्ट/jquery.globalize/वैश्वीकृत-en-GB.js" < - अगर इस फाइल पर मौजूद नहीं है सेवर फाइल सिस्टम ग्लोबलइज-एन.जेएस पर फ़ॉलबैक।

मैं की तरह कुछ के साथ विधि शामिल करें ओवरलोडिंग की कोशिश की निम्नलिखित लेकिन यह अभ्यस्त काम है क्योंकि यह अनुरोध पर लेकिन आवेदन के स्टार्टअप पर मूल्यांकन नहीं किया गया है।

public class LocalizedScriptBundle : ScriptBundle 
{ 
    public LocalizedScriptBundle(string virtualPath) 
     : base(virtualPath) { 
    } 

    public Bundle Include(string virtualPathMask, Func<object[]> getargs) { 
     string virtualPath = string.Format(virtualPathMask, getargs()); 
     this.Include(virtualPath); 
     return this; 
    } 

} 

धन्यवाद

Constantinos

उत्तर

9

यह सही है, बंडलों केवल कॉन्फ़िगर किया जाना चाहिए पूर्व एप्लिकेशन शुरू। अन्यथा एक बहु सर्वर परिदृश्य में, यदि बंडल के लिए अनुरोध पृष्ठ पर सेवा करने वाले किसी अन्य सर्वर के अलावा किसी अन्य सर्वर पर भेजा जाता है, तो बंडल संसाधन के लिए अनुरोध नहीं मिलेगा।

क्या यह समझ में आता है? असल में आपके सभी बंडलों को पहले से कॉन्फ़िगर और परिभाषित करने की आवश्यकता होती है, और प्रति अनुरोध आधार पर गतिशील रूप से पंजीकृत नहीं होती है।

+2

हाँ इस पाठ्यक्रम का सच है। लेकिन ऐसा लगता है, जब एक जेएस या सीएसएस फ़ाइल सर्वर की तरफ बदलती है तो बंडल को अद्यतित होने के लिए फिर से मूल्यांकन किया जाता है (आंतरिक रूप से फाइलसिस्टम वाटर का उपयोग कर)। मुझे इस कारण को नहीं देखा जा रहा है कि उदाहरण के लिए यूआई संस्कृति बदलने जैसी एप्लिकेशन लाइफसाइक्ल में अन्य घटनाओं को ध्यान में रखकर इस व्यवहार को ओवरराइड नहीं किया जा सकता है। – cleftheris

+0

हां, बंडल प्रतिक्रियाओं में कैश प्रविष्टि को अमान्य करने के लिए कैश निर्भरता सेटअप होता है जब बंडल में फ़ाइलें बदलती हैं। हमने अपने todo सूची पर कैशिंग व्यवहार को विस्तारित करने के लिए खोल दिया है, लेकिन मुझे यकीन नहीं है कि हम इसे कब प्राप्त करेंगे। –

1

एक बार देख ले: https://stackoverflow.com/questions/18509506/search-and-replace-in-javascript-before-bundling

मैं अपने जरूरतों के लिए इस तरह से कोडित:

public class MultiLanguageBundler : IBundleTransform 
{ 
    public void Process(BundleContext context, BundleResponse bundle) 
    { 
     var content = new StringBuilder(); 
     var uicult = Thread.CurrentThread.CurrentUICulture.ToString(); 

     var localizedstrings = GetFileFullPath(uicult); 
     if (!File.Exists(localizedstrings)) 
     { 
      localizedstrings = GetFileFullPath(string.Empty); 
     } 

     using (var fs = new FileStream(localizedstrings, FileMode.Open, FileAccess.Read)) 
     { 
      var m_streamReader = new StreamReader(fs); 
      var str = m_streamReader.ReadToEnd(); 

      content.Append(str); 
      content.AppendLine(); 
     } 

     foreach (var file in bundle.Files) 
     { 
      var f = file.VirtualFile.Name ?? ""; 

      if (!f.Contains("localizedstrings")) 
      { 
       using (var reader = new StreamReader(VirtualPathProvider.OpenFile(file.VirtualFile.VirtualPath))) 
       { 
        content.Append(reader.ReadToEnd()); 
        content.AppendLine(); 
       } 
      } 
     } 

     bundle.ContentType = "text/javascript"; 
     bundle.Content = content.ToString(); 
    } 

    private string GetFileFullPath(string uicult) 
    { 
     if (uicult.StartsWith("en")) 
      uicult = string.Empty; 
     else if (!string.IsNullOrEmpty(uicult)) 
      uicult = ("." + uicult); 

     return Kit.ToAbsolutePath(string.Format("~/Scripts/locale/localizedstrings{0}.js", uicult)); 
    } 
} 
+0

यह समाधान बंडल के निर्माण के बाद थ्रेड संस्कृति को गतिशील रूप से बदलने की समस्या को कैसे हल करता है? – cleftheris

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