ASP .NET Core 1.0 RTM 本地化不工作

ASP .NET Core 1.0 RTM Localization not working

I've been trying to implement localization for my asp .NET Core 1.0 RTM web app following microsofts documentation and I just can not get it to work. The problem I'm having is that it's always displaying strings from the english resource file no matter how I try setting the culture.

If anyone has 5 minutes of their time, I'd be really grateful for your input.

Here's my Startup.cs content that regards the localization:

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

And this is how I'm changing the culture inside OnActionExecuting in my 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;

I've also tried doing this on my controller with no luck.

Then in my views I'm using @inject IViewLocalizer Localizer to display localized strings with @Localizer["Name"].

My resoucres are located in the folder Resources/Views/ControllerName like so:

The displayed string is always from the .en resource file no matter how I try to thange the culture. 有什么我想念的吗? Is there something more I'm supposed to do? It seems the problem I'm having is with setting the language. Based on the documentation you're just supposed to set the cookie with Response.Cookies.Append, but I've also tried with CultureInfo.CurrentCulture as Thread.CurrentThread.CurentCulture is not awailable anymore.

I really don't know what I'm missing. Any ideas at all?

我试验了 i18n,当支持的文化与资源文件名中的文化匹配时,我的翻译工作正常

var supportedCultures = new List<CultureInfo>{
     new CultureInfo("en-US"),
     new CultureInfo("sl-SI"),
     new CultureInfo("de-DE"),
     new CultureInfo("hr-HR")
  };

更改您的资源文件名

Resources/Views/ControllerName/ViewName.sl.resx

特定语言文化

Resources/Views/ControllerName/ViewName.sl-SI.resx

您可能遇到了以下问题: https://github.com/aspnet/Mvc/issues/4692

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

总结:您可以在 MVC 中创建一个 Resource 过滤器来解决该问题:

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

在@Siim Haas 上编辑。
效果不错。
就我而言:我使用 LanguageViewLocationExpanderFormat.SubFolder

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

配置时(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}");
    });
}

我的资源结构如下:

{Your Project}/Resources/Views/{your controller}/ViewName.en-us.resx