mvc - La localización ASP.NET Core 1.0 RTM no funciona
render partial asp net core (3)
Edita en @Sim Haas.
Funciona bien
En mi caso: estoy usando LanguageViewLocationExpanderFormat.SubFolder
En ConfigureServices (servicios IServiceCollection)
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
services.AddMvc()
.AddViewLocalization(
Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.SubFolder,
opts => { opts.ResourcesPath = "Resources"; }
)
.AddDataAnnotationsLocalization();
services.Configure<RequestLocalizationOptions>(opts =>
{
var supportedCultures = new[]
{
new CultureInfo("en-AU"),
new CultureInfo("en-GB"),
new CultureInfo("en-US"),
new CultureInfo("en"),
new CultureInfo("zh-cn"),
new CultureInfo("zh"),
};
opts.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US");
opts.SupportedCultures = supportedCultures;
opts.SupportedUICultures = supportedCultures;
});
}
En Configure (aplicación IApplicationBuilder, IHostingEnvironment env, ILoggerFactory loggerFactory)
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseRequestLocalization();
app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}");
});
}
Mis recursos estucos como:
{Su proyecto} / Recursos / Vistas / {su controlador} / NombreView.en-us.resx
He estado tratando de implementar la localización para mi aplicación asp .NET Core 1.0 RTM siguiendo la documentación de microsofts y simplemente no puedo hacer que funcione. El problema que tengo es que siempre muestra cadenas del archivo de recursos en inglés, sin importar cómo intente configurar la cultura.
Si alguien tiene 5 minutos de su tiempo, estaría muy agradecido por su contribución.
Aquí está mi contenido de Startup.cs que se refiere a la localización:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.SubFolder)
.AddDataAnnotationsLocalization();
services.AddScoped<LocalizationFilter>();
services.AddLocalization(options => options.ResourcesPath = "Resources");
var supportedCultures = new List<CultureInfo>{
new CultureInfo("en-US"),
new CultureInfo("sl-SI"),
new CultureInfo("de-DE"),
new CultureInfo("hr-HR")
};
services.Configure<RequestLocalizationOptions>(options =>
{
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"),
new CultureInfo("en-US"));
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
...
var supportedCultures = new List<CultureInfo>{
new CultureInfo("en-US"),
new CultureInfo("sl-SI"),
new CultureInfo("de-DE"),
new CultureInfo("hr-HR")
};
var requestLocalizationOptions = new RequestLocalizationOptions
{
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures,
DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"),
new CultureInfo("en-US"))
};
app.UseRequestLocalization(requestLocalizationOptions);
}
Y así es como estoy cambiando la cultura dentro de OnActionExecuting en mi ActionFilter
actionContext.HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) });
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
También intenté hacer esto en mi controlador sin suerte.
Entonces, en mi opinión, estoy usando @inject IViewLocalizer Localizer
para mostrar cadenas localizadas con @Localizer["Name"]
.
Mis recursos están ubicados en la carpeta Resources / Views / ControllerName así:
- Recursos / Vistas / ControllerName / ViewName.en.resx
- Recursos / Vistas / ControllerName / ViewName.sl.resx
- ...
La cadena mostrada siempre es desde el archivo de recursos .en no importa cómo intente modificar la cultura. ¿Se me escapa algo? ¿Hay algo más que se supone que debo hacer? Parece que el problema que estoy teniendo es establecer el idioma. Según la documentación, se supone que debes configurar la cookie con Response.Cookies.Append
, pero también he intentado con CultureInfo.CurrentCulture
como Thread.CurrentThread.CurentCulture
ya no está disponible.
Realmente no sé lo que me estoy perdiendo. Alguna idea en absoluto?
Experimenté con i18n y conseguí que mis traducciones funcionaran cuando las culturas compatibles coincidían con las culturas en los nombres de los archivos de recursos.
var supportedCultures = new List<CultureInfo>{
new CultureInfo("en-US"),
new CultureInfo("sl-SI"),
new CultureInfo("de-DE"),
new CultureInfo("hr-HR")
};
Cambia los nombres de tus archivos de recursos de
Recursos / Vistas / ControllerName / ViewName.sl.resx
a la cultura del lenguaje específico
Recursos / Vistas / ControllerName / ViewName.sl-SI.resx
Probablemente esté pegando lo siguiente: https://github.com/aspnet/Mvc/issues/4692
Principalmente eche un vistazo al comentario: https://github.com/aspnet/Mvc/issues/4692#issuecomment-223671462
Resumen: puede crear un filtro de Resource
en MVC para solucionar el problema:
public class CultureSettingResourceFilter : IResourceFilter, IOrderedFilter
{
public int Order
{
get
{
return int.MinValue;
}
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
// By this time the response would already have been started, so do not try to modify the response
}
public void OnResourceExecuting(ResourceExecutingContext context)
{
var culture = httpContext.GetRouteValue("your-culture-key-name")?.ToString();
// set your culture here
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
}
services.AddMvc(o =>
{
o.Filters.Add(new CultureSettingResourceFilter());
});