11

Ciao Attualmente sto usando l'asp.net MVC 4 rc con System.Web.Optimization. Poiché il mio sito deve essere localizzato in base alle preferenze dell'utente, sto lavorando con il plugin jquery.globalize.Una soluzione scriptbundle localizzata

Vorrei molto sottoclasse la classe ScriptBundle e determinare quali file raggruppare in base allo System.Threading.Thread.CurrentThread.CurrentUICulture. Ciò sarebbe simile a questa:

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

Per esempio, se la lingua dell'interfaccia utente è "it-IT" Vorrei i seguenti file per essere prelevati (minified di corso e, se possibile, nella cache partecipavano fino a un file di script o il cambiamenti della cultura corrente).

  • "~/Scripts/jquery.globalize/globalize.js"
  • "~/Scripts/jquery.globalize/globalizzare-en-GB.js" < - se questo file non esiste sul sever file system in modo fallback su globalize-it.js.

Ho provato a sovraccaricare il metodo Include con qualcosa di simile al seguente, ma questo non funzionerà perché non viene valutato su richiesta ma all'avvio dell'applicazione.

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

} 

Grazie

Constantinos

risposta

9

che è corretto, fasci devono essere configurate solo pre partenza app. Altrimenti in uno scenario multi server, se la richiesta per il pacchetto viene instradata verso un server diverso da quello che ha servito la pagina, la richiesta per la risorsa bundle non verrà trovata.

Ha senso? Fondamentalmente tutti i pacchetti devono essere configurati e definiti in anticipo e non registrati dinamicamente in base alle richieste.

+2

Sì questo è vero, naturalmente. Ma a quanto pare, quando un file js o css cambia lato server, il bundle viene rivalutato per essere aggiornato (internamente magari usando FileSystemWatcher). Non vedo il motivo per cui non è possibile ignorare questo comportamento per tenere conto di altri eventi nel ciclo di vita dell'applicazione, come ad esempio la modifica della cultura dell'interfaccia utente. – cleftheris

+0

Sì, le risposte di raggruppamento hanno l'impostazione delle dipendenze della cache per invalidare la voce della cache quando i file nel pacchetto cambiano. Abbiamo aperto il comportamento del caching per essere estensibile nella nostra lista delle cose da fare, ma non sono sicuro quando arriveremo a questo. –

1

un'occhiata: https://stackoverflow.com/questions/18509506/search-and-replace-in-javascript-before-bundling

ho codificato in questo modo per le mie esigenze:

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

In che modo questa soluzione risolve il problema di modificare dinamicamente la cultura del filo dopo che il bundle è stato creato? – cleftheris

Problemi correlati