telefonica movistar activar javascript .net localization resx

javascript - activar - netflix movistar



Localizar cadenas en Javascript (12)

Actualmente estoy usando archivos .resx para administrar mis recursos del lado del servidor para .NET.

la aplicación con la que estoy tratando también permite a los desarrolladores agregar JavaScript en varios manejadores de eventos para la validación del lado del cliente, etc. ¿Cuál es la mejor manera para que yo localice mis cadenas y mensajes de JavaScript?

Idealmente, me gustaría almacenar las cadenas en los archivos .resx para mantenerlos con el resto de los recursos localizados.

Estoy abierto a sugerencias.


Ampliando la respuesta de diodeus.myopenid.com: Haga que su código escriba un archivo que contenga una matriz JS con todas las cadenas necesarias, luego cargue el archivo / script apropiado antes que el otro código JS.


Bueno, creo que puedes considerar esto. Ejemplo inglés-español:

Escribe 2 scripts Js, así:

en-GB.js lang = { date_message: ''The start date is incorrect'', ... }; es-ES.js lang = { date_message: ''Fecha de inicio incorrecta'', ... };

Lado del servidor - código detrás:

Protected Overrides Sub InitializeCulture() Dim sLang As String sLang = "es-ES" Me.Culture = sLang Me.UICulture = sLang Page.ClientScript.RegisterClientScriptInclude(sLang & ".js", "../Scripts/" & sLang & ".js") MyBase.InitializeCulture() End Sub

Donde sLang podría ser "en-GB", ya sabes, dependiendo de la selección del usuario actual ...

Llamadas de Javascript:

alert (lang.date_message);

Y funciona, muy fácil, creo.


Con un ensamblaje satélite (en lugar de un archivo resx) puede enumerar todas las cadenas en el servidor, donde conoce el idioma, generando así un objeto Javascript con solo las cadenas para el idioma correcto.

Algo así funciona para nosotros (código VB.NET):

Dim rm As New ResourceManager([resource name], [your assembly]) Dim rs As ResourceSet = rm.GetResourceSet(Thread.CurrentThread.CurrentCulture, True, True) For Each kvp As DictionaryEntry In rs [Write out kvp.Key and kvp.Value] Next

Sin embargo, lamentablemente no hemos encontrado una forma de hacer esto para los archivos .resx.


Después de buscar en Google mucho y no satisfecho con la mayoría de las soluciones presentadas, acabo de encontrar una solución increíble / genérica que utiliza plantillas T4 . La publicación completa de Jochen van Wylick se puede leer aquí:

Uso de T4 para localizar recursos de JavaScript basados ​​en archivos .resx

Las principales ventajas son:

  1. Tener solo 1 lugar donde se gestionan los recursos (es decir, los archivos .resx)
  2. Soporte para múltiples culturas
  3. Aproveche IntelliSense: permita completar el código

Desventajas:

Las deficiencias de esta solución son, por supuesto, que el tamaño del archivo .js puede llegar a ser bastante grande. Sin embargo, dado que el navegador lo almacena en caché, no lo consideramos un problema para nuestra aplicación. Sin embargo, este almacenamiento en caché también puede hacer que el navegador no encuentre el recurso llamado desde el código.

¿Cómo funciona esto?

Básicamente, definió una plantilla T4 que apunta a sus archivos .resx. Con un poco de código C # atraviesa cada cadena de recursos y la agrega a las propiedades de valor de clave pura de JavaScript que luego salen en un solo archivo de JavaScript llamado Resources.js (puede modificar los nombres si lo desea).

Plantilla T4 [cambie en consecuencia para que apunte a su ubicación de archivos .resx]

<#@ template language="C#" debug="false" hostspecific="true"#> <#@ assembly name="System.Windows.Forms" #> <#@ import namespace="System.Resources" #> <#@ import namespace="System.Collections" #> <#@ import namespace="System.IO" #> <#@ output extension=".js"#> <# var path = Path.GetDirectoryName(Host.TemplateFile) + "/../App_GlobalResources/"; var resourceNames = new string[1] { "Common" }; #> /** * Resources * --------- * This file is auto-generated by a tool * 2012 Jochen van Wylick **/ var Resources = { <# foreach (var name in resourceNames) { #> <#=name #>: {}, <# } #> }; <# foreach (var name in resourceNames) { var nlFile = Host.ResolvePath(path + name + ".nl.resx" ); var enFile = Host.ResolvePath(path + name + ".resx" ); ResXResourceSet nlResxSet = new ResXResourceSet(nlFile); ResXResourceSet enResxSet = new ResXResourceSet(enFile); #> <# foreach (DictionaryEntry item in nlResxSet) { #> Resources.<#=name#>.<#=item.Key.ToString()#> = { ''nl-NL'': ''<#= ("" + item.Value).Replace("/r/n", string.Empty).Replace("''","//'")#>'', ''en-GB'': ''<#= ("" + enResxSet.GetString(item.Key.ToString())).Replace("/r/n", string.Empty).Replace("''","//'")#>'' }; <# } #> <# } #>

En el lado de Forma / Vista

Para que se recoja la traducción correcta, agréguela a su maestro si está utilizando WebForms:

<script type="text/javascript"> var locale = ''<%= System.Threading.Thread.CurrentThread.CurrentCulture.Name %>''; </script> <script type="text/javascript" src="/Scripts/Resources.js"></script>

Si está utilizando ASP.NET MVC (como yo), puede hacer esto:

<script type="text/javascript"> // Setting Locale that will be used by JavaScript translations var locale = $("meta[name=''accept-language'']").attr("content"); </script> <script type="text/javascript" src="/Scripts/Resources.js"></script>

El ayudante de MetaAcceptLanguage que obtuve de esta impresionante publicación de Scott Hanselman:

Globalización, internacionalización y localización en ASP.NET MVC 3, JavaScript y jQuery - Parte 1

public static IHtmlString MetaAcceptLanguage<T>(this HtmlHelper<T> html) { var acceptLanguage = HttpUtility.HtmlAttributeEncode( Thread.CurrentThread.CurrentUICulture.ToString()); return new HtmlString( String.Format("<meta name=/"{0}/" content=/"{1}/">", "accept-language", acceptLanguage)); }

Úselo

var msg = Resources.Common.Greeting[locale]; alert(msg);


Hay una biblioteca para localizar aplicaciones JavaScript: https://github.com/wikimedia/jquery.i18n

Puede hacer reemplazo de parámetros, admite género (manejo inteligente), número (manejo inteligente en plural, incluidos los idiomas que tienen más de una forma plural) y reglas de gramática personalizadas que necesitan algunos idiomas.

Las cadenas se almacenan en archivos JSON.

El único requisito es jQuery.


Hice lo siguiente para localizar JavaScript para una aplicación móvil que ejecuta HTML5:

1.Created un conjunto de archivos de recursos para cada idioma llamándolos como "en.js" para inglés. Cada uno contenía las diferentes cadenas de la aplicación de la siguiente manera:

var localString = { appName: "your app name", message1: "blah blah" };

2.Utilizó Lazyload para cargar el archivo de recursos adecuado según el idioma de la aplicación: https://github.com/rgrove/lazyload

3. Pasar el código de idioma a través de una cadena de consulta (ya que estoy lanzando el archivo html desde Android usando PhoneGap)

4. Luego escribí el siguiente código para cargar dinámicamente el archivo de recursos adecuado:

var lang = getQueryString("language"); localization(lang); function localization(languageCode) { try { var defaultLang = "en"; var resourcesFolder = "values/"; if(!languageCode || languageCode.length == 0) languageCode = defaultLang; // var LOCALIZATION = null; LazyLoad.js(resourcesFolder + languageCode + ".js", function() { if( typeof LOCALIZATION == ''undefined'') { LazyLoad.js(resourcesFolder + defaultLang + ".js", function() { for(var propertyName in LOCALIZATION) { $("#" + propertyName).html(LOCALIZATION[propertyName]); } }); } else { for(var propertyName in LOCALIZATION) { $("#" + propertyName).html(LOCALIZATION[propertyName]); } } }); } catch (e) { errorEvent(e); } } function getQueryString(name) { name = name.replace(/[/[]/, "///[").replace(/[/]]/, "///]"); var regexS = "[//?&]" + name + "=([^]*)"; var regex = new RegExp(regexS); var results = regex.exec(window.location.href); if(results == null) return ""; else return decodeURIComponent(results[1].replace(//+/g, " ")); }

5.Desde el archivo html me refiero a las cadenas de la siguiente manera:

span id="appName"


Inspirado por SproutCore Puedes establecer propiedades de cadenas:

''Hello''.fr = ''Bonjour''; ''Hello''.es = ''Hola'';

y luego simplemente escupir la localización adecuada en función de su ubicación:

var locale = ''en''; alert( message[locale] );


JSGettext hace un excelente trabajo: carga dinámica de los archivos .po de GNU Gettext usando casi cualquier lenguaje en el back-end. Google para "localización de Javascript dinámico con Gettext y PHP" para encontrar un tutorial para JSGettext con PHP (publicaría el enlace, pero este sitio tonto no me deja, suspirar ...)

Editar : this debería ser el enlace


La forma de MSDN de hacerlo , básicamente es:

Crea un archivo de script separado para cada idioma y cultura admitidos. En cada archivo de script, incluye un objeto en formato JSON que contiene los valores de recursos localizados para ese idioma y cultura.

No puedo decirte la mejor solución para tu pregunta, pero en mi humilde opinión, esta es la peor forma de hacerlo. Al menos ahora sabes cómo NO hacerlo.


Un objeto JavaScript básico es una matriz asociativa, por lo que se puede usar fácilmente para almacenar pares clave / valor. Entonces, usando JSON , puedes crear un objeto para cada cadena que se localice así:

var localizedStrings={ confirmMessage:{ ''en/US'':''Are you sure?'', ''fr/FR'':''Est-ce que vous êtes certain?'', ... }, ... }

Entonces podrías obtener la versión local de cada cadena como esta:

var locale=''en/US''; var confirm=localizedStrings[''confirmMessage''][locale];


Utilizamos MVC y simplemente hemos creado una acción de controlador para devolver una cadena localizada. Mantenemos la cultura del usuario en sesión y establecemos la cultura del hilo antes de cualquier llamada para recuperar una cadena de idioma, AJAX o de otro modo. Esto significa que siempre devolvemos una cadena localizada.

Admito que no es el método más eficiente, pero rara vez se necesita obtener una cadena localizada en javascript ya que la mayoría de las localizaciones se realizan en nuestras vistas parciales.

Global.asax.cs

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) { if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState) { // Set the current thread''s culture var culture = (CultureInfo)Session["CultureInfo"]; if (culture != null) { Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; } } }

Acción del controlador

public string GetString(string key) { return Language.ResourceManager.GetString(key); }

Javascript

/* Retrieve a localized language string given a lookup key. Example use: var str = language.getString(''MyString''); */ var language = new function () { this.getString = function (key) { var retVal = ''''; $.ajax({ url: rootUrl + ''Language/GetString?key='' + key, async: false, success: function (results) { retVal = results; } }); return retVal; } };


Yo usaría una notación de objeto / matriz:

var phrases={}; phrases[''fatalError''] =''On no!'';

Luego puede intercambiar el archivo JS o usar una llamada Ajax para redefinir su lista de frases.