2012-02-06 6 views
7

私はC#でSL5アプリケーションに取り組んでいます。私はそれを国際化しようとしています。Silverlight CurrentUulture/CurrentCultureを正しく設定する方法はありますか?

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

DatePickerのようないくつかのコントロールがこれを選択するように見えます。私が 'd'形式の文字列を使ってdatetimeをフォーマットすると、デフォルトの形式 "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言語プロパティを設定する必要があります。 WPF

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

については

シルバーについては

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

あなたは、WPF hereの説明を見つけることができます。

+0

まず、高速な答えてくれてありがとう。 SL5では、 'OverrideMetadata'メソッドがないようです。 CurrentCultureには 'IetfLanguageTag'プロパティも含まれていません... – rumblefx0

+0

あなたは正しい方向に私を止めてくれました! – rumblefx0

+1

ソートされているように見えます。あなたが見つけた情報で私の答えを更新しました。 – eandersson

1

eandersson のおかげで、私は特定のコントロールのためにこの拡張機能を思いついた。 小数点の入力、解析、検証に問題がありました。途中で、この不変の文化が「。」であった。 '、'の代わりに区切り記号として。 特定の培養物を設定するために簡単に修正することができます。 XAMLで

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

:すべての

<TextBox Text="{Binding Path=DecimalValue, Mode=TwoWay}" 
         tools:ElementCultureExtension.ForceCurrentCulture="True" /> 
関連する問題