visual tutorial studio net mvc bootstrap asp asp.net-mvc asp.net-core asp.net-core-mvc

asp.net mvc - tutorial - MVC 6: ¿Cómo usar los archivos RESX?



install asp net mvc visual studio 2017 (2)

Estoy tratando de migrar mi proyecto ASP.NET MVC 5 existente al proyecto MVC 6 vNext, aunque he podido superar y resolver la mayoría de los problemas, parece que no puedo encontrar documentación sobre cómo usar los archivos de recursos RESX para localización en MVC 6

Mis ViewModels están utilizando declaraciones como

[Required(ErrorMessageResourceType = typeof(Resources.MyProj.Messages), ErrorMessageResourceName = "FieldRequired")]

Esto funcionó bien en MVC 5 siempre y cuando el RESX se incluyera correctamente y los modificadores de acceso se hayan configurado correctamente, pero no parece funcionar en un proyecto vNext. ¿Alguien sabe cómo se puede usar RESX en los proyectos MVC 6 vNext?

Vi algunas publicaciones aquí y en el sitio central de GIT que dicen que la historia de localización para ASP.NET 5 / MVC 6 está completa, pero no puedo encontrar ninguna muestra decente donde se hayan usado las cadenas de recursos.

Usar el código de arriba me da un error.

Error CS0246 No se pudo encontrar el tipo o el nombre del espacio de nombres ''Recursos'' (¿falta una directiva de uso o una referencia de ensamblado?)

Edición: texto modificado para aclarar que estoy buscando la implementación de la localización en proyectos vNext (MVC 6), puedo hacer que funcione en MVC 5.

Edición 2: Tengo el bit de localización funcionando después de implementar la respuesta de Mohammed, pero ahora estoy atascado en un nuevo error.

Una vez que incluya

"Microsoft.AspNet.Localization": "1.0.0-beta7-10364", "Microsoft.Framework.Localization": "1.0.0-beta7-10364",

paquetes y agregue la siguiente línea en ConfigureServices en Startup.cs

services.AddMvcLocalization();

Recibo un nuevo error cuando se ejecuta el siguiente código.

public class HomeController : Controller { private readonly IHtmlLocalizer _localizer; public HomeController(IHtmlLocalizer<HomeController> localizer) { _localizer = localizer; } ....

Error

Se produjo una excepción no controlada al procesar la solicitud.

InvalidOperationException: no se puede resolver el servicio para el tipo ''Microsoft.Framework.Runtime.IApplicationEnvironment'' al intentar activar ''Microsoft.Framework.Localization.ResourceManagerStringLocalizerFactory''. Microsoft.Framework.DependencyInjection.ServiceLookup.Service.CreateCallSite (proveedor de ServiceProvider, ISet`1 callSiteChain)

No puedo averiguar si es una dependencia que falta o si hay un problema en el código

Edición 3:

A cualquiera que todavía esté buscando una solución. En este momento, puede usar el código en la respuesta de Muhammad Rehan Saee para obtener soporte de localización en su CSHTML. Sin embargo, la historia para habilitar la localización en los atributos de validación aún no está terminada (en el momento de esta edición: 08 / Sep / 2015) Eche un vistazo al problema en el sitio de GITHUB para mvc a continuación:

https://github.com/aspnet/Mvc/issues/2766#issuecomment-137192942

PD: Para arreglar la excepción InvalidOperationException hice lo siguiente

Tomando todas las dependencias como beta7- * y borrando todos los contenidos de mis paquetes C: / Users / .dnx / se eliminó el error.

Detalles sobre el tema que planteé:

https://github.com/aspnet/Mvc/issues/2893#issuecomment-127164729

Edición: 25 / diciembre / 2015

Esto finalmente está trabajando en MVC 6 ahora.

Escribí una rápida publicación de blog aquí: http://pratikvasani.github.io/archive/2015/12/25/MVC-6-localization-how-to/


Las cosas se han cambiado en mvc 6.0.0-rc1-final. Después de pasar por muchos otros foros, la configuración a continuación funcionará si alguien planea trabajar con los últimos cambios en la función de localización.

En startup.cs configure

public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization(); services.AddSingleton<IStringLocalizerFactory, CustomStringLocalizerFactory>(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var requestLocalizationOptions = new RequestLocalizationOptions { SupportedCultures = new List<CultureInfo>{ new CultureInfo("en-US"), new CultureInfo("fr-CH") }, SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-CH") } }; app.UseRequestLocalization(requestLocalizationOptions, new RequestCulture(new CultureInfo("en-US"))); }

y puede comenzar a usar IHtmlLocalizer en el controlador.

y puede probar con la cadena de consulta http://localhost:5000/Home/Contact?culture=fr-CH o cambiar la cultura en Chrome agregando el idioma preferido en "Configuración de idioma e ingreso"


Puede ver una muestra completa del proyecto ASP.NET MVC GitHub here . Al momento de escribir esto, este es un código muy nuevo y está sujeto a cambios. Necesita agregar lo siguiente en su inicio:

public class Startup { // Set up application services public void ConfigureServices(IServiceCollection services) { // Add MVC services to the services container services.AddMvc(); services.AddMvcLocalization(); // Adding TestStringLocalizerFactory since ResourceStringLocalizerFactory uses ResourceManager. DNX does // not support getting non-enu resources from ResourceManager yet. services.AddSingleton<IStringLocalizerFactory, TestStringLocalizerFactory>(); } public void Configure(IApplicationBuilder app) { app.UseCultureReplacer(); app.UseRequestLocalization(); // Add MVC to the request pipeline app.UseMvcWithDefaultRoute(); } }

El IStringLocalizerFactory parece usarse para crear instancias de IStringLocalizer partir de tipos resx. Luego puede usar el IStringLocalizer para obtener sus cadenas localizadas. Aquí está la interfaz completa ( LocalizedString es solo un par de valores de nombre):

/// <summary> /// Represents a service that provides localized strings. /// </summary> public interface IStringLocalizer { /// <summary> /// Gets the string resource with the given name. /// </summary> /// <param name="name">The name of the string resource.</param> /// <returns>The string resource as a <see cref="LocalizedString"/>.</returns> LocalizedString this[string name] { get; } /// <summary> /// Gets the string resource with the given name and formatted with the supplied arguments. /// </summary> /// <param name="name">The name of the string resource.</param> /// <param name="arguments">The values to format the string with.</param> /// <returns>The formatted string resource as a <see cref="LocalizedString"/>.</returns> LocalizedString this[string name, params object[] arguments] { get; } /// <summary> /// Gets all string resources. /// </summary> /// <param name="includeAncestorCultures"> /// A <see cref="System.Boolean"/> indicating whether to include /// strings from ancestor cultures. /// </param> /// <returns>The strings.</returns> IEnumerable<LocalizedString> GetAllStrings(bool includeAncestorCultures); /// <summary> /// Creates a new <see cref="ResourceManagerStringLocalizer"/> for a specific <see cref="CultureInfo"/>. /// </summary> /// <param name="culture">The <see cref="CultureInfo"/> to use.</param> /// <returns>A culture-specific <see cref="IStringLocalizer"/>.</returns> IStringLocalizer WithCulture(CultureInfo culture); }

Finalmente, puede inyectar el IStringLocalizer en su Controlador así ( IHtmlLocalizer<HomeController> cuenta que IHtmlLocalizer<HomeController> hereda de IStringLocalizer ):

public class HomeController : Controller { private readonly IHtmlLocalizer _localizer; public HomeController(IHtmlLocalizer<HomeController> localizer) { _localizer = localizer; } public IActionResult Index() { return View(); } public IActionResult Locpage() { ViewData["Message"] = _localizer["Learn More"]; return View(); } }