11

Hola, actualmente estoy utilizando el asp.net MVC 4 rc con System.Web.Optimization. Como mi sitio debe ser localizado según las preferencias del usuario, estoy trabajando con el plugin jquery.globalize.Solución de script localizada

Me gustaría mucho subclasificar la clase ScriptBundle y determinar qué archivos agrupar de acuerdo con System.Threading.Thread.CurrentThread.CurrentUICulture. Ese sería el siguiente:

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

Por ejemplo, si la cultura interfaz de usuario es "es-ES" Me gustaría que los siguientes archivos para ser recogidos (minified, por supuesto, y si es posible en caché aswell hasta que un archivo de secuencia de comandos o el cambios actuales en la cultura).

  • "~/Scripts/jquery.globalize/globalize.js"
  • "~/scripts/jquery.globalize/globalizar-en-GB.js" < - Si este archivo no existe en la Separe el sistema de archivos de modo que se repliegue a globalize-en.js.

Intenté sobrecargar el método Include con algo como lo siguiente, pero esto no funcionará porque no se evalúa a petición, sino al inicio de la aplicación.

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

} 

Gracias

Constantinos

Respuesta

9

eso es correcto, haces sólo deben ser configurados previamente inicio de aplicaciones. De lo contrario, en un escenario de varios servidores, si la solicitud del paquete se enruta a un servidor diferente al que sirve la página, no se encontrará la solicitud del recurso del paquete.

¿Tiene sentido? Básicamente, todos sus paquetes deben configurarse y definirse con antelación, y no registrarse dinámicamente por solicitud.

+2

Si esto es cierto, por supuesto. Pero, como parece, cuando un archivo js o css cambia del lado del servidor, el paquete se vuelve a evaluar para estar actualizado (internamente, quizás utilizando el FileSystemWatcher). No veo la razón por la que no se pueda anular este comportamiento para tener en cuenta otros eventos en el ciclo de vida de la aplicación como, por ejemplo, el cambio de cultura de la interfaz de usuario. – cleftheris

+0

Sí, las respuestas de paquete tienen configuraciones de caché configuradas para invalidar la entrada de caché cuando cambian los archivos del paquete. Hemos abierto el comportamiento de almacenamiento en caché para poder ampliarlo en nuestra lista de tareas pendientes, pero no estoy seguro de cuándo llegaremos a esto. –

1

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

que codifica esta forma para mis necesidades:

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

¿Cómo soluciona esta solución el problema de cambiar dinámicamente el cultivo de hilo una vez creado el paquete? – cleftheris

Cuestiones relacionadas