2012-02-06 54 views
7

我正在與C#開發SL5應用程序,我正在尋求國際化。我發現以下設置UI文化:如何正確設置Silverlight CurrentUICulture/CurrentCulture?

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

回答

10

編輯:更新了@Rumble找到的信息。

你需要這樣做才能將它應用到你的UI對象中。

首先在應用程序加載時設置適當的文化。

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 here解釋。

+0

首先,感謝您的快速答覆。在SL5中,似乎沒有'OverrideMetadata'方法。 CurrentCulture也不包含'IetfLanguageTag'屬性... – rumblefx0 2012-02-06 15:18:15

+0

你讓我走向正確的方向,謝謝! – rumblefx0 2012-02-06 15:37:48

+1

看起來你已經排序。我用你找到的信息更新了我的答案。 – eandersson 2012-02-06 16:05:13

1

感謝eandersson 我想出了這個擴展的特定控件。 我有一個問題,我的小數輸入,解析和驗證。在某種程度上,這個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:

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