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

Rob*_*ner 4 localization asp.net-core-mvc asp.net-core

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

这是我做的:在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"));
Run Code Online (Sandbox Code Playgroud)

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

但是,当我看到

HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;
Run Code Online (Sandbox Code Playgroud)

在一些控制器动作中,它的值是en-US而不是预期的de-CH.

然后我试图更改默认RequestCultureConfigureen-USde-DE现在,当我看着

HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;
Run Code Online (Sandbox Code Playgroud)

在我的控制器动作中,它具有值de-DE.

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

Jef*_*ata 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);
    });
}
Run Code Online (Sandbox Code Playgroud)

SupportedCultures属性的描述表示值null表示支持所有文化,这null是默认值,但测试表明不然,源代码如下:

/// <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 };
Run Code Online (Sandbox Code Playgroud)