2012-02-06 10 views
7

Pracuję nad aplikacją SL5 z C# i zamierzam ją umiędzynarodowić. Znalazłem następujące ustawienia, aby ustawić kulturę interfejsu użytkownika:Jak poprawnie ustawić Silverlight CurrentUICulture/CurrentCulture?

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

Niektóre kontrolki, takie jak DatePicker, wydają się to odbierać. Jeśli sformatuję dowolną datę i godzinę za pomocą ciągu formatu "d", nadal otrzymuję domyślny format "M/dd/rrrr".

Dokładnie, w jaki sposób SL interpretuje kulturę i jak ustawić ją poprawnie dla całej aplikacji?

Dzięki

UPDATE:

znalazł odpowiedź:

Przede wszystkim należy ustawić odpowiednie kultur w Application_Startup:

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

Kluczowym elementem jest jednak, aby Dodaj następujące elementy, aby wymusić kulturę/język programu RootVisual:

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

Odpowiedz

10

Edytuj: Zaktualizowano z informacją, że @Rumble znaleziono.

Musisz zrobić to w ten sposób, aby zastosować go również do swoich obiektów interfejsu użytkownika.

Najpierw ustaw odpowiednie kultury podczas ładowania aplikacji.

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

Następnie należy ustawić właściwość Język XML.

dla Silverlight

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

dla WPF

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

można znaleźć wyjaśnienie dla WPF here.

+0

Przede wszystkim, dzięki za szybką odpowiedź. W SL5 wydaje się, że nie ma metody "OverrideMetadata". CurrentCulture również nie zawiera własności 'IetfLanguageTag' ... – rumblefx0

+0

Wyruszyłeś we właściwym kierunku, dzięki! – rumblefx0

+1

Wygląda na to, że masz to posortowane. Zaktualizowałem swoją odpowiedź, podając znalezione informacje. – eandersson

1

Dzięki eandersson wpadłem na to rozszerzenie do konkretnych kontroli. Wystąpił problem z wprowadzeniem dziesiętnym, analizą i sprawdzaniem poprawności. Gdzieś na drodze była ta InvariantCulture z "." jako separator zamiast ",". Można go łatwo modyfikować, aby skonfigurować określoną kulturę.

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); 
     } 
    } 
} 

w XAML:

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