5

В настоящее время я пытаюсь настроить проект для реализации локализации в файлах javascript (как описано here), но в то же время я хотел бы связать и минимизировать javascript в проекте. Я следил за учебным пособием по связыванию и минимизации hereHTTP-обработчики и сборка javascript в VS 2012

Я получил возможность работать как по отдельности, но когда я пытаюсь заставить их работать вместе, я не могу нормально работать с локализацией. Я думаю, что это связано с тем, что связывание создает собственную обработку маршрутов для созданного javascript связанного/минитипированного javascript, поэтому HTTPHandler, который я определил в webconfig, игнорируется. Я продолжаю получать javascript-ошибки, говоря, что «CustomTranslate не определен».

Я пытаюсь сделать это, потому что мы создаем несколько элементов управления с помощью ExtJS, но мы должны иметь возможность применять локализацию к этим элементам управления. Любая помощь/идеи о том, как я могу заставить их работать вместе, будет оценена по достоинству.

Я не с использованием MVC, но делать это в asp.net в Visual Studio 2012.

Вот мой код:

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> 

По умолчанию.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); 


}); 

В настоящее время FirstName, LastName, и т.д., все хранящиеся в файлах ресурсов, так как в связанном примере выше.

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

Я надеюсь, что я покрыл все, но, пожалуйста, дайте мне знать, если есть что-то отсутствует. Заранее спасибо!!

+0

Кстати, наверное, стоит также упомянуть, что я также пытался заставить переводчика скриптов реализовать IRouteHandler тоже, но не было большой удачи и по этой дороге. – Paul

ответ

5

Хорошо, я настроил все в вашем примере, и у меня это получилось, но вам нужно использовать интерфейс IBundleTransform. Детали всего, что я сделал, размещены ниже.

Мне пришлось создать класс для обработки преобразования пучка (т. Е. Перевода) вместо того, чтобы разрешать поведение по умолчанию.

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 

    } 

Затем в методе BundleConfig.RegisterBundles вам нужно создать и добавить пакет, как это:

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

я мог бы удалить HttpHandler из web.config, как получает автоматически настраивается через пакетирования. Мне также пришлось внести некоторые изменения в метод Application_Start в 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(); 
     } 

Поскольку JSLocalisationTransform класса обрабатывает преобразование расслоения и перевод, я полностью удалил ScriptTranslator класс.

Надеюсь, что это поможет.

+0

Отлично, спасибо Грант – Paul

 Смежные вопросы

  • Нет связанных вопросов^_^