Jeg fik et spørgsmål af min kollega Martin Pamdeth den anden dag, et spørgsmål han havde taget med hjem fra en kunde der skulle lave nogle prototyper i Silverlight. Spørgsmålet gik noget ala “Kan man understøtte flere sprog i en Silverlight applikation, og kan man gøre dette uden at indblande udviklere ?”. Det korte svar er ja, men det er ikke specielt effektivt. Den mest effektive måde ville være at lave en applikation med X antal sprog resourcer, men det vil selvfølgelig kræve en udvikler at sætte dette op.
Hvis du ikke kender til resource filer i .NET så er dette et meget godt sted at starte.
Lad os tage den fra toppen :)
I mit Silverlight 3 projekt har jeg oprettet en mappe ved navn Resx. I den ligger de resourcer filer jeg har tænkt mig at tage udgangspunkt i.

Første trick er at vi skal have sat vores resx filer til generere noget “public” kode for os.

Dernæst skal vi sørge for at den kode har en public constructor.

Så er vi faktisk klar til at bruge vores resourcer i vores applikation. Det kan gøre via XAML eller i kode. I dette eksempel gør vi det i XAML koden da det er en betyderligt sjovere øvelse.
Åben din App.xaml fil og få den til at se nogenlunde således ud:
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:y="clr-namespace:Localization.Resx"
x:Class="Localization.App">
<Application.Resources>
<y:Names x:Key="LocalNames" />
</Application.Resources>
</Application>
Det som sker er, at vi har tilføjet den resource klasse som er blevet genereret for os, i toppen af dokumentet.
Nu kan vi bruge de resourcer der ligger i Localization.Resx namespacet overalt i vores applikation, men for at kunne gøre dette, er vi nødt til at lave en nøgle til dem igennem vores App.xaml.
Åben MainPage.xaml og få den til at se nogenlunde således ud:
<UserControl x:Class="Localization.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" d:DesignWidth="640" d:DesignHeight="480">
<Grid x:Name="LayoutRoot">
<Button Content="{Binding Path=Name, Source={StaticResource LocalNames}}" />
</Grid>
</UserControl>
Her kan du at se at vi ikke engang har en reference til vores resourcer men blot kan kalde dem. I dette eksempel med databinding på en knap.
Path er navnet på selve nøglen i resource filen og StaticResource peger på vores resource nøgle fra App.xaml.
Hvis vi F5 nu vil vi se en knap med den værdi der står i Names.resx filen. Men hvad gør hvis vi gerne vil have mulighed for at skifte sprog ? Et par ting.
Først skal vi finde den fil der hedder DitSilverlightProjekt.csproj og åbne den med din favorit tekst editor. I den fil er der et tag ved navn SupportedCultures.

Jeg har såmænd bare specificeret 1 sprog (dansk) men man kan tilføje flere med , eller ; (da-DK;en-US;en-GB).
Det næste vi skal gøre er at ændre vores web.config fil.
<globalization uiCulture="auto" />
Og sidst men ikke mindst vores object tag i selve siden der hoster Silverlight xap filen.
<param name="uiculture" value="<%=System.Threading.Thread.CurrentThread.CurrentUICulture %>" />
Du kan naturligvis også sætte dette dynamisk i koden, f.eks i App.xaml.cs:
public App() {
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "da-DK" );
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo( "da-DK" );
InitializeComponent();
}
Hvis du vil teste om det virker kan du download kildekoden her.