Получение локализованных строк для значений 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);
}