2012-02-06 65 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" />