2012-02-06 19 views
7

Estoy trabajando en una aplicación SL5 con C# y estoy buscando internacionalizarla. Encontré lo siguiente para establecer la cultura de UI:Cómo configurar Silverlight CurrentUICulture/CurrentCulture correctamente?

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

Algunos controles como DatePicker parecen recoger esto. Si formateo cualquier fecha y hora usando la cadena de formato 'd', igual obtengo el formato predeterminado "M/dd/aaaa".

Exactamente cómo SL interpreta la cultura y cómo puedo configurarla correctamente para toda la aplicación?

Gracias

UPDATE:

encontrado la respuesta:

En primer lugar, establecer los cultivos apropiados en el Application_Startup:

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

El elemento clave sin embargo es agregue lo siguiente para forzar la cultura/idioma de RootVisual:

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

Respuesta

10

Editar: Actualizado con la información que @Rumble encontró.

Tiene que hacerlo así para aplicarlo a sus objetos de IU también.

Primero configure los cultivos adecuados cuando la aplicación se esté cargando.

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

continuación, tiene que establecer la propiedad lenguaje XML.

para Silverlight

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

para WPF

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

Usted puede encontrar una explicación para WPF here.

+0

En primer lugar, gracias por la respuesta rápida. En SL5, parece que no existe el método 'OverrideMetadata'. CurrentCulture tampoco contiene una propiedad 'IetfLanguageTag' ... – rumblefx0

+0

Me pusiste en la dirección correcta, ¡gracias! – rumblefx0

+1

Parece que lo tienes ordenado. Actualicé mi respuesta con la información que encontraste. – eandersson

1

Gracias a eandersson Vine con esta extensión para controles específicos. Tuve un problema con mi entrada decimal, análisis y validación. En algún lugar del camino había esta InvariantCulture con '.' como separador en lugar de ','. Se puede modificar fácilmente para configurar una cultura específica.

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

en XAML:

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