I ran into the same problem and I would like to add my solution (based on @Rawling's answer)for completeness.
Since I needed the conversion in XAML I wrote the following converter.
As I didn't want to add months and days to the resources, the conversion goes from Invariant long (which I have in the "Tag" of the XAML element) to the short Current culture (needed in the "Content") and thus saves extra translations
I also created a converter for the weekdays along the same lines.
using System;
using System.Globalization;
using System.Windows.Data;
namespace Rittal.RiZone.GUI.ValueConverters
{
public class LongToShortMonthConverter : IValueConverter
{
/// <summary>
///
/// </summary>
/// <param name="value">Long month name from InvariantCulture</param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns>Short text representation of the month in CurrentCulture; null in case no match was found</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return null;
DateTime month;
return DateTime.TryParseExact(
value.ToString(),
"MMMM",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out month)
? month.ToString("MMM", CultureInfo.CurrentCulture)
: null;
}
/// <summary>
///
/// </summary>
/// <param name="value">Short month name from CurrentCulture</param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns>Long text representation of the month in InvariantCulture; null in case no match was found</returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return null;
DateTime month;
return DateTime.TryParseExact(
value.ToString(),
"MMM",
CultureInfo.CurrentCulture,
DateTimeStyles.None,
out month)
? month.ToString("MMMM", CultureInfo.InvariantCulture)
: null;
}
}
}