Manejadores de HTTP y packages de Javascript en VS 2012

Actualmente estoy intentando configurar un proyecto para implementar la localización en files JavaScript (como se describe aquí ), pero al mismo time me gustaría agrupar y minimizar el javascript en el proyecto. Seguí un tutorial sobre agrupación y minificación aquí

Pude hacer que ambos trabajen por separado, pero cuando bash que funcionen juntos, no puedo hacer que la localización funcione correctamente. Creo que esto se debe a que la agrupación crea su propio event handling ruta para el javascript incluido / minificado que genera, por lo que el httpHandler que he definido en el webconfig se ignora. Sigo recibiendo errores de JavaScript que dicen "CustomTranslate no está definido".

Estoy tratando de hacer esto porque estamos construyendo una serie de controles usando ExtJS, pero necesitamos poder aplicar la localización a esos controles. Cualquier ayuda / ideas sobre cómo puedo hacer que trabajen juntos sería apreciada.

No estoy usando MVC, pero estoy haciendo esto en asp.net en Visual Studio 2012.

Aquí está mi código:

BundleConfig.cs

namespace TranslationTest { public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { //default bundles addeed here... bundles.Add(new ScriptBundle("~/bundles/ExtJS.axd").Include("~/Scripts/ExtJS/ext-all.js", "~/Scripts/ExtJS/TestForm.js")); } } } 

web.config:

 <globalization uiCulture="auto" /> <httpHandlers> <add verb="*" path="/bundles/ExtJS.axd" type="TranslationTest.ScriptTranslator, TranslationTest" /> </httpHandlers> 

Default.aspx

 <%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TranslationTest._Default" %> <asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent"> <script src="/bundles/ExtJS.axd"></script> </asp:Content> 

TestForm.js:

 Ext.require([ 'Ext.form.*', 'Ext.layout.container.Column', 'Ext.tab.Panel' ]); Ext.onReady(function () { Ext.QuickTips.init(); var bd = Ext.getBody(); bd.createChild({ tag: 'h2', html: 'Form 1' }); var simple = Ext.create('Ext.form.Panel', { url: 'save-form.php', frame: true, title: 'Simple Form', bodyStyle: 'padding:5px 5px 0', width: 350, fieldDefaults: { msgTarget: 'side', labelWidth: 75 }, defaultType: 'textfield', defaults: { anchor: '100%' }, items: [{ fieldLabel: CustomTranslate(FirstName), name: 'first', allowBlank: false }, { fieldLabel: CustomTranslate(LastName), name: 'last' }, { fieldLabel: CustomTranslate(Company), name: 'company' }, { fieldLabel: CustomTranslate(Email), name: 'email', vtype: 'email' }, { xtype: 'timefield', fieldLabel: CustomTranslate(Time), name: 'time', minValue: '8:00am', maxValue: '6:00pm' }], buttons: [{ text: CustomTranslate(Save) }, { text: CustomTranslate(Cancel) }] }); simple.render(document.body); }); 

Actualmente, FirstName, LastName, etc. se almacenan en files de resources, como en el ejemplo vinculado anteriormente.

ScriptTranslator.cs

 namespace TranslationTest { public class ScriptTranslator : IHttpHandler { #region IHttpHandler Members public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { string relativePath = context.Request.AppRelativeCurrentExecutionFilePath.Replace(".axd", string.Empty); string absolutePath = context.Server.MapPath(relativePath); string script = ReadFile(absolutePath); string translated = TranslateScript(script); context.Response.Write(translated); Compress(context); SetHeadersAndCache(absolutePath, context); } #endregion private void SetHeadersAndCache(string file, HttpContext context) { context.Response.AddFileDependency(file); context.Response.Cache.VaryByHeaders["Accept-Language"] = true; context.Response.Cache.VaryByHeaders["Accept-Encoding"] = true; context.Response.Cache.SetLastModifiedFromFileDependencies(); context.Response.Cache.SetExpires(DateTime.Now.AddDays(7)); context.Response.Cache.SetValidUntilExpires(true); context.Response.Cache.SetCacheability(HttpCacheability.Public); } #region Localization private static Regex REGEX = new Regex(@"CustomTranslate\(([^\))]*)\)", RegexOptions.Singleline | RegexOptions.Compiled); private string TranslateScript(string text) { MatchCollection matches = REGEX.Matches(text); ResourceManager manager = new ResourceManager(typeof(TranslationTest.App_GlobalResources.text)); foreach (Match match in matches) { object obj = manager.GetObject(match.Groups[1].Value); if (obj != null) { text = text.Replace(match.Value, CleanText(obj.ToString())); } } return text; } private static string CleanText(string text) { text = text.Replace("'", "\\'"); text = text.Replace("\\", "\\\\"); return text; } private static string ReadFile(string absolutePath) { if (File.Exists(absolutePath)) { using (StreamReader reader = new StreamReader(absolutePath)) { return reader.ReadToEnd(); } } return null; } #endregion #region Compression private const string GZIP = "gzip"; private const string DEFLATE = "deflate"; private static void Compress(HttpContext context) { if (IsEncodingAccepted(DEFLATE, context)) { context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress); SetEncoding(DEFLATE, context); } else if (IsEncodingAccepted(GZIP, context)) { context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); SetEncoding(GZIP, context); } } private static bool IsEncodingAccepted(string encoding, HttpContext context) { return context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains(encoding); } private static void SetEncoding(string encoding, HttpContext context) { context.Response.AppendHeader("Content-encoding", encoding); } #endregion } } 

global.asax.cs

 namespace TranslationTest { public class Global : HttpApplication { void Application_Start(object sender, EventArgs e) { Microsoft.Web.Optimization.BundleTable.Bundles.EnableDefaultBundles(); BundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles); AuthConfig.RegisterOpenAuth(); } } } 

Espero haber cubierto todo, pero por favor avíseme si falta algo. ¡¡Gracias por adelantado!!

One Solution collect form web for “Manejadores de HTTP y packages de Javascript en VS 2012”

De acuerdo, configuré todo en su ejemplo y lo hice funcionar, pero debe usar la interfaz IBundleTransform. Los detalles de todo lo que hice se publican a continuación ..

Tuve que crear una class para manejar la transformación del package (es decir, la traducción) en lugar de permitir el comportamiento pnetworkingeterminado.

 public class JsLocalizationTransform : IBundleTransform { public JsLocalizationTransform(){} #region IBundleTransform Members public void Process(BundleContext context, BundleResponse response) { string translated = TranslateScript(response.Content); response.Content = translated; } #endregion #region Localization private static Regex REGEX = new Regex(@"CustomTranslate\(([^\))]*)\)", RegexOptions.Singleline | RegexOptions.Compiled); private string TranslateScript(string text) { MatchCollection matches = REGEX.Matches(text); ResourceManager manager = new ResourceManager(typeof(TranslationTest.App_GlobalResources.text)); foreach (Match match in matches) { object obj = manager.GetObject(match.Groups[1].Value); if (obj != null) { text = text.Replace(match.Value, CleanText(obj.ToString())); } } return text; } private static string CleanText(string text) { //text = text.Replace("'", "\\'"); text = text.Replace("\\", "\\\\"); return text; } #endregion } 

Luego, en el método BundleConfig.RegisterBundles, debe crear y agregar el package de esta manera:

 var extjsBundle = new Bundle("~/bundles/ExtJS").Include("~/Scripts/ExtJS/ext-all.js", "~/Scripts/ExtJS/TestForm.js"); extjsBundle.Transforms.Clear(); extjsBundle.Transforms.Add(new JsLocalizationTransform()); extjsBundle.Transforms.Add(new JsMinify()); bundles.Add(extjsBundle); 

Entonces podría eliminar HttpHandler de web.config, ya que eso se configura automáticamente a través del bundler. También tuve que hacer algunos cambios en el método Application_Start en global.asax.cs

 void Application_Start(object sender, EventArgs e) { //Microsoft.Web.Optimization.BundleTable.Bundles.EnableDefaultBundles(); BundleTable.EnableOptimizations = true; //Added this line.. BundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles); AuthConfig.RegisterOpenAuth(); } 

Como la class JSLocalisationTransform está manejando la transformación del package y la traducción, ScriptTranslator completo la class ScriptTranslator .

Espero que ayude.

  • Sailsjs cambia la localización
  • GWT DatePicker Locale
  • ¿Cómo cambiar el contenido de "Este campo es obligatorio" en el complemento de validation de formularios Jquery?
  • l20n.js - cómo acceder a las subentidades de localización desde javascript
  • Pasar posts de JavaScript localizados de packages de resources utilizando JSF
  • ¿React js y Laravel Localization strings?
  • localización del lado del cliente
  • ¿Cómo puedo indicar qué idioma representar en el browser usando l20n.js?
  • ¿Puedes "simplificar" las cadenas de templates de ES6 a las cadenas normales?
  • ¿Cómo localizo jQuery UI Datepicker?
  • Configuración regional y de date específica con Moment.js
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.