Läsa ifrån resx

Av Claes Timåker 7. October 2009, 14:54
Visa profil för Claes Timåker

Jag skrev tidigare en artikel om resx och tänkte här följa upp med lite mer tricks.

För mitt projekt lade jag till ett ChildWindow där användaren får klicka på

OK eller Cancel. Detta fönster har en property som heter Title. Jag kan då

ej använda mig av {Binding Source={StaticResource LocStrings}, Path=DeleteAssignmentTitle}

i XAML filen. Min lösning var att anropa ResourceManager direkt.

I konstruktorn för mitt ChildWindow har jag följande kod:

        public DeleteAssignmentChildWindow()
        {
            InitializeComponent();
            Title = GetTitle();
        }

och GetTitle ser ut så här:

        private static string GetTitle()
        {
            ResourceManager rm = null;
            rm = new ResourceManager("Ntier.Kms.Client.Resources.Strings", Assembly.GetExecutingAssembly());
            string title = rm.GetString("DeleteAssignmentTitle");

            return title;
        }

Ntier.Kms.Client är mitt namespace för mitt projekt.

Resources är min folder där mina resource filer finns.

Strings är namnet på min Strings.resx fil.

Klappat och klart nu kan jag få tag på min titel för fönstret.

 

/Claes

 

Tags: , , ,

AG_E_PARSER_UNKNOWN_TYPE resx problem

Av Claes Timåker 22. September 2009, 11:05
Visa profil för Claes Timåker

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

 

Tags: , , ,

Silverlight


Show all members