Skip to content

Commit 0bf9cb3

Browse files
author
Gabriel Gagnon-Mailhot
committed
Culture sensitive calendar.
1 parent 62e1e21 commit 0bf9cb3

File tree

5 files changed

+39
-25
lines changed

5 files changed

+39
-25
lines changed

MainDemo.Wpf/Pickers.xaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
</Binding>
3636
</DatePicker.SelectedDate>
3737
</DatePicker>
38+
<ComboBox Name="cboLocale" HorizontalAlignment="Left" Width="50" Margin="0 32 0 0"/>
39+
<DatePicker Name="LocaleDatePicker" Width="120" HorizontalAlignment="Left" Margin="0 16 0 0" materialDesign:HintAssist.Hint="Locale Date" />
40+
<DatePicker Name="LocaleDatePickerRTL" Width="120" HorizontalAlignment="Left" Margin="0 16 0 0" materialDesign:HintAssist.Hint="RTL Locale Date" FlowDirection="RightToLeft" />
3841
</StackPanel>
3942
<materialDesign:TimePicker Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Width="100" HorizontalAlignment="Left" Margin="0 16 0 0"
4043
Style="{StaticResource MaterialDesignFloatingHintTimePicker}"

MainDemo.Wpf/Pickers.xaml.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Globalization;
34
using System.Linq;
45
using System.Text;
56
using System.Threading.Tasks;
@@ -25,6 +26,33 @@ public Pickers()
2526
{
2627
InitializeComponent();
2728
FutureDatePicker.BlackoutDates.AddDatesInPast();
29+
LoadLocales();
30+
cboLocale.SelectionChanged += CboLocale_SelectionChanged;
31+
cboLocale.SelectedItem = "fr-CA";
32+
}
33+
34+
private void CboLocale_SelectionChanged(object sender, SelectionChangedEventArgs e)
35+
{
36+
var lang = System.Windows.Markup.XmlLanguage.GetLanguage(cboLocale.SelectedItem as string);
37+
LocaleDatePicker.Language = lang;
38+
LocaleDatePickerRTL.Language = lang;
39+
40+
//HACK: The calendar only refresh when we change the date
41+
LocaleDatePicker.DisplayDate = LocaleDatePicker.DisplayDate.AddDays(1);
42+
LocaleDatePicker.DisplayDate = LocaleDatePicker.DisplayDate.AddDays(-1);
43+
LocaleDatePickerRTL.DisplayDate = LocaleDatePicker.DisplayDate.AddDays(1);
44+
LocaleDatePickerRTL.DisplayDate = LocaleDatePicker.DisplayDate.AddDays(-1);
45+
}
46+
47+
private void LoadLocales()
48+
{
49+
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures).OrderBy(ci => ci.Name))
50+
{
51+
if (ci.Calendar is GregorianCalendar)
52+
{
53+
cboLocale.Items.Add(ci.Name);
54+
}
55+
}
2856
}
2957

3058
public void CalendarDialogOpenedEventHandler(object sender, DialogOpenedEventArgs eventArgs)

MaterialDesignThemes.Wpf/MaterialDateDisplay.cs

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,13 @@ namespace MaterialDesignThemes.Wpf
1818
{
1919
public class MaterialDateDisplay : Control
2020
{
21-
private readonly IDictionary<int, Action<string>> _setters;
22-
private readonly IDictionary<char, string> _formats = new Dictionary<char, string>
23-
{
24-
{'d', "dd"},
25-
{'m', "ddd, MMM"},
26-
{'y', "yyyy"}
27-
};
28-
2921
static MaterialDateDisplay()
3022
{
3123
DefaultStyleKeyProperty.OverrideMetadata(typeof(MaterialDateDisplay), new FrameworkPropertyMetadata(typeof(MaterialDateDisplay)));
3224
}
3325

3426
public MaterialDateDisplay()
3527
{
36-
_setters = new Dictionary<int, Action<string>>
37-
{
38-
{0, s => ComponentOneContent = s},
39-
{1, s => ComponentTwoContent = s},
40-
{2, s => ComponentThreeContent = s},
41-
};
4228
SetCurrentValue(DisplayDateProperty, DateTime.Now.Date);
4329
}
4430

@@ -115,15 +101,12 @@ public bool IsDayInFirstComponent
115101
//FrameworkElement.LanguageProperty.OverrideMetadata(typeof (Calendar), (PropertyMetadata) new FrameworkPropertyMetadata(new PropertyChangedCallback(Calendar.OnLanguageChanged)));
116102
private void UpdateComponents()
117103
{
118-
var dateTimeFormatInfo = CultureInfo.CurrentUICulture.GetDateFormat();
104+
var culture = Language.GetSpecificCulture();
105+
var dateTimeFormatInfo = culture.GetDateFormat();
119106

120-
foreach (var component in dateTimeFormatInfo.ShortDatePattern.Split(new[] {dateTimeFormatInfo.DateSeparator},
121-
StringSplitOptions.RemoveEmptyEntries).Select((s, index) => new {code = s.ToLower()[0], index}))
122-
{
123-
if (component.index == 0)
124-
IsDayInFirstComponent = component.code == 'd';
125-
_setters[component.index](DisplayDate.ToString(_formats[component.code], CultureInfo.CurrentUICulture).ToTitleCase());
126-
}
107+
ComponentOneContent = DisplayDate.ToString(dateTimeFormatInfo.MonthDayPattern.Replace("MMMM", "MMM"), culture).ToTitleCase(culture); //Day Month folowing culture order. We don't want the month to take too much space
108+
ComponentTwoContent = DisplayDate.ToString("ddd,", culture).ToTitleCase(culture); // Day of week first
109+
ComponentThreeContent = DisplayDate.ToString("yyyy", culture).ToTitleCase(culture); // Year always top
127110
}
128111

129112
/// <summary>

MaterialDesignThemes.Wpf/StringExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ namespace MaterialDesignThemes.Wpf
99
{
1010
internal static class StringExtensions
1111
{
12-
public static string ToTitleCase(this string text, string separator = " ")
12+
public static string ToTitleCase(this string text, CultureInfo culture, string separator = " ")
1313
{
14-
TextInfo textInfo = CultureInfo.CurrentUICulture.TextInfo;
14+
TextInfo textInfo = culture.TextInfo;
1515

1616
string lowerText = textInfo.ToLower(text);
1717
string[] words = lowerText.Split(new[] { separator }, StringSplitOptions.None);

MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Calendar.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@
421421
Grid.Row="1" Grid.Column="1"
422422
FontWeight="SemiBold"
423423
RenderTransformOrigin="0, 0.5"
424-
Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Calendar}}, Path=DisplayDate, ConverterCulture={x:Static globalization:CultureInfo.CurrentUICulture}, StringFormat=MMMM yyyy}">
424+
Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Calendar}}, Path=DisplayDate, StringFormat=MMMM yyyy}">
425425
<TextBlock.RenderTransform>
426426
<TranslateTransform X="0" Y="0"/>
427427
</TextBlock.RenderTransform>

0 commit comments

Comments
 (0)