textcontent - innertext javascript
¿Cómo obtener textos de Resx para ser usados en Javascript? (7)
Estamos creando grandes aplicaciones ASP.NET para el uso de la intranet en múltiples idiomas / culturas. Utilizamos la Globalización con archivos RESX y usamos GetResourceText en el lado del servidor para obtener los textos localizados.
Últimamente estamos haciendo más y más lógica del lado del cliente con JQuery.
¿Cómo consigo los textos RESX para ser usados en Javascript?
- Por ejemplo, textos utilizados para la validación, mensajes dinámicos, etc.
Todos nuestros Javascripts están en archivos .JS, no queremos mezclar HTML en la página ASPX y bloques de Javascript.
Gracias por tu ayuda.
¿Ha considerado usar $.ajax
en combinación con ASP.NET WebMethods? Es difícil sugerir una solución más concreta a este problema sin entender cómo su JavaScript / jQuery consumiría / procesaría los recursos. Supongo que están organizados en grupos lógicos (o podrían estar) donde podría devolver varias cadenas de recursos que pertenecen a una sola página.
Suponiendo que podría escribir una clase de C # muy simple, o usar un Dictionary<string, string>
- para devolver datos de su Método Web ASP.NET. Los resultados se verían como:
[WebMethod]
public Dictionary<string, string> GetPageResources(string currentPage)
{
// ... Organizational stuff goes here.
}
Siempre separo mis llamadas AJAX en archivos / objetos .js separados; que se veria como
function GetPageResources (page, callback)
$.ajax({ // Setup the AJAX call to your WebMethod
data: "{ ''currentPage'':''" + page + "'' }",
url: /Ajax/Resources.asmx/GetPageResources, // Or similar.
success: function (result) { // To be replaced with .done in jQuery 1.8
callback(result.d);
}
});
Luego, en el archivo .js ejecutado en la página, debería poder consumir esa información como:
// Whatever first executes when you load a page and its JS files
// -- I assume that you aren''t using something like $(document).ready(function () {});
GetPageResources(document.location, SetPageResources);
function SetPageResources(resources) {
for (currentResource in resources) {
$("#" + currentResource.Key).html(currentResource.Value);
}
}
¿Qué hay de inyectarlo como parte de una inicialización de control javascript? Lo que hago es como sigue:
Tengo un control de javascript autocontenido, llámelo CRMControl, que tiene un método de inicio llamado setupCRMControl, al cual le paso un objeto de configuración. Cuando lo inicializo, paso un objeto que contiene todos los recursos que necesito dentro de javascript de la siguiente manera:
CRMControl.setupCRMControl({
numOfCRMs: 3,
maxNumOfItems: 10,
// then i pass a resources object with the strings i need inside
Resources: {
Cancel: ''@Resources.Cancel'',
Done: ''@Resources.Done'',
Title: ''@Resources.Title''
}
});
Entonces, dentro de este control de javascript:
var crmSettings = {};
this.setupCRMControl(settings) {
crmSettings = settings;
};
y cada vez que quiero mostrar un recurso, digo (por ejemplo, muestra una alerta que dice ''Hecho''):
alert(crmSettings.Resources.Done);
Puedes llamarlo "R" para hacerlo más corto o algo así, pero este es mi enfoque. Quizás esto no funcione si tiene un montón de cadenas, pero para casos manejables, esto puede funcionar.
Cree un HttpHandler (archivo .ashx) y devuelva JSON con sus cadenas de recursos de texto.
También puede "publicarlo" en el espacio de nombres global, es decir,
Response.Write("window.Resources=");
Response.Write((new JavaScriptSerializer()).Serialize(strings));
configurar HTML como:
<script src="Resx.ashx?lang=en-US" />
<button class="LogoutButtonResourceId OtherButtonClasses">(generic logout text)</button>
<a href="#"><span class="SomeLinkTextResourceId OtherClasses">
(generic link text)
</span></a>
y aplicar textos como este:
$(document).ready(function() {
for(var resId in Resources){
$("."+resId).html(Resources[resId]);
}
});
Desafortunadamente, en un archivo JS externo, el código del lado del servidor no está siendo procesado por el servidor. Sin embargo, he visto una solución alternativa en la que puedes configurar tus valores traducidos en campos ocultos en la página, de esta manera tu javascript podrá leer los valores en.
Por ejemplo:
<%-- This goes into your page --%>
<input type="hidden" id="translatedField" name="translatedField" value="<%=Resources.Resources.translatedText %>" />
y usa esto dentro de tu archivo javascript:
// This is the js file
$(document).ready(function() {
alert($("#translatedField").attr("value"));
});
Podrá separar los valores y seguir viéndolo en su archivo JS externo.
También hay otra solución que crea un archivo .aspx que solo genera Javascript en lugar de HTML. Revisa el enlace a continuación:
Usando el método del lado del servidor en un archivo JavaScript externo
Sé que es muy tarde pero quiero compartir mi experiencia en esta tarea)
Yo uso AjaxMin. Puede insertar valores de clave resx en el archivo js en el evento de compilación. No es una forma común, pero mantiene html sin bloques de script innecesarios y se puede hacer durante el proceso de minificación si lo tiene.
Funciona así:
ajaxmin.exe test.js -RES:Strings resource.resx -o test.min.js
También tienes que hacer lo mismo para la configuración regional ech si tienes muchos. La sintaxis para escribir claves de recursos en js (y también en css) se escribe aquí:
Si no desea usar ASP.NET para generar su JavaScript principal, aquí hay otras dos opciones:
Utilice ASP.NET para generar un archivo de script que contenga asignaciones de cadena a variable, como
var mystring = ''my value'';
. Su secuencia de comandos principal luego haría referencia al texto localizado con nombres de variables en lugar de valores incrustados. Si eso todavía es demasiado "sucio" para usted, puede codificar las cadenas como JSON en lugar de como asignaciones variables, utilizando unHttpHandler
lugar de.aspx
directo.Haga que su código JavaScript emita una llamada Ajax para recuperar una matriz o lista de cadenas localizadas del servidor. La parte de la llamada del lado del servidor recuperaría el texto de sus archivos resx.
Siempre separa la funcionalidad de las cadenas legibles por humanos.
Si está creando jQuery-plugins, debería poder pasar una matriz de cadenas localizadas como parámetro cuando llame a sus diferentes funciones de jQuery. La matriz se podría definir como javascript en línea directamente en la página que llama a los diferentes complementos de jQuery o puede cargar el recurso externo en el formato /scripts/localization/strings.js?ci=en-US
y registrar un controlador ASP.Net genérico en web.config que respondería a scripts/localization/strings.js
El control DatePicker es un buen ejemplo de cómo localizar texto para el control jQuery datepick: este archivo js se crea dinámicamente a partir de archivos de recursos (resx) y cuando se incluye en una página, se asegurará de que el control de calendario tenga texto en danés.