
Per rendere multilingua l’interfaccia del nostro plug-in dobbiamo aggiungere al progetto Silverlight dei File di risorse contenenti le traduzioni di tutti i testi che vogliamo visualizzare.
Per localizzazione non si intende la traduzione automatica di tutti i messaggi dell’applicazione, bensì semplicemente la traduzione di tutti i testi visibili nei controlli. La traduzione dei messaggi di validazione la vedremo in un prossimo post. 
Creiamo un nuova applicazione Silverlight:

Creiamo il nostro controllo:

<Grid x:Name="LayoutRoot" Background="White">
<sdk:Label Margin="25,24,0,0" Name="Label1" Content="Label1" HorizontalContentAlignment="Center" HorizontalAlignment="Left" Width="55" Height="23" VerticalAlignment="Top" d:LayoutOverrides="VerticalAlignment" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="84,20,0,0" Name="TextBox1" VerticalAlignment="Top" Width="120" HorizontalContentAlignment="Center" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="84,49,0,0" Name="Button1" VerticalAlignment="Top" Width="120" HorizontalContentAlignment="Center" />
</Grid>
Andiamo ad impostare le culture (CultureInfo) che il nostro plug-in potrà identificare. Per farlo dobbiamo modificare il file di progetto. Scarichiamo il progetto e andiamo a modificarne il file .vbproj:


Identifichiamo il tag <SupportedCultures>
<SupportedCultures>it</SupportedCultures>
ed aggiungiamoci le lingue desiderate:
<SupportedCultures>it;en;en-US;fr;</SupportedCultures>
In questo caso, oltre che all’italiano, abbiamo aggiunto l’inglese (en), l’inglese americano (en-US), ed il francese (fr).
Salviamo il file e ricarichiamo il progetto:

Aggiungiamo un file di risorse in cui andremo ad inserire tutte le descrizioni che vogliamo visualizzare nelle varie lingue. In Esplora Soluzioni clicchiamo col tasto destro sul nome del progetto (o in una cartella specifica), selezioniamo Aggiungi=>Nuovo elemento… ed aggiungiamo un File di risorse:

Apriamo il file di risorse cliccandoci sopra due volte:

Inseriamo due nuovi valori stringa che si riferiscono rispettivamente al testo dell’etichetta ‘Label1’ ed al testo del pulsante ‘Button1’.
Stiamo impostando i valori per la lingua di default, ossia l’italiano, quindi i valori delle stringhe dovranno essere in italiano.
Impostare come Public i marcatori d’accesso di ogni risorsa.
A questo punto è necessario crearsi una classe che ci permetta di accedere alle risorse tramite il DataBinding dei controlli.

Public Class myLocalization
' Wrapper per le risorse.
Public ReadOnly Property Risorse_MainPage() As My.Resources.MainPage
Get
Return New My.Resources.MainPage
End Get
End Property
End Class
NB: se nel file delle risorse non avessimo impostato i marcatori su Public, non avremmo potuto accedervi dalla nostra classe.
Referenziamo la nostra classe all’interno del nostro plug-in importando il relativo namespace (nell’esempio lo contrassegniamo col suffisso ’my’):
<UserControl x:Class="myLocalization.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:my="clr-namespace:myLocalization"
Inseriamo la nostra classe nelle risorse statiche (StaticResource) dell’UserControl Silverlight:
<UserControl.Resources>
<my:myLocalization x:Key="myWrapperLocalization"/> <!--Imposta nelle risorse la classe per la localizzazione.-->
</UserControl.Resources>
A questo punto la nostra classe (che è esposta col nome ‘myWrapperLocalization’) è accessibile da tutti i controlli contenuti all’interno dell’UserControl.
Impostiamo il binding dei controlli interessati:
- Label1 => Content
- Button1 => Content

Origine (Source):

Percorso (Path):

Questo è il risultato in XAML:
<Button Content="{Binding Path=Risorse_MainPage.Button1, Source={StaticResource myWrapperLocalization}}"
Una volta impostati il binding è possibile notare che nel design i controlli hanno già recuperato i valori della lingua di default:

Adesso creiamo le risorse per tutte le altre lingue che ci interessano. Copiare/Incollare il file di risorsa (.resx) che abbiamo utilizzato per la lingua di default (MainPage.resx) e traduciamo ogni singolo valore:

Rinominiamo la nostra risorsa appena tradotta in ‘MainPage.en.resex’.

In questo modo abbiamo creato un file di risorse per la lingua inglese.
Modifichiamo i valori delle risorse all’interno di questo file stando attenti a NON MODIFICARE le relative chiavi identificative (Nome):
Il motore delle risorse segue un ordine ben preciso nel leggere i file .resex riferiti alle culture: per primo legge il file contenente la lingua specifica, ossia quello denominato ‘nomefile.[cultura-lingua].resex’ => MainPage.en-US.resex (in questo caso l’inglese americano), se eventualmente non dovesse trovare questo file, allora legge quello riferito alla cultura generica (detta neutrale) ‘nomefile.[cultura].resex’ => MainPage.en.resex . Nel caso poi non dovesse trovare neppure il file con la cultura generica, il motore andrà a leggere il file con la lingua di default MainPage.resex .
Questa lettura gerarchica ci permette di scrivere la maggior parte delle voci multilingue nei file .resex relativi alle lingue generiche. Solo nei casi particolari si dovranno specificare le stesse voci nei file delle lingue specifiche.
Crearsi tutti i file desiderati ricordandosi di rinominare correttamente ognuno dei file .resx:

Di default Silverlight legge la lingua del sistema operativo, quindi per testare il progetto dobbiamo apportare alcune modifiche.
Possiamo testare la nostra applicazione in due modi:
- forzare da codice la lingua del plug-in;
- impostare la lingua del plug-in tramite la pagina web che lo ospita.
Il modo più semplice è quello di forzare la lingua del plug-in nel suo evento Application_Startup:
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
' Forza la lingua.
System.Threading.Thread.CurrentThread.CurrentUICulture = New Globalization.CultureInfo("fr")
Me.RootVisual = New MainPage()
End Sub
Il nostro controllo in francese:

Per impostare la lingua dalla pagina web che ospita il controllo vi rimando al post ASP.NET: passare dinamicamente un valore (o un insieme di valori) a Silverlight.
In questo modo sarà possibile testare la nostra applicazione Silverlight cambiando le impostazioni della lingua direttamente dal nostro browser:


