Programmers Blog

Softwareentwicklung Thomas Schössow

Sie befinden sich hier: Startseite » Lokalisierungsprobleme mit einer C# WPF Anwendung

Lokalisierungsprobleme mit einer C# WPF Anwendung

WPF-C#-mehrsprachig-xamlIm Verlauf meiner Arbeit an der Erweiterung für die Vertragverwaltung TSVertrag verwende ich ein Tool, welches die einfache Lokalisierung von WPF Anwendungen (Windows Presentation Framework)  erlaubt. Ich verwende dieses Tool LocalizationExtension seit Jahren in einigen meiner Projekte und bin sehr zufrieden damit. Allerdings gab es wohl zwischenzeitlich ein größeres Update dieses Tools. Für meine Arbeit verwende ich es um meine Anwendungen in den Sprachen Deutsch und Englisch anbieten zu können. Es wären ohne große Erweiterungen auch noch andere Sprachen möglich, das hat sich bislang aber nicht ergeben.

Über die Details, wie das Tool verwendet wird bzw. wie es in den XAML-Code zur Lokalisierung von WPF Anwendungen eingebunden wird, möchte ich hier nichts schreiben. Das wäre Stoff für eine ganze Artikelserie, für die mir allerdings die Zeit fehlt.

Nachdem ich das Tool „erfolgreich“ verwendet habe und einen ersten Start der Applikation durchgeführt habe, erhielt ich im Debug-Window von SharpDevelop eine Unmenge von Fehlermeldungen mit einem ähnlichen Text, wie hier im Beispiel 

System.Windows.Data Error: 4 : Cannot find source for binding with reference ‚RelativeSource FindAncestor, AncestorType=’System.Windows.FrameworkElement‘, AncestorLevel=’1“. BindingExpression:Path=Parent; DataItem=null; target element is ‚StackPanel‘ (Name=“); target property is ‚Parent‘ (type ‚DependencyObject‘)

Anzumerken wäre, das ich zwei Listview verwende, die jeweils ein DataItemTemplate beinhalten. Diese bestehen aus einer Reihe von Textboxen, Images und Tooltips. Die Tooltips enthalten erläuternden Text, der mehrsprachig vorliegt und mit der LocalizationExtension eingebunden wurde.

Nach langen Tests und nach Suche im Internet bin ich auf den Effekt gestoßen, der auf den Projektseiten der Extension erwähnt wird. Ich hatte es mir „einfach gemacht und folgenden Ausdruck verwendet. 

Header=“{lex:Loc Module}“
Wobei „Module“ der Name einer Stringresource ist. Hintergrund ist dabei, das bei Verwendung dieser vereinfachten Form die Parent/Child Beziehung der XAML-Elemente in einem Template durchbrochen werden, also die Child-Elemente nicht mehr das Root-Element finden können. Die Übersetzungen funktionieren, es kommt „nur“ zusätzlich zu dieser Fehlermeldung. Mit der Verwendung von 
Header=“{lex:Loc MyAssemblyName:MyDictName:Module}“
löst sich dieses Problem auf.

 

 

 

 

Thomas Schoessow

Du findest mich auch auf Google+.

Schreibe einen Kommentar

Menü schließen