asp.net-core – ASP .NET Core 1.0 RTM本地化无法正常工作

我一直在努力为 microsofts documentation之后的asp .NET Core 1.0 RTM Web应用程序实现本地化,但我无法让它工作.我遇到的问题是,无论我如何尝试设置文化,它总是显示英语资源文件中的字符串.

如果有人有5分钟的时间,我会非常感激你的意见.

这是我关于本地化的Startup.cs内容

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("hr-HR")
      };
      var requestLocalizationoptions = new RequestLocalizationoptions
      {
         SupportedCultures = supportedCultures,SupportedUICultures = supportedCultures,DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"),new CultureInfo("en-US"))
       };
       app.UseRequestLocalization(requestLocalizationoptions);
}

这就是我在ActionFilter中改变OnActionExecuting内部文化的方式

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;

我也试过在我的控制器上做这个没有运气.

然后在我的视图中我使用@inject IViewLocalizer Localizer来显示带有@Localizer [“Name”]的本地化字符串.

我的resoucres位于Resources / Views / ControllerName文件夹中,如下所示:

> Resources / Views / ControllerName / ViewName.en.resx
> Resources / Views / ControllerName / ViewName.sl.resx
> ……

无论我如何尝试改变文化,显示的字符串始终来自.en资源文件.
有什么我想念的吗?还有什么我应该做的吗?看来我遇到的问题是设置语言.基于文档,您应该使用Response.Cookies.Append设置cookie,但我也尝试使用CultureInfo.CurrentCulture,因为Thread.CurrentThread.CurentCulture不再可用.

我真的不知道我错过了什么.有什么想法吗?

解决方法

您可能会遇到以下情况:
https://github.com/aspnet/Mvc/issues/4692

主要看一下评论https://github.com/aspnet/Mvc/issues/4692#issuecomment-223671462

简介:您可以在MVC中创建资源过滤器以解决此问题:

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());
});

相关文章

本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从...
基于 .NET 的一个全新的、好用的 PHP SDK + Runtime: Pe...
.NET 异步工作原理介绍。
引子 .NET 6 开始初步引入 PGO。PGO 即 Profile Guided Opti...
前言 2021/4/8 .NET 6 Preview 3 发布,这个版本的改进大多来...
前言 开头防杠:.NET 的基础库、语言、运行时团队从来都是相...