2016-01-03 2 views
3

Я пытаюсь локализовать проект ASP.NET 5/MVC 6 (RC1). К сожалению, официальная документация по-прежнему отсутствует, поэтому я основывал свои эксперименты главным образом на сообщениях this и this.Не удается получить базовую локализацию для работы с ASP.NET 5

Вот что я сделал: В 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?

ответ

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 по умолчанию, но тестирование показывает, в противном случае, как это делает source:

/// <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 }; 
Смежные вопросы