【问题标题】:How to set Silverlight CurrentUICulture/CurrentCulture correctly?如何正确设置 Silverlight CurrentUICulture/CurrentCulture?
【发布时间】:2012-02-06 14:58:36
【问题描述】:

我正在使用 C# 开发一个 SL5 应用程序,并且希望将其国际化。我发现以下设置 UI 文化:

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

像 DatePicker 这样的一些控件似乎可以解决这个问题。如果我使用“d”格式字符串格式化任何日期时间,我仍然会得到默认格式“M/dd/yyyy”。

SL 究竟如何解释文化以及如何为整个应用程序正确设置它?

谢谢

更新:

找到答案:

首先,在 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);
}

【问题讨论】:

    标签: c# .net silverlight localization cultureinfo


    【解决方案1】:

    编辑:使用@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 的解释。

    【讨论】:

    • 首先,感谢您的快速答复。在 SL5 中,似乎没有 OverrideMetadata 方法。 CurrentCulture 也不包含IetfLanguageTag 属性...
    • 看起来你已经整理好了。我用你找到的信息更新了我的答案。
    【解决方案2】:

    感谢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" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      相关资源
      最近更新 更多