11

Xin chào Tôi hiện đang sử dụng asp.net MVC 4 rc với System.Web.Optimization. Vì trang web của tôi cần được bản địa hóa theo sở thích của người dùng, tôi đang làm việc với plugin jquery.globalize.Giải pháp scriptbundle được bản địa hóa

Tôi rất muốn phân lớp lớp ScriptBundle và xác định tệp nào sẽ được nhóm theo System.Threading.Thread.CurrentThread.CurrentUICulture. Điều đó sẽ trông như thế này:

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 }) 
        )); 

Ví dụ, nếu văn hóa ui là "en-GB" Tôi muốn các tập tin sau đây để được chọn (minified tất nhiên và nếu có thể được lưu trữ là tốt cho đến khi một tập tin kịch bản hay thay đổi văn hóa hiện tại).

  • "~/Scripts/jquery.globalize/globalize.js"
  • "~/Scripts/jquery.globalize/globalize-en-GB.js" < - nếu tập tin này không tồn tại trên cắt đứt hệ thống tệp để dự phòng thành globalize-en.js.

Tôi đã cố gắng quá tải phương thức Bao gồm một cái gì đó như sau nhưng điều này sẽ không hoạt động vì nó không được đánh giá theo yêu cầu mà là khi khởi động ứng dụng.

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; 
    } 

} 

Cảm ơn

Constantinos

Trả lời

9

Đó là chính xác, bó chỉ nên được cấu hình khởi động ứng dụng trước. Nếu không trong một kịch bản đa máy chủ, nếu yêu cầu cho gói được định tuyến đến một máy chủ khác không phải là máy chủ đã phục vụ trang, yêu cầu cho tài nguyên gói sẽ không được tìm thấy.

Điều đó có hợp lý không? Về cơ bản, tất cả các gói của bạn cần được định cấu hình và xác định trước và không được đăng ký động trên cơ sở theo yêu cầu.

+2

Có điều này là đúng tất nhiên. Nhưng dường như, khi một tệp js hoặc css thay đổi phía máy chủ, gói được đánh giá lại để được cập nhật (nội bộ có thể sử dụng FileSystemWatcher). Tôi không thấy lý do tại sao người ta không thể ghi đè hành vi này để đưa vào tài khoản các sự kiện khác trong vòng đời ứng dụng như văn hóa giao diện người dùng thay đổi ví dụ. – cleftheris

+0

Có, các phản hồi của gói có cài đặt phụ thuộc vào bộ nhớ cache để làm mất hiệu lực mục nhập bộ nhớ cache khi các tệp trong nhóm thay đổi. Chúng tôi đã mở rộng hành vi lưu vào bộ nhớ cache để có thể mở rộng trên danh sách việc cần làm của chúng tôi, nhưng tôi không chắc chắn khi nào chúng tôi sẽ thực hiện việc này. –

1

hãy xem: https://stackoverflow.com/questions/18509506/search-and-replace-in-javascript-before-bundling

tôi mã hóa theo cách này cho nhu cầu của tôi:

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

Làm thế nào để giải pháp này giải quyết được vấn đề thay đổi động văn hóa luồng sau khi gói đã được tạo ra? – cleftheris