Как правильно установить Silverlight CurrentUICulture / CurrentCulture?

Я работаю над SL5-приложением с C #, и я стараюсь интернационализировать его. Для настройки культуры пользовательского интерфейса я нашел следующее:

var culture = new CultureInfo(Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName); Thread.CurrentThread.CurrentUICulture = culture; Thread.CurrentThread.CurrentCulture = culture; 

Некоторые элементы управления, такие как DatePicker, похоже, подбирают это. Если я форматирую какое-либо время datetime, используя строку формата ‘d’, я все равно получаю формат по умолчанию «M / dd / yyyy».

Каким образом SL интерпретирует культуру и как я могу правильно ее настроить для всего приложения?

Спасибо

ОБНОВИТЬ:

Нашел ответ:

Прежде всего, установите соответствующие культуры в Application_Startup:

 var culture = new CultureInfo("nl-BE"); Thread.CurrentThread.CurrentUICulture = culture; Thread.CurrentThread.CurrentCulture = culture; 

Ключевым элементом, однако, является добавление следующего, чтобы заставить культуру / язык RootVisual:

 var root = RootVisual as Page; if (root != null) { root.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name); } 

Изменить: Обновлено с информацией, найденной @Rumble.

Вам нужно сделать это так, чтобы применить его к своим объектам пользовательского интерфейса.

Сначала установите соответствующие культуры, когда приложение загружается.

 Thread.CurrentThread.CurrentCulture = new CultureInfo("en-IN"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN"); 

Затем вам нужно установить свойство XML Language.

Для Silverlight

 var root = RootVisual as Page; if (root != null) { root.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name); } 

Для WPF

 FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata( XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag))); 

Здесь вы можете найти объяснение WPF.

Благодаря eandersson я придумал это расширение для конкретных элементов управления. У меня была проблема с моим десятичным входом, parsingом и проверкой. Где-то там была эта InvariantCulture с ‘.’ как разделитель вместо ‘,’. Его можно легко модифицировать, чтобы настроить определенную культуру.

 public class ElementCultureExtension { public static bool GetForceCurrentCulture( DependencyObject obj ) { return (bool)obj.GetValue( ForceCurrentCultureProperty ); } public static void SetForceCurrentCulture( DependencyObject obj, bool value ) { obj.SetValue( ForceCurrentCultureProperty, value ); } public static readonly DependencyProperty ForceCurrentCultureProperty = DependencyProperty.RegisterAttached( "ForceCurrentCulture", typeof( bool ), typeof( ElementCultureExtension ), new PropertyMetadata( false, OnForceCurrentCulturePropertyChanged ) ); private static void OnForceCurrentCulturePropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e ) { var control = (FrameworkElement)d; if( (bool)e.NewValue ) { control.Language = XmlLanguage.GetLanguage( Thread.CurrentThread.CurrentCulture.Name ); } } } 

В Xaml: