c# - istringlocalizer - Localización y anotaciones de datos. GlobalResourceProxyGenerator y PublicResxFileCodeGenerator
globalization and localization asp net core (1)
Esto se debe a que colocó su archivo de recursos dentro de la carpeta App_GlobalResources
que es una carpeta especial en ASP.NET. Esto debería funcionar si pones tu archivo de recursos en otro lugar. Esto también podría ser un proyecto completamente separado de su aplicación MVC de ASP.NET.
Aquí están los pasos que podría hacer este trabajo:
- Cree una nueva aplicación ASP.NET MVC 3 utilizando la plantilla de Internet predeterminada
- Agregue un archivo
~/Messages.resx
que contenga la cadena de recursosRegisterModel_ConfirmPasswordError
Establezca la herramienta personalizada en
PublicResXFileCodeGenerator
para este archivo de recursos:Añadir un modelo:
public class MyViewModel { [Compare("NewPassword", ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", ErrorMessageResourceType = typeof(MvcApplication1.Messages))] public string Password { get; set; } public string NewPassword { get; set; } }
Controlador:
public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel()); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } }
Ver:
@model MyViewModel @using (Html.BeginForm()) { <div> @Html.LabelFor(x => x.Password) @Html.EditorFor(x => x.Password) @Html.ValidationMessageFor(x => x.Password) </div> <div> @Html.LabelFor(x => x.NewPassword) @Html.EditorFor(x => x.NewPassword) @Html.ValidationMessageFor(x => x.NewPassword) </div> <button type="submit">OK</button> }
Entonces podrías comenzar a localizar proporcionando las respectivas traducciones:
- Mensajes.fr-FR.resx
- Messages.de-DE.resx
- Mensajes.it-IT.resx
- Messages.es-ES.resx
- ...
ACTUALIZAR:
Me preguntaron en la sección de comentarios qué tiene de especial la carpeta App_GlobalResources
y por qué no funciona con ella. Bueno, en realidad podrías hacerlo funcionar. Todo lo que necesita hacer es configurar la Build Action
Embedded Resource
. De forma predeterminada, cuando agrega un archivo a la carpeta App_GlobalResources
, Visual Studio lo configuró en Content
lo que significa que este recurso no se incorporará al ensamblado en tiempo de ejecución y ASP.NET MVC no puede encontrarlo:
¿Por qué los atributos DataAnnotation tienen dificultades para acceder a los recursos creados por PublicResxFileCodeGenerator?
Me parece que el siguiente atributo:
[Compare("NewPassword", ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", ErrorMessageResourceType = typeof(Resources.Global))]
No podrá encontrar el recurso si se ha creado con PublicResxFileCodeGenerator. Sin embargo, un recurso idéntico creado con GlobalResourceProxyGenerator funcionará correctamente. Ambos archivos de recursos se configuran en Contenido y viven en App_GlobalResources. He intentado poner el idioma predeterminado en App_LocalResources también pero parece que no hay diferencia. Mi prueba es que mi idioma secundario (GlobalResourceProxyGenerator) funciona pero mi idioma primario (PublicResxFileCodeGenerator) produce una excepción (no encuentra el archivo de recursos). Si cambio ambos a GlobalResourceProxyGenerator, entonces todo está bien (pero obviamente no hay acceso público).
¿Alguien sabe a que se debe esto? Me gustaría mover los recursos a otra asamblea en el futuro.