无法使用ASP.NET 5进行基本本地化

时间:2016-01-03 21:38:28

标签: localization asp.net-core asp.net-core-mvc

我尝试本地化我的ASP.NET 5 / MVC 6(RC1)项目。不幸的是,官方文档仍然缺失,所以我的实验主要基于thisthis博客文章。

这就是我所做的:在Configure(Startup.cs)我有

app.UseRequestLocalization(new RequestLocalizationOptions
{
    RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new CustomRequestCultureProvider(httpContext => Task.FromResult(new ProviderCultureResult("de-CH"))),
        new AcceptLanguageHeaderRequestCultureProvider()
    }
}, new RequestCulture("en-US"));

请注意,RequestCultureProviders列表中的第一个条目始终返回de-CH文化。所以我希望AcceptLanguageHeaderRequestCultureProvider以及默认RequestCultureen-US)没有影响力。

然而,当我看到

HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;

在某些控制器操作中,其值为en-US而不是预期的de-CH

然后我尝试将RequestCulture中的默认Configureen-US更改为de-DE,现在当我查看

HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;

在我的控制器操作中,它的值为de-DE

所以问题是:为什么ASP.NET会回归到默认文化而不是使用我的de-CH提供的文化CustomRequestCultureProvider

1 个答案:

答案 0 :(得分:5)

似乎您还必须在支持的文化列表中包含“de-CH”。例如,以下内容返回“de-CH”作为文化,但如果我注释掉设置SupportedCultures的行,则会显示“en-US”。在MVC应用程序中,您可能还必须设置SupportedUICultures

public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();

    var requestLocalizationOptions = new RequestLocalizationOptions
    {
        SupportedCultures = new List<CultureInfo>
        {
            new CultureInfo("en-US"),
            new CultureInfo("de-CH")
        },
        RequestCultureProviders = new List<IRequestCultureProvider>
        {
            new CustomRequestCultureProvider(httpContext => Task.FromResult(new ProviderCultureResult("de-CH"))),
            new AcceptLanguageHeaderRequestCultureProvider()
        }
    };

    app.UseRequestLocalization(requestLocalizationOptions, new RequestCulture("en-US"));

    app.Run(async (context) =>
    {
        var envName = context.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;

        await context.Response.WriteAsync("Hello World! " + envName);
    });
}

SupportedCultures属性的说明显示值null表示支持所有区域性,null是默认值,但测试另有说明,{{3} }:

/// <summary>
/// The cultures supported by the application. The <see cref="RequestLocalizationMiddleware"/> will only set
/// the current request culture to an entry in this list.
/// Defaults to <see cref="CultureInfo.CurrentCulture"/>.
/// </summary>
public IList<CultureInfo> SupportedCultures { get; set; } = new List<CultureInfo> { CultureInfo.CurrentCulture };