Как установить форматы даты и культуру в основных страницах бритвы asp.net 2.2 - PullRequest
0 голосов
/ 25 июня 2019

Я использую приложение Asp.Net Core 2.2 Razor Pages.Я хочу установить культуру приложения и форматы даты на уровне приложения.Поэтому после некоторого поиска в Google я добавил следующий код в методе ConfigureServices в Startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            // setting the application culture to en-US with MM/dd/yyyy short date pattern.
            var culture = CultureInfo.CreateSpecificCulture("en-US");
            var dateformat = new DateTimeFormatInfo { ShortDatePattern = "MM/dd/yyyy", LongDatePattern = "MM/dd/yyyy hh:mm:ss tt" };
            culture.DateTimeFormat = dateformat;
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;

Но, похоже, это не работает.Я получаю дату в неправильном формате.Например, DateTime.Now.ToShortDateString() возвращает 6/25/2019 вместо 06/25/2019 .Та же проблема с DateTime.Now.ToLongDateString()

И если я изменю формат на «дд / мм / гггг», он вернет дату в 25/06/2019 ??

Я использую это в своей локальной среде разработки.Кроме того, я ожидаю, что мое приложение получит даты в том же формате, который я установил выше, в любой среде, на любой машине, в любой культуре.

Пожалуйста, помогите мне и подскажите, где я ошибаюсь.

Заранее спасибо !!

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Здесь есть два вопроса:

  1. Как правильно локализовать веб-приложение и
  2. Как использовать собственную культуру?

ASP.NET Core и ASP.NET предлагают свои собственные функции глобализации и локализации, которые работают на нескольких уровнях (приложение, страница, запрос). Вам следует проверить Глобализация и локализация в ASP.NET Core , чтобы понять, как эти функции работают в ASP.NET Core. Как и все остальное, услуги предоставляются через промежуточное ПО.

Об этом тоже есть много постов в блоге. Я выбрал это из-за названия Интернационализация - ASP.NET Core: от 0 до избыточного . Это объясняет то же самое, что и документы, в более сжатой форме.

Для вашего конкретного вопроса все, что нужно, это установить культуру для каждого запроса. Это можно сделать с помощью метода локализации промежуточного программного обеспечения UseRequestLocalization .

В Configure(IApplicationBuilder, IWebHostEnvironment) файла Startup.cs, прямо перед app.UseStaticFiles(), вы можете добавить вызов к UseRequestLocalization, чтобы указать культуры:

var supportedCultures = new[]
{
   new CultureInfo("ru-RU"),                

};

app.UseRequestLocalization(new RequestLocalizationOptions{
    DefaultRequestCulture = new RequestCulture("ru-RU"),
    SupportedCultures=supportedCultures,
    SupportedUICultures=supportedCultures
});

Я выбрал ru-RU, потому что он использует точку для разделителя даты. Ввод

@DateTime.Today.ToString()

на странице Razor это производит

25.06.2019 0:00:00

Вы также можете передать свою собственную культуру UseRequestLocalization. Используя эту пользовательскую культуру:

var culture = CultureInfo.CreateSpecificCulture("en-US");
var dateformat = new DateTimeFormatInfo { 
    ShortDatePattern = "MM/dd/yyyy", 
    LongDatePattern = "MM/dd/yyyy hh:mm:ss tt" 
};
culture.DateTimeFormat = dateformat;

var supportedCultures = new[]
{
    culture
};

app.UseRequestLocalization(new RequestLocalizationOptions{
    DefaultRequestCulture = new RequestCulture(culture),
    SupportedCultures=supportedCultures,
    SupportedUICultures=supportedCultures
});

Производит:

06/25/2019 00:00:00
1 голос
/ 25 июня 2019

Ваш WebApplication использует несколько потоков, если вы установите CurrentCulture или CurrentUICulture вашего текущего потока, другие могут отличаться.

Попробуйте использовать DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture:

CultureInfo.DefaultThreadCurrentUICulture = culture;
CultureInfo.DefaultThreadCurrentCulture = culture;
...