Reputation: 2815
This code isn't localized:
Enum.GetNames(typeof(DayOfWeek))
I want a method that returns a list of localized strings, starting on an arbitrary DayOfWeek, that is localized, and I want to use the built in resources to do so. So far, I've come up with the below code, but I feel like this should be supported in an way that doesn't feel like a hack.
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;
}
Know of a better way of doing this, please share. Thanks!
Upvotes: 13
Views: 8147
Reputation: 9001
I'll throw this in. The original post appears to want the day names in the current language. This may come from the Culture set in:
System.Threading.Threads.CurrentThread.CurrentCulture
The DateTimeFormatInfo object for this culture is easily retrieve, and you can use GetDayName:
DateTimeFormatInfo.CurrentInfo.GetDayName(dayOfWeek)
However, if you utilize the CurrentUICulture/CurrentCulture paradigm, for getting just the day name, CurrentUICulture is more appropriate. It is entirely possible that the CurrentCulture is set to en-US for somebody living in the united states, but CurrentUICulture is set to es-MX or es-US for somebody speaking/reading spanish. The dateformat should use the culture setting: mm/dd/yyyy but for day names it should use the UIculture settings: Lunes, Martes, etc.
For this reason, I suggest using this technique:
public String getLocalDayName( DayOfWeek dayOfweek) {
var culture = System.Threading.Thread.CurrentThread.CurrentUICulture;
var format = culture.DateTimeFormat;
return format.GetDayName(dayOfweek);
}
Upvotes: 2
Reputation: 16606
These methods will give you a list of day names, defaulting to the specified culture's first day of the week:
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();
}
Compare...
List<string> dayNames = GetLocalizedDayOfWeekValues(new CultureInfo("fr-fr"));
...to...
List<string> dayNames = GetLocalizedDayOfWeekValues(new CultureInfo("fr-ca"));
Upvotes: 3
Reputation: 1500695
I think you're looking for DateTimeFormatInfo.DayNames
. Sample code:
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);
}
}
}
Upvotes: 29