Получение локализованных строк для значений DayOfWeek

Этот код не локализован:

Enum.GetNames(typeof(DayOfWeek))

Мне нужен метод, который возвращает список локализованных строк, начиная с произвольного DayOfWeek, который локализован, и я хочу использовать встроенные ресурсы для этого. Пока я придумал код ниже, но я чувствую, что это должно поддерживаться таким образом, чтобы он не выглядел как хак.

    public List<String> GetLocalizedDayOfWeekValues(DayOfWeek startDay = DayOfWeek.Sunday)
    {
        var days = new List<String>();
        DateTime date = DateTime.Today;

        while (date.DayOfWeek != startDay)
            date.AddDays(1);

        for (int i = 0; i < 7; i++)
            days.Add(date.ToString("dddd"));

         return days; 
    }

Знайте, как лучше это сделать, пожалуйста, поделитесь. Спасибо!

Ответ 1

Я думаю, что вы ищете DateTimeFormatInfo.DayNames. Пример кода:

using System;
using System.Globalization;

class Program
{
    public static void Main()
    {
        var french = new CultureInfo("FR-fr");
        var info = french.DateTimeFormat;
        foreach (var dayName in info.DayNames)
        {
            // dimanche, lundi etc
            Console.WriteLine(dayName);
        }
    }    
}

Ответ 2

Эти методы дадут вам список имен дней, по умолчанию для указанной культуры первый день недели:

public List<String> GetLocalizedDayOfWeekValues(CultureInfo culture)
{
    return GetLocalizedDayOfWeekValues(culture, culture.DateTimeFormat.FirstDayOfWeek);
}

public List<String> GetLocalizedDayOfWeekValues(CultureInfo culture, DayOfWeek startDay)
{
    string[] dayNames = culture.DateTimeFormat.DayNames;
    IEnumerable<string> query = dayNames
        .Skip((int) startDay)
        .Concat(
            dayNames.Take((int) startDay)
        );

    return query.ToList();
}

Сравнить...

List<string> dayNames = GetLocalizedDayOfWeekValues(new CultureInfo("fr-fr"));

... до...

List<string> dayNames = GetLocalizedDayOfWeekValues(new CultureInfo("fr-ca"));

Ответ 3

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

System.Threading.Threads.CurrentThread.CurrentCulture

Объект DateTimeFormatInfo для этой культуры легко извлекается, и вы можете использовать GetDayName:

DateTimeFormatInfo.CurrentInfo.GetDayName(dayOfWeek)

Однако, если вы используете парадигму CurrentUICulture/CurrentCulture, для получения только имени дня, CurrentUICulture более подходит. Вполне возможно, что CurrentCulture настроен на en-US для кого-то, живущего в Соединенных Штатах, но CurrentUICulture настроен на es-MX или es-US для кого-то, говорящего/читающего испанский. Dateformat должен использовать настройку культуры: mm/dd/yyyy, но для имен дней он должен использовать настройки UIculture: Lunes, Martes и т.д.

По этой причине я предлагаю использовать эту технику:

public String getLocalDayName( DayOfWeek dayOfweek) {
    var culture = System.Threading.Thread.CurrentThread.CurrentUICulture;
    var format = culture.DateTimeFormat;
    return format.GetDayName(dayOfweek);
}