mercoledì 30 novembre 2011 #

Silverlight: localizzazione delle risorse

image

 

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. Pensieroso

Creiamo un nuova applicazione Silverlight:

 

 

image

 

Creiamo il nostro controllo:

 

image

    <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:

 

image

 

image

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:

image

 

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:

image

Apriamo il file di risorse cliccandoci sopra due volte:

image

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.

 

image

 

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

image

Origine (Source):

image

Percorso (Path):

image

 

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:

image

 

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:

image

 

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

 

image

 

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:

image

 

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:

image

 

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:

image

 

image

 

image

 

posted @ mercoledì 30 novembre 2011 10.45 | Feedback (0)

Copyright © Andrea Zingoni

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski