Как изменить язык вывода даты в c#

Рейтинг: 2Ответов: 2Опубликовано: 12.02.2023

Изучаю C# по книге Марка Прайса, C#9 и .NET 5.

Есть класс Person:

using static System.Console;

namespace Packt.Shared {
    public class Person
    {
        public string? Name;
        public DateTime DateOfBirth;
    }
}

Когда вывожу информацию о человеке:

var bob = new Person();
bob.Name = "Bob Smith";
bob.DateOfBirth = new DateTime(1965, 12, 22);

WriteLine(
    format: "{0} was born on {1:dddd, d MMMM yyyy}",
    arg0: bob.Name,
    arg1: bob.DateOfBirth
);

выводится немного неприятный вывод:

Bob Smith was born on среда, 22 декабря 1965

Мой вопрос состоит в том, как мне изменить язык вывода. Для примера: вывод должен выглядеть как-то так:

Bob Smith was born on Wensday, 22 December 1965

Надеюсь всё понятно, если нет, пишите в комментариях.

Ответы

▲ 5Принят

Нужно изменить культуру по умолчанию на Английский. Можно использовать инвариантную, так как она тоже "Английский".

Подключите неймспейс

using System.Globalization;

Добавьте в начало кода

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
▲ 1

Можно и явно указать CultureInfo.CurrentCulture = new CultureInfo("en-US");

Зависит от потребностей:

инвариантная культура

a) Если вы работаете с данными, которые не зависят от региона и должны быть представлены в едином формате, инвариантная культура — хороший выбор. Но она не поддерживает региональные различия в форматировании. С ней могут возникнуть непредвиденные сценарии. Как-то мне попался комментарий, который я позволю себе процитировать:

For those looking for the 5 second answer: CultureInfo.InvariantCulture means "I don't care, I don't want culture involved in the first place. Now let me use the dumb thing."

конкретная культура

b) Если ваши пользователи ожидают видеть данные в формате, соответствующем их региону, или если вы хотите точно настроить форматирование (например, для англоязычных пользователей в разных странах), используйте конкретные культуры.

я использую переводы, и там работает система CurrentCulture

можно скомбинировать со своей установленной культурой например вот как - Этот подход позволяет временно переключиться на нужную культуру для форматирования, а затем восстановить исходные настройки своей системы.

var bob = new Person();
bob.Name = "Bob Smith";     
bob.DateOfBirth = new DateTime(1965, 12, 22);

// Сохранение текущей культуры, чтоб потом в finally вернуть
CultureInfo originalCulture = CultureInfo.CurrentCulture;

try
{
    // Явная установка культуры на английский язык
    CultureInfo.CurrentCulture = new CultureInfo("en-US");

    WriteLine(
        format: "{0} was born on {1:dddd, d MMMM yyyy}",
        arg0: bob.Name,
        arg1: bob.DateOfBirth
    );
}
finally
{
    // Восстановление оригинальной культуры установленной на компьтере
    CultureInfo.CurrentCulture = originalCulture;
}

// Можно вывести данные в конце в исходной культуре. чтоб посмотреть результат
WriteLine("Current culture: " + CultureInfo.CurrentCulture.Name);

приведу вот какой базовый примитивный пример для перевода текста, чтоб Боб мог существовать на всех языках:

using System.Globalization;
using static System.Console;

public class Person
{
    public string? Name;
    public DateTime DateOfBirth;
}

// Используем enum для текстовой фразы
public enum TranslationKey
{
    WasBornOn 
}


class Program
{
    static void Main()
    {
        var bob = new Person();
        bob.Name = "Bob Smith";
        bob.DateOfBirth = new DateTime(1965, 12, 22);

        // Пример перевода
        string translatedText = Translate(TranslationKey.WasBornOn);

        WriteLine(
            format: "{0} {1} {2:dddd, d MMMM yyyy}",
            arg0: bob.Name,
            arg1: translatedText,
            arg2: bob.DateOfBirth
        );
    }

    static string Translate(TranslationKey key)
    {
        // Получение текущей культуры
        CultureInfo currentCulture = CultureInfo.CurrentCulture;

        // Пример перевода в зависимости от текущей культуры
        switch (currentCulture.Name)
        {
            case "fr-FR":
                if (key == TranslationKey.WasBornOn)
                    return "est né le";
                break;
            case "ru-RU":
                if (key == TranslationKey.WasBornOn)
                    return "родился";
                break;
                // Добавьте другие культуры по мере необходимости
        }

        // Если перевода для текущей культуры не найдено, возвращаем ключ как строку
        return key.ToString();
    }
}

Консоль

Bob Smith est né le mercredi, 22 décembre 1965