2010-07-28 9 views
6

Cómo usar mensajes localizados en el archivo javascript en asp.net.Cómo usar mensajes localizados en el archivo javascript en asp.net

Tengo un archivo Javascript (global-Scripts.js) que contiene todos mis scripts. Uso otro archivo (messages.js) que tiene todos los mensajes de error estáticos (por ejemplo, "¿estás seguro de que quieres eliminar?") Para que se pueda localizar.

¿Es posible localizar este archivo de script principal sin tener otro archivo (messages.js), para que pueda eliminar una referencia de script?

Respuesta

5

El control ASP.NET ScriptManager tiene la capacidad de proporcionar localization para sus scripts de varias maneras.

Si su script está incrustado en el ensambladoas a resource using the WebResourceAttribute continuación you can use the ScriptResourceAttribute dejar que el ScriptManager sabe que tiene algunas cadenas localizadas almacenados en un archivo .resx en alguna parte que desea servido arriba en cualquier momento se sirve el script. Estas cadenas se inyectan en la página como un objeto JSON y luego en el script principal se envían referencias al objeto JSON en lugar de cadenas literales.

Por ejemplo, se incrusta la secuencia de comandos de esta manera:

[assembly: System.Web.UI.WebResource("ProjectNamespace.MyScript.js", "application/x-javascript")] 
[assembly: System.Web.UI.ScriptResource("ProjectNamespace.MyScript.js", "ProjectNamespace.MyScriptResources", "Messages")] 

Los "ProjectNamespace.MyScript.js" es la ruta completa al recurso incrustado que es el script. En ScriptResourceAttribute, el segundo parámetro es la ruta completa al archivo .resx incrustado (menos la extensión .resx) que contiene todos los mensajes localizados. Tratas eso como cualquier otro .resx, por lo que tendrías MyScriptResources.resx para la cultura predeterminada, luego MyScriptResources.es-MX.resx para las anulaciones de español mexicano, etc. Ese último parámetro en ScriptResourceAttribute es el nombre de JSON objeto que se generará

En su guión, que hacen referencia al objeto JSON:

function DoSomething() 
{ 
    alert(Messages.ErrorMessage); 
} 

En el fragmento anterior, "ErrorMessage" es el nombre de uno de los recursos de cadena en el archivo .resx.

Si incrusta la secuencia de comandos, hágalo desde ScriptManager con una etiqueta que especifique una Asamblea y un Nombre.

Alternativamente, puede guardar copias totalmente localizadas de la secuencia de comandos, como "MyScript.js", "MyScript.es-MX.js", "MyScript.en-UK.js", etc., donde la localizada la lógica y los mensajes están codificados directamente en el script.

Si utiliza este método de localización, hágalo desde el ScriptManager utilizando un que especifique una ruta de acceso.

There is a really nice overview and links to detailed walkthroughs on this with code examples on MSDN.

Tenga en cuenta que si está utilizando ASP.NET MVC, el control ScriptManager no realmente trabajar con él. En ese caso, querrá ver una solución diferente como jQuery globalization plugin o potencialmente a custom ScriptManager replacement for use in MVC.

+0

Estaba trabajando con el mismo problema también. Pero en mi caso, produzco el archivo js como un recurso incrustado y uso ClientScriptManager. Y si el proyecto de recursos y el proyecto jscript incluido son diferentes. Por lo tanto, no puedo obtener el objeto "Mensajes" correcto de mi archivo js. ¿Alguna idea? –

1

Tengo una solución que he usado para resolver esto. Le permite utilizar sus recursos globales en su aplicación web asp.net dentro de sus archivos js. Esencialmente utiliza una página GetLocalisedScript.aspx para servir sus archivos js.

La página es la siguiente:

protected void Page_Load(object sender, EventArgs e) 
    { 
     string retval = ""; 

     string file = Request["js"].ToString(); 

     using(StreamReader sr = new StreamReader(Server.MapPath(string.Format("~\\scripts\\{0}.js",file)))) 
     { 
      retval = sr.ReadToEnd(); 
      sr.Close(); 
     } 

     Regex rx = new Regex("##LOCALISE(.+?)##",RegexOptions.Singleline); 
     MatchCollection mc = rx.Matches(retval,0); 
     foreach (Match m in mc) 
     { 
      string strResxKey = m.Value.Replace("##LOCALISE(", "").Replace(")##", ""); 
      string val = GetGlobalResourceObject("myResource", strResxKey).ToString(); 
      retval = retval.Replace(m.Value, val); 
     } 
     //Just write out the XML data 
     Response.ContentType = "text/xml"; 
     //NOTE THAT THIS PAGE DOESN'T CONTAIN ANY HTML TAG, WHATSOEVER 
     Response.Output.Write(retval); 
    } 

Marque

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetLocalisedScript.aspx.cs" Inherits="TestMulti.GetLocalisedScript" %> 

En su página de reemplazar el src de serie con algo como lo siguiente:

<script src="GetLocalisedScript.aspx?js=myJS" type="text/jscript" ></script> 

Dónde myJS ¿Está el nombre de tu archivo js

A continuación, modifique su archivo js para incluir las etiquetas ## LOCALIZE() ##.

function alert2(val) { 
alert("##LOCALISE(Yes)##"); 
} 

La página GetLocalisedScript.aspx reemplazará todas las etiquetas con las búsquedas de recursos.

Espero que esto ayude a alguien.

Cuestiones relacionadas