2008-12-19 15 views
18

Necesito ayuda con las mejores prácticas para localizar aplicaciones asp mvc, Vi que Oxite tenía un método base denominado Localize en el BaseController, pero ¿la localización es una tarea para la vista o el controlador? ¿O debería usar archivos resx/o usar tablas db?¿Práctica de localización ASP.NET MVC?

+0

este es un buen enfoque http://stackoverflow.com/questions/381070/asp-net-mvc-localization-best-practice/12936708#12936708 – kbvishnu

Respuesta

14

Crear su propio asistente de HTML y lo utilizan como <%= Html.Resource("Name") %>

Los detalles están en blog puesto.

+9

Para que todos lo sepan, los enlaces de Ihar posteriores ahora tienen un actualizar. Ver: http://blog.eworldui.net/post/2008/10/ASPNET-MVC-Simplified-Localization-via-ViewEngines.aspx –

+1

El enlace actualizado tampoco funciona. :( – bradjive

+0

¿Ya estoy usando una solución similar a esta, pero este tipo de solución no agrega una sobrecarga adicional en términos de rendimiento? – jsicary

0

Si la cadena a ser localizada es generada por la vista (por ejemplo, una etiqueta delante de un campo de texto), entonces su localización debe estar en la Vista.

Si la cadena es generada por el controlador, su localización debería estar allí también.

10

hay una buena solución para esto disponible here

este artículo cubre todos los aspectos de la localización asp.net mvc aplicación

3

MVC es realmente más sobre el uso de la visión correcta para el trabajo correcto. Poner todo en un archivo de recursos es extremadamente paintfull. Es bueno usar archivos de recursos para cosas pequeñas, pero para páginas más grandes como las páginas de descripción, es mejor tener una vista en cada cultura con mucho contenido. Por ejemplo, usando la siguiente estructura: ~/Views/es-US/Home/Index.aspx ~/Views/pt-BR/Home/Index.aspx o esta estructura: ~/Views/Home/Index.en -US.aspx ~/Vistas/Inicio/Index.en-US.aspx

leen el blog de cómo hacerlo: http://blog.oimae.com/2011/02/20/cultured-view-engine-for-mvc/

+1

¿Por qué el -1 en esta respuesta? Hay [varios] (http: // afana. me/post/aspnet-mvc-internationalization.aspx) [reputable] (http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx) [examples] (http://brianreiter.org/2011/03/23/ simple-asp-net-mvc-globalization-with-graceful-fallback /) de este patrón y cuando está indicado. El que responde aquí tiene un punto: administrar el contenido de texto grande en .resx agrega algo de fricción, y puede tener diseño o tamaño impacto en una visión en gran medida textual. Esta es una compensación fundamental, como se ilustra en los enlaces – mcw0933

+0

Por FAR la peor solución - nunca! Si necesita escalar a través de muchos idiomas y configuraciones regionales, esto se convierte en un gran desastre y es súper doloroso para el mantenimiento. Mejor enfoque es poner todo ff en un DB de localización, cargue el contenido requerido al inicio de la aplicación (no olvide un botón de actualización de caché en alguna página) + use algún tipo de interfaz/interfaz de navegador para editar las cadenas. Además, este sistema se adapta bien a un equipo de traductores y "mantenedores de contenido" (en su lugar, deberían estar al tanto de HTML/CSS/JS, al menos hasta un nivel en el que no destruyan cosas en el puntos de vista). – johngrinder

4

Desde esta una pregunta de un año y no sé el alcance de mi respuesta aquí. Recientemente me enfrenté a una situación como esta, es decir, necesito implementar la localización de diferentes idiomas en mi sitio de mvc.

Consideré usar el archivo Resource. es muy fácil de implementar, pero el problema es que durante la fase de desarrollo, necesitamos especificar las cadenas localizadas. Entonces, si es un soporte multilingüe, necesitamos crear el archivo de recursos para cada idioma. Si el cliente quiere cambiar o agregar un nuevo idioma, es muy difícil y debemos proporcionar una compilación.

En segundo lugar considero el Satelite Assemblies. También es similar a Resource, pero le da libertad para editar los ensamblajes y colocarlo nuevamente en la carpeta bin. Esto también requiere un gran esfuerzo para el cliente/desarrollador.

Tercero consideré almacenar en db. Este enfoque está bien y tenemos algún mecanismo para leer datos del servidor. Esto requiere un esfuerzo de una vez y el cliente no tiene ningún tipo de confianza.

puedo reemplazar una costumbre DisplayNameAttributre y desde el constructor pasaré DB y obtener los datos que hacen

Sobre la base de su requerimiento debe mostrar la vista en su caso.

Administrador de recursos

/// <summary> 
    /// Extended display attribute which will handles the request 
    /// It will call every time when the property is rendered (return View() - from controller) 
    /// </summary> 
    public class ResourceManagerAttribute : DisplayNameAttribute 
    { 
     public ResourceManagerAttribute(string resourceKey, string resourceNameSpace = "") 
      : base(GetDisplayName(resourceKey, resourceNameSpace)) 
     { } 

     private static string GetDisplayName(string resourceKey, string resourceNameSpace = "") 
     { 
      // get the browser's prefered language. 

      string browserLanguage = HttpContext.Current.Request.UserLanguages.First(); 

      // Get the locale data for that property and displays. 
      switch (browserLanguage) 
      { 
       case "en-US": return "Eng " + resourceKey; 
      // calls db based on resource key 
       case "hi": return "Hin " + resourceKey; 

      } 
      return "-- Not Implemented Now -- "; 
     } 

modelo de vista

public class HomeViewModel 
    { 
     //calls the resource 
     [ResourceManager("MID")] 
     public int MID { get; set; } 
     [ResourceManager("Name")] 
     public string Name { get; set; } 
     [ResourceManager("Addess")] 
     public string Addess { get; set; } 
    } 
0

Me gustaría ir mejor para la creación de un MetadataProvider costumbre y el uso de una convención para los modelos. Algo así como 1 archivo de recursos por espacio de nombres de modelo y una convención como ModelName.PropertyName -> value

Para validadores, botones comunes y un archivo de recursos.

Para las vistas de texto, en realidad estoy tratando de encontrar una buena manera. Tal vez un preprocesamiento de vista antes de la compilación y un Alcance personalizado para textos localizados, por lo que el preproceso puede crear el archivo de recursos para cada vista con el idioma predeterminado.

Cuestiones relacionadas