Jag håller för närvarande på att jobba med ett projekt där vi har en Silverlight klient.
Jag tänkte att jag skulle dela med mig av mina erfarenheter och motgångar under projektets gång
och hoppas att med mina motgångar kunna hjälpa er att komma förbi diverse hinder.
Idag tänkte jag förklara hur jag till slut lyckades med internationalization och localization.
Jag började med att skapa en katalog vid namn Resources och där i en Resource File fil med
namn Strings.resx. Visual Studio skapar även filen Strings.Designer.cs åt dig
(ifall ni använder VB.NET blir det givetvis .vb) och öppnar filen i Managed Resource Editor.
Sedan lade jag till ett par strängar och satte Access Modifier till Public.
På min XAML sida lade jag till
<UserControl.Resources>
<local:Strings x:Key="LocStrings" />
</UserControl.Resources>
och inkluderade mitt namespace som i mitt fall blev xmlns:local="clr-namespace:Ntier.Kms.Client.Resources"
Nu var jag redo att börja implementera mina strängar med syntaxen:
Text="{Binding Source={StaticResource namnet_på_min_nyckel}, Path=namnet_på_min_sträng}"
Vilket i mitt fall blev:
<TextBlock Margin="10" Grid.Row="0" Grid.Column="0" Text="{Binding Source={StaticResource LocStrings}, Path=UserName}" Foreground="White" Width="115" />
<TextBlock Margin="10" Grid.Row="1" Grid.Column="0" Text="{Binding Source={StaticResource LocStrings}, Path=FirstName}" Foreground="White" Width="115" />
<TextBlock Margin="10" Grid.Row="2" Grid.Column="0" Text="{Binding Source={StaticResource LocStrings}, Path=LastName}" Foreground="White" Width="115" />
Efter allt detta provade jag att kompilera och starta klienten.....och fick felet:
AG_E_PARSER_UNKNOWN_TYPE [Line: 12 Position: 30]
Kom ihåg att jag satte Access Modifier till Public, men det hjälpte tydligen inte.
Jag gick in i Strings.Designer.cs filen och såg att konstruktorn var satt till
internal Strings() {
}
Efter att manuellt ändrat detta till
public Strings() {
}
går det att kompilera igen.
Kom ihåg att varje gång ni ändrar i Strings.resx filen kommer Designer.cs filen att återställa till internal,
så denna ändring måste göras om och om igen. SUCK!
Jag tog även en kopia på min Strings.resx fil och döpte om den till Strings.sv-SE.resx där jag har mina strängar på svenska.
För att sv-SE filen ska kunna hittas måste projektfilen ändras manuellt. Jag öppnade csproj i notepad och letade efter
<SupportedCultures>. Där la jag till <SupportedCultures>sv-SE</SupportedCultures>.
Det sista jag gjorde var att lägga till svenska som defaultspråk.
Detta gjorde jag i min App.xaml.cs fil där jag ändrade Application_Startup till
private void Application_Startup(object sender, StartupEventArgs e)
{
var culture = new CultureInfo("sv-SE");
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
this.RootVisual = new MainPage();
}
Äntligen fick jag allt att fungera som jag hade tänkt.
Till min hjälp använde jag mig av Tim Heuer's sida:
http://timheuer.com/blog/archive/2009/08/26/silverlight-string-localization.aspx
Återkommer med mer info angående valideringar i Silverlight inom kort.
/Claes