7

我一直在尝试按照microsoft 文档为我的 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("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);
}

这就是我在 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"]

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

  • 资源/视图/ControllerName/ViewName.en.resx
  • 资源/视图/ControllerName/ViewName.sl.resx
  • ...

无论我如何尝试改变文化,显示的字符串始终来自.en资源文件。有什么我想念的吗?还有什么我应该做的吗?看来我遇到的问题是设置语言。根据文档,您应该将cookie设置为Response.Cookies.Append,但我也尝试过CultureInfo.CurrentCultureas Thread.CurrentThread.CurentCultureis not awailable 。

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

4

3 回答 3

5

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

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

摘要:您可以Resource在 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());
});
于 2016-08-09T11:41:34.507 回答
1

我尝试了 i18n,当支持的文化与资源文件名中的文化匹配时,我的翻译就可以工作了

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

更改您的资源文件名

资源/视图/ControllerName/ViewName.sl.resx

特定语言文化

资源/视图/ControllerName/ViewName.sl-SI.resx

于 2016-08-09T05:57:20.560 回答
1

在@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}");
    });
}

我的资源结构喜欢:

{您的项目}/Resources/Views/{您的控制器}/ViewName.en-us.resx

于 2016-11-09T02:40:56.410 回答