Index: e-util/e-util.c
===================================================================
--- e-util/e-util.c	(revision 34609)
+++ e-util/e-util.c	(working copy)
@@ -547,6 +547,102 @@ e_utf8_strftime_fix_am_pm (gchar *str, g
 }
 
 /**
+ * e_get_month_name:
+ * @month: month index
+ * @abbreviated: if %TRUE, abbreviate the month name
+ *
+ * Returns the localized name for @month.  If @abbreviated is %TRUE,
+ * returns the locale's abbreviated month name.
+ *
+ * Returns: localized month name
+ **/
+const gchar *
+e_get_month_name (GDateMonth month,
+                  gboolean abbreviated)
+{
+	/* Make the indices correspond to the enum values. */
+	static const gchar *abbr_names[G_DATE_DECEMBER + 1];
+	static const gchar *full_names[G_DATE_DECEMBER + 1];
+	static gboolean first_time = TRUE;
+
+	g_return_val_if_fail (month >= G_DATE_JANUARY, NULL);
+	g_return_val_if_fail (month <= G_DATE_DECEMBER, NULL);
+
+	if (G_UNLIKELY (first_time)) {
+		gchar buffer[256];
+		GDateMonth ii;
+		GDate date;
+
+		memset (abbr_names, 0, sizeof (abbr_names));
+		memset (full_names, 0, sizeof (full_names));
+
+		/* First Julian day was in January. */
+		g_date_set_julian (&date, 1);
+		g_assert (g_date_get_month (&date) == G_DATE_JANUARY);
+
+		for (ii = G_DATE_JANUARY; ii <= G_DATE_DECEMBER; ii++) {
+			g_date_strftime (buffer, sizeof (buffer), "%b", &date);
+			abbr_names[ii] = g_intern_string (buffer);
+			g_date_strftime (buffer, sizeof (buffer), "%B", &date);
+			full_names[ii] = g_intern_string (buffer);
+			g_date_add_months (&date, 1);
+		}
+
+		first_time = FALSE;
+	}
+
+	return abbreviated ? abbr_names[month] : full_names[month];
+}
+
+/**
+ * e_get_weekday_name:
+ * @weekday: weekday index
+ * @abbreviated: if %TRUE, abbreviate the weekday name
+ *
+ * Returns the localized name for @weekday.  If @abbreviated is %TRUE,
+ * returns the locale's abbreviated weekday name.
+ *
+ * Returns: localized weekday name
+ **/
+const gchar *
+e_get_weekday_name (GDateWeekday weekday,
+                    gboolean abbreviated)
+{
+	/* Make the indices correspond to the enum values. */
+	static const gchar *abbr_names[G_DATE_SUNDAY + 1];
+	static const gchar *full_names[G_DATE_SUNDAY + 1];
+	static gboolean first_time = TRUE;
+
+	g_return_val_if_fail (weekday >= G_DATE_MONDAY, NULL);
+	g_return_val_if_fail (weekday <= G_DATE_SUNDAY, NULL);
+
+	if (G_UNLIKELY (first_time)) {
+		gchar buffer[256];
+		GDateWeekday ii;
+		GDate date;
+
+		memset (abbr_names, 0, sizeof (abbr_names));
+		memset (full_names, 0, sizeof (full_names));
+
+		/* First Julian day was a Monday. */
+		g_date_set_julian (&date, 1);
+		g_assert (g_date_get_weekday (&date) == G_DATE_MONDAY);
+
+		for (ii = G_DATE_MONDAY; ii <= G_DATE_SUNDAY; ii++) {
+			g_date_strftime (buffer, sizeof (buffer), "%a", &date);
+			abbr_names[ii] = g_intern_string (buffer);
+			g_date_strftime (buffer, sizeof (buffer), "%A", &date);
+			full_names[ii] = g_intern_string (buffer);
+			g_date_add_days (&date, 1);
+		}
+
+		first_time = FALSE;
+	}
+
+	return abbreviated ? abbr_names[weekday] : full_names[weekday];
+}
+
+/**
  * e_flexible_strtod:
  * @nptr:    the string to convert to a numeric value.
  * @endptr:  if non-NULL, it returns the character after
Index: e-util/e-util.h
===================================================================
--- e-util/e-util.h	(revision 34609)
+++ e-util/e-util.h	(working copy)
@@ -82,6 +82,10 @@ gsize		e_utf8_strftime_fix_am_pm	(gchar 
 						 gsize max,
 						 const gchar *fmt,
 						 const struct tm *tm);
+const gchar *	e_get_month_name		(GDateMonth month,
+						 gboolean abbreviated);
+const gchar *	e_get_weekday_name		(GDateWeekday weekday,
+						 gboolean abbreviated);
 
 /* String to/from double conversion functions */
 gdouble		e_flexible_strtod		(const gchar *nptr,
Index: widgets/misc/e-calendar-item.c
===================================================================
--- widgets/misc/e-calendar-item.c	(revision 34609)
+++ widgets/misc/e-calendar-item.c	(working copy)
@@ -411,10 +411,6 @@ e_calendar_item_init (ECalendarItem *cal
 	calitem->time_callback_data = NULL;
 	calitem->time_callback_destroy = NULL;
 
-	/* Translators: These are the first characters of each day of the
-	   week, 'M' for 'Monday', 'T' for Tuesday etc. */
-	calitem->days = _("MTWTFSS");
-
 	calitem->signal_emission_idle_id = 0;
 }
 
@@ -964,18 +960,11 @@ e_calendar_item_draw		(GnomeCanvasItem *
 static void
 layout_set_day_text (ECalendarItem *calitem, PangoLayout *layout, int day_index)
 {
-	char *day;
-	int char_size = 0;
-
-	day = g_utf8_offset_to_pointer (calitem->days, day_index);
-
-	/* we use strlen because we actually want to count bytes */
-	if (day_index == 6)
-		char_size = strlen (day);
-	else
-		char_size = strlen (day) - strlen (g_utf8_find_next_char (day, NULL));
+	const gchar *abbr_name;
 
-	pango_layout_set_text (layout, day, char_size);
+	/* day_index: 0 = Monday ... 6 = Sunday */
+	abbr_name = e_get_weekday_name (day_index + 1, TRUE);
+	pango_layout_set_text (layout, abbr_name, -1);
 }
 
 static void
@@ -1611,18 +1600,11 @@ e_calendar_item_draw		(GnomeCanvasItem *
 static void
 layout_set_day_text (ECalendarItem *calitem, PangoLayout *layout, int day_index)
 {
-	char *day;
-	int char_size = 0;
-
-	day = g_utf8_offset_to_pointer (calitem->days, day_index);
-
-	/* we use strlen because we actually want to count bytes */
-	if (day_index == 6)
-		char_size = strlen (day);
-	else
-		char_size = strlen (day) - strlen (g_utf8_find_next_char (day, NULL));
+	const gchar *abbr_name;
 
-	pango_layout_set_text (layout, day, char_size);
+	/* day_index: 0 = Monday ... 6 = Sunday */
+	abbr_name = e_get_weekday_name (day_index + 1, TRUE);
+	pango_layout_set_text (layout, abbr_name, -1);
 }
 
 static void
Index: widgets/misc/e-calendar-item.h
===================================================================
--- widgets/misc/e-calendar-item.h	(revision 34609)
+++ widgets/misc/e-calendar-item.h	(working copy)
@@ -216,9 +216,6 @@ struct _ECalendarItem
 	gint selection_real_start_month_offset;
 	gint selection_real_start_day;
 
-	/* The first character of each day of the week, e.g. 'MTWTFSS'. */
-	gchar *days;
-
 	/* Widths of the day characters. */
 	gint day_widths[7];
 
Index: calendar/gui/weekday-picker.c
===================================================================
--- calendar/gui/weekday-picker.c	(revision 34609)
+++ calendar/gui/weekday-picker.c	(working copy)
@@ -315,20 +315,12 @@ colorize_items (WeekdayPicker *wp)
 static char *
 get_day_text (int day_index)
 {
-	/* The first letter of each day of the week starting with Sunday */
-	const char *str = _("SMTWTFS");
-	char *day;
-	int char_size = 0;
-
-	day = g_utf8_offset_to_pointer (str, day_index);
-
-	/* we use strlen because we actually want to count bytes */
-	if (day_index == 6)
-		char_size = strlen (day);
-	else
-		char_size = strlen (day) - strlen (g_utf8_find_next_char (day, NULL));
+	GDateWeekday weekday;
 
-	return g_strndup (day, char_size);
+	/* Convert from tm_wday to GDateWeekday. */
+	weekday = (day_index == 0) ? G_DATE_SUNDAY : day_index;
+
+	return g_strdup (e_get_weekday_name (weekday, TRUE));
 }
 
 static void
Index: a11y/widgets/ea-calendar-item.c
===================================================================
--- a11y/widgets/ea-calendar-item.c	(revision 34609)
+++ a11y/widgets/ea-calendar-item.c	(working copy)
@@ -1119,8 +1119,7 @@ ea_calendar_item_get_column_label (EaCal
 	AtkGObjectAccessible *atk_gobj;
 	GObject *g_obj;
 	ECalendarItem *calitem;
-	gchar *week_char;
-	gint char_size;
+	const gchar *abbr_name;
 
 	g_return_val_if_fail (ea_calitem, FALSE);
 
@@ -1129,17 +1128,12 @@ ea_calendar_item_get_column_label (EaCal
 	if (!g_obj)
 		return FALSE;
 
+	/* Columns are 0 = Monday ... 6 = Sunday */
 	calitem = E_CALENDAR_ITEM (g_obj);
-	week_char = g_utf8_offset_to_pointer (calitem->days, column);
-	char_size = strlen (calitem->days) -
-		strlen (g_utf8_find_next_char (calitem->days, NULL));
-
-	if (week_char && char_size < buffer_size) {
-		memcpy (buffer, week_char, char_size);
-		buffer[char_size] = '\0';
-		return TRUE;
-	}
-	return FALSE;
+	abbr_name = e_get_weekday_name (column + 1, TRUE);
+	g_strlcpy (buffer, abbr_name, buffer_size);
+
+	return TRUE;
 }
 
 /* the coordinate the e-calendar canvas coord */
