我尝试本地化我的ASP.NET 5 / MVC 6(RC1)项目。不幸的是,官方文档仍然缺失,所以我的实验主要基于this和this博客文章。
这就是我所做的:在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
以及默认RequestCulture
(en-US
)没有影响力。
然而,当我看到
HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;
在某些控制器操作中,其值为en-US
而不是预期的de-CH
。
然后我尝试将RequestCulture
中的默认Configure
从en-US
更改为de-DE
,现在当我查看
HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;
在我的控制器操作中,它的值为de-DE
。
所以问题是:为什么ASP.NET会回归到默认文化而不是使用我的de-CH
提供的文化CustomRequestCultureProvider
?
答案 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 };