Как правильно установить Silverlight CurrentUICulture / CurrentCulture? - PullRequest
7 голосов
/ 06 февраля 2012

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

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

Некоторые элементы управления, такие как DatePicker, похоже, подхватили это. Если я форматирую дату и время, используя строку формата 'd', я все равно получаю формат по умолчанию "M / dd / yyyy".

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

Спасибо

UPDATE:

Нашел ответ:

Прежде всего, установите соответствующие культуры в 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);
}

Ответы [ 2 ]

10 голосов
/ 06 февраля 2012

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

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

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

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

Далее необходимо установить свойство языка XML.

Для 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 здесь .

1 голос
/ 08 сентября 2016

Благодаря Эандерссону Я придумал это расширение для конкретных элементов управления. У меня была проблема с моим десятичным вводом, анализом и проверкой. Где-то на пути была эта Инвариантная Культура с '.' в качестве разделителя вместо ','. Его можно легко модифицировать для настройки конкретной культуры.

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:

<TextBox Text="{Binding Path=DecimalValue, Mode=TwoWay}"
                         tools:ElementCultureExtension.ForceCurrentCulture="True" />
...