Diversamente da quello che ci si aspetta, la localizzazione di uno UserControl (e quindi della stessa pagina) in Silverlight non segue strettamente la cultura che è stata impostata nel browser. In effetti se provate a effettuare il binding di un TextBlock su di una proprietà di tipo DataTime vi renderete conto immediatamente di uno strano comportamento, soprattutto se la lingua del browser è impostata su una cultura diversa da en-US:

   1: <TextBlock Text="{Binding Today}" />
   2:  
   3: ... si ottiene ...
   4:  
   5: 2/23/2009 8:20:53 PM

La data espressa in questo esempio è palesemente in formato anglosassone. Il motivo di questo comportamento è dovuto ad un valore di default che viene assegnato all'attributo xml:lang (corrispondente alla proprietà Language di FrameworkElement). Se infatti provate a scrivere un IValueConverter custom e a mettere un breakpoint nel metodo Convert() vi renderete rapidamente conto che il valore che arriva al metodo come CultureInfo è "en-US", indipendentemente dalla cultura che valorizza la proprietà CultureInfo.CurrentCulture.

La documentazione in proposito è piuttosto chiara:

The Language property will default to "en-US" if not otherwise set either through the property itself or through processing the xml:lang attribute.

Correggere questo comportamento è piuttosto semplice. E' sufficiente valorizzare la proprietà Language dello UserControl cui fa riferimento la pagina nel costruttore del controllo in questo modo:

   1: this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name);

In WPF c'è più o meno il medesimo problema che ha una soluzione un po' più elegante, dato che è possibile effettuare l'override dei metadati di una DependencyProperty. Con Silverlight 2.0 invece occorre settare esplicitamente tale valore in ogni UserControl.

 


Aggiungi Commento