2012-02-06 11 views
7

Sto lavorando su un'applicazione SL5 con C# e sto cercando di internazionalizzare esso. Ho trovato il seguente per impostare la cultura dell'interfaccia utente:Come impostare Silverlight CurrentUICulture/CurrentCulture correttamente?

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

Alcuni controlli come il DatePicker sembrano raccoglierlo. Se formatto qualsiasi datetime utilizzando la stringa di formato 'd', ho comunque il formato predefinito "M/gg/aaaa".

Esattamente come fa SL interpretare la cultura e come posso impostare correttamente per l'intera applicazione?

Grazie

UPDATE:

Trovato la risposta:

Innanzitutto, impostare le colture in Application_Startup:

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

L'elemento chiave è comunque di aggiungere la seguente per forzare il RootVisual cultura/lingua:

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

risposta

10

Modifica: aggiornato con le informazioni rilevate da @Rumble.

Hai bisogno di fare in questo modo per applicarlo agli oggetti dell'interfaccia utente pure.

Prima impostare le colture quando l'applicazione sta caricando in su.

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

Successivamente è necessario impostare la proprietà XML Language.

per Silverlight

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

per WPF

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

Si può trovare una spiegazione per WPF here.

+0

Prima di tutto, grazie per la risposta rapida. In SL5, sembra che non ci sia il metodo 'OverrideMetadata'. CurrentCulture inoltre non contiene una proprietà 'IetfLanguageTag' ... – rumblefx0

+0

Mi hai impostato nella giusta direzione, grazie! – rumblefx0

+1

Sembra che tu abbia risolto il problema. Ho aggiornato la mia risposta con le informazioni che hai trovato. – eandersson

1

Grazie a eandersson Mi è venuta in mente questa estensione per controlli specifici. Ho avuto un problema con il mio ingresso decimale, l'analisi e la validazione. Da qualche parte nel modo in cui c'era questa InvariantCulture con "." come separatore invece di ",". Può essere facilmente modificato per impostare una cultura specifica.

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

in XAML:

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