. /// Sets or replaces the ResourceDictionary by dynamically loading. /// a Localization ResourceDictionary from the file path passed in. /// summary>. define bibliography in literature internet impact essay math homework sheets free grade 1 eu law essay answers to questions referencing in essays uk map can someone do my dissertation abstract apush midterm essays the death penalty is wrong essay topics wpf lokalisierung beispiel essay re4 assignment ada unlocks. Apr 8, 2009 The article Simple WPF Localization provides an effective, simple solution for localizing text resources in WPF applications. It uses a WPF Extension to get the string resources from the standard project Properties.Resources RESX file. This article takes a similar approach, and defines a RESX extension that.">

Wpf Lokalisierung Beispiel Essay

Black Essay Guideline History Information


Do you need help with with essay, research paper, homework or even dissertation?

Visit our website - https://goo.gl/HKbmHS (assignmenthelp24.com)





=================>>>CLICK HERE<<<=================

=================>>>CLICK HERE<<<=================

=================>>>CLICK HERE<<<=================







=================>>>GET ASSIGNMENT HELP<<<=================

=================>>>GET ASSIGNMENT HELP<<<=================

=================>>>GET ASSIGNMENT HELP<<<=================





vietnamese traditional wedding essay sample
apa bibliography online book
antiquity 2 bibliography mla
hi255 unit 1 assignment 2
define bibliography in literature
internet impact essay
math homework sheets free grade 1
eu law essay answers to questions
referencing in essays uk map
can someone do my dissertation abstract
apush midterm essays
the death penalty is wrong essay topics
wpf lokalisierung beispiel essay
re4 assignment ada unlocks
hvad er et godt essay scholarships
essay about advantages and disadvantages of homeschooling
timed essay writing techniques conclusion
american music essay topics
the body finder book trailer The Easiest Way to Write an Essay assignment
music influence on culture essay introduction
american school in london admissions essay
interpersonal communication class assignments templates
engstrom auto mirror plant case study analysis of a business
diana bendik various temporary assignments
essays on women equality
essay on drug addiction wikipedia the free
essay on argumentative topics 6th
dissertation binding leeds headingley
argumentative essay examples 300 words a day
religion in brave new world essay prompts
study skills essay writing for university
terwilliger bunts one by annie dillard essay seeing
illustrator projects assignments
satire essay question
writing the argument essay template
censorship in schools essay
mymathlab answers to homework math
june 2001 us history regents essay topics
toktar aubakirov essay scholarships
transition words examples essay writing
essay about moving to america
eleanor updale homework answers
pictures for a descriptive essay is
zeynep turkyilmaz dissertations
pay someone to write a research paper for menus
studentassignment leeschools net
thesis definition in essay
drunk driving video essay on actors
hubungan etnik assignment submission
cooper hewitt national design museum review essay
example of cover letters for job applications
research papers causes of world war 1
my experience in examination hall essay
march 9 2014 road accidents essay
funeral oration of pericles essay outline
The Easiest Way to Write an Essay browning version essay
ontario immigration act 2015 essay
1984 essays topics for scholarships
inf1505 assignment 1 The Easiest Way to Write an Essay semester 2
sample rhetorical analysis essay prompts for the odyssey
sample elementary The Easiest Way to Write an Essay essay questions
biology investigatory projects for class 11 topics for persuasive essays
poor document design essay
working outline for research paper apa The Easiest Way to Write an Essay format
essay on do we need to dress for success
do homework illustration
capullo spanish meaning of essay
essay on my village or town
essay on the school
fashion design internship cover letter examples
mat2379 assignment 4 u
graveyard shift short story review assignment
human trafficking essay in malaysia children
dissertations on the english language 1789 france
doctoral dissertation improvement
system idle process high cpu solved assignment
mpemba effect hypothesis statement
sprogets udvikling essay about myself
difference between nuclear family and extended family essay topics
pretext for discrimination definition essay
2000 word essay is how many pages double spaced writing
pay for my essay
is abortion moral or immoral essay writing
beneatha younger essay contest
bilogy coursework london zoo
hip hop beyond beats and rhymes essay writer
my favourite place to visit essay
essays on financial management
essay - what is your definition of a hero
taking chance home essay writing
cornell supplement essays
witnessing a crime essay topics
free essays crime scene investigation
beamer bibliography new block undefined reference
essay if i were invisible
ct greenwich my follett portal assignment list aspen
essay on native american art for sale
example personal statement for library assistant job description
substance abuse therapeutic group session topics for argumentative essays
guest lecturer topics for persuasive essays
bookstock b.e.s.t. essay finalist 2015
what were the main causes of world war 1 essay
essay cause and effects template
beyonce feminist essay on The Easiest Way to Write an Essay to kill
random sampling and random assignment examples of verbs
on assignment acquires cybercoders
american airlines case study essay
erl king poem analysis essays
docile bodies essay writer
observing children in the classroom essay
the death penalty argument essay
ucla part time mba essay questions
essay topics argumentative writing prompts
research paper topics american popular culture association
chicken soup for the soul essays
cs 229 homework clipart
karl mannheim essays on the sociology of knowledge 1952
college writing from paragraph to essay answers
how to write a perfect annotated bibliography
proquest dissertations theses database online
defining deviancy down moynihan essay format
what is mental health essay nursing
depicting definition example essays
connect homework software
adolf essay hitler
diabetes research paper examples
english outline for essay sample
flash expecting identifier before assignment
response to literature essay template
how many references should you have for a 1000 word essay
weird persuasive essay topics
second amendment gun control essay outline
challenging essay
important vocabulary for writing essays
ecotourism essay conclusion format
laws of life essay contest examples of onomatopoeia
eng201 assignment 2 solution 3 dec 2012
5th grade essay checklist
brief response essay structure
year 5 homework ideas for preschoolers
essay topic for college admission
the review essay sample
rivers homework help woodlands junior school celebrations
popular article titles in an essay
human trafficking research essay format
sgdi mnd research paper
gcse coursework wikipedia
5bic assignment 2014 calendar
perrine chancerel dissertation meaning
college who am i essays

Folgender Artikel beschreibt die technische Umsetzung  zweier Methoden um WPF Anwendungen mehrsprachig zu gestalten.

Mögliche Lösungsansätze:

  • Ressource-Files
  • Xml-Files

Ressource-Files (.resx) liegen sehr nahe, da der Zugriff auf diese bereits vom Framework bereitgestellt wird, und da Ressource-Files XML-Files sind, ist auch der Umgang mit ihnen kein Problem. Es gibt aber durchaus Situationen, wo „normale“ XML-Files die bessere Wahl wären – z.B. wenn »Plattform-Unabhängigkeit« , oder »Skalierbarkeit« eine Rolle spielen. Die beiden in Frage kommenden Möglichkeiten werden im Folgenden technisch analysiert und vorgestellt.

Lösungsansatz Resource-Files

Feste Elemente, können in einer Anwendung durch Resources in der jeweiligen Sprache definiert werden. Durch ein einfaches Duplizieren einer bestehenden Resource.SPRACHE.resx und der Anpassung dieser, wird automatisch eine neue Resource.SPRACHE.dll erstellt. Das garantiert ein schnelles Implementieren weiterer Sprachen durch den Entwickler¹. Die verschiedenen Sprachdateien haben aber nun den Nachteil das die entsprechenden Variable redundant vorliegt, was auch ein Erweitern der jeweiligen Sprache beim späteren Hinzufügen einer neuen Variable erschwert.

Technische Umsetzung

Benötigte Tools:

  • ResXFileCodeGeneratorEx – http://dmytro.kryvko.googlepages.com/
  • Klasse CultureResources.cs – http://www.codeproject.com/KB/WPF/WPFLocalize.aspx

Vorbereitung / Installation

  • Order Cultures in der Solution anlegen
  • Die Klasse CultureResources.cs² anlegen
  • Die Resources.resx aus Propertys nach Cultures verschieben, Achtung! Der Namensraum der CodeBehind muss hier aber weiter auf „Properties“ zeigen.
  • Die Settings.settings um „DefaultCulture“ vom Typ „System.Globalization.Culture“ erweitern (Die app.config wird dabei automatisch aktualisiert). Hier kann als Wert die Defaultsprache eingestellt werden, zB. en-US
  • Erstellen einer ResourceDictionary in Cultures mit den Namen ResourceDictionary.xaml mit folgendem Inhalt:
1 2 <ObjectDataProvider x:Key="Resources" ObjectType="{x:Type Cultures:CultureResources}" MethodName="GetResourceInstance"/><ObjectDataProvider x:Key="CultureResourcesDS" ObjectType="{x:Type Cultures:CultureResources}"/>

<ObjectDataProvider x:Key="Resources" ObjectType="{x:Type Cultures:CultureResources}" MethodName="GetResourceInstance"/> <ObjectDataProvider x:Key="CultureResourcesDS" ObjectType="{x:Type Cultures:CultureResources}"/>

Die ResourceDictionary.xaml in der App.xaml bekannt machen () / ggfls. Mergen

In der View können nun die Inhalte welche übersetzt werden sollen um folgenden Syntax erweitert werden: {Binding Path=HIER.DER.RESOURCE.NAME, Source={StaticResource Resources}}

Beispiel View:

1 <MenuItem Header="{Binding Path=MenuItemEdit, Source={StaticResource Resources}}">

<MenuItem Header="{Binding Path=MenuItemEdit, Source={StaticResource Resources}}">

Es empfiehlt sich die Anwendung soweit vorzubereiten und innerhalb einer Resource die Sprachvariablen festzulegen und dann erst diese zu duplizieren und in der jeweiligen Sprache zu übersetzen. Ein späteres Hinzufügen von neuen Variablen ist recht aufwändig, da dieses in jeder erstellten Sprache ausgeführt werden muss. Die Möglichkeit dieses mit der Baml.exe, welche die DLL in *.csv Dateien parsen kann ist zwar gegeben, jedoch bleibt es nicht aus, alle Sprachdateien für sich anzupassen. Auch Bilder, Datei u.a. können über Resources gesteuert werden

——————–

¹Um eine Sprache hinzuzufügen, genügt es eine vorhandene Resources zu duplizieren und anzupassen. Die Resourcedatei muss in den Buildeigenschaften („Benutzerdefiniertes Tool“) um den Suffix „Ex“ (ResXFileCodeGeneratorEx) erweitert werden. Vorher muss vom Entwickler das Tool ResXFileCodeGeneratorEx heruntergeladen und installiert werden (siehe benötigte Tools – ResXFileCodeGeneratorEx)

²Die Klasse Culture beinhaltet Methoden, welche die vorhandenen Resources findet und in einer Liste bereitstellt.

Nachteile von Resources

Resources haben den entscheidenden Nachteil, dass hier während der Laufzeit keine neuen „Sprachvariablen“ hinzugefügt werden können, da dieses ein Neukompilieren voraussetzt, um die entsprechende *.dll zu erzeugen. Des Weiteren ist das Anpassen aller implementierten Resources bei neuen Sprachvariablen (notwendige Schritte: exportieren, anpassen, importieren, kompilieren) umständlich.

Resources sind Redundant zu den darunterliegenden Ebenen, das heißt, dass die Variablen in jeder Sprach.dll sich wiederholen, so entsteht auch die Gefahr von nicht vorhandenen oder „falsch“ geschriebenen Sprachenvariablen.

Diese Implementierung ist in dieser Weise Plattformabhängig und so auch proprietär an Windowssysteme bzw. an .NET Plattformen gebunden.

Lösungsansatz XML Files

Wenn Ressource-Files wegfallen, liegen „normale“ XML-Files nahe. Alle Strings werden in ein zentrales XML-File geladen.
Der Zugriff auf die Strings funktioniert über eine zentrale Klasse, welche die ZugriffsLogik kapseln soll.

Anforderungen:

  • 1-n Sprachen werden unterstützt (muss soweit skalierbar sein, dass neue Sprachen jederzeit hinzugefügt werden können,  ohne dass die Applikation angepasst werden, oder neu kompiliert muss).
  • Die Strings müssen in verschiedene Bereiche (Regions) unterteilt werden können – sonst verliert man schnell den Überblick über die zu verwalteten Strings.
  • Eine StringVariable soll einmalig sein
  • Das Source-File sollte „Notepad-kompatibel“ sein
  • Modularität muss unterstützt werden
  • Muss von allen Systemen unterstützt werden
  • Möglichkeit einfacher Übersetzung durch Outsourcing

Exemplarischer Aufbau einer XML Struktur:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <Region name="TopMenu"><MenuItemEdit><de-DE>Bearbeiten</de-DE><en-US>Edit</en-US><nl-NL>Bewerken</nl-NL><fr-FR>Modifier</fr-FR></MenuItemEdit></RegionName><Region name="OutlookBar"><NavigationPaneMinimizedText><de-DE>Arbeitsplatz</de-DE><en-US>Workplace</en-US><nl-NL>Werkplek</nl-NL><fr-FR>Poste de Travail</fr-FR></NavigationPaneMinimizedText></Region>

<Region name="TopMenu"> <MenuItemEdit> <de-DE>Bearbeiten</de-DE> <en-US>Edit</en-US> <nl-NL>Bewerken</nl-NL> <fr-FR>Modifier</fr-FR> </MenuItemEdit> </RegionName> <Region name="OutlookBar"> <NavigationPaneMinimizedText> <de-DE>Arbeitsplatz</de-DE> <en-US>Workplace</en-US> <nl-NL>Werkplek</nl-NL> <fr-FR>Poste de Travail</fr-FR> </NavigationPaneMinimizedText> </Region>

Die Unterteilung in die Region-Nodes ermöglicht es, eine gewisse Struktur in das XML-File zu bringen. So behält man auch bei hunderten von Texten den Überblick.

Die Sprachen können frei ergänzt werden, die Bezeichnung der Sprach-Nodes (hier de-DE, en-US, nl-NL, fr-FR) ist dabei egal, da dessen Bezeichnung dann einfach als Parameter mitgegeben wird.
In einer dynamischen Anwendungslandschaft, in deren der Anwender eigene Elemente oder Controls anlegen kann, ist dieses System einzusetzen. Hier kann durch eine Serializierung neuer „Vokabeln“ sichergestellt werden, das die Übersetzung des jeweiligen Elements zur Laufzeit geschehen kann.

Umsetzung in GUI:

Als Datenspeicher für die Daten bieten sich durch das Key / Value – Verfahren Dictionary-Objekte an.
Jede Hierarchie-Stufe (Key, Value) wird in ein eigenes Dictionary-Objekt gespeichert – und diese werden dann entsprechend verschachtelt.

Zwei einfache Methoden für die Realisierung:

  • LoadSourceFile(„language.xml“) Wird nur dazu verwendet, das XML-File in eine XmlDocument-Instanz zu laden, die dann anschliessend in der GetTranslatedDictionaryFromXML verarbeitet wird.
  • GetTranslatedDictionaryFromXML() wird aufgerufen wenn die Standard-Spracheinstellungen genutzt werden. Diese ruft die im folgenden beschriebene Methode mit der default-Spracheinstellung auf und gibt das Dictionary zurück.
  • Die eigentliche Methode GetTranslatedDictionaryFromXML(String language) iteriert die XML und speichert im Key/Value Verfahren die Werte im Dictionary und gibt dieses zurück.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #region Method: GetTranslatedDictionaryFromXML public static Dictionary<String, String> GetTranslatedDictionaryFromXML(String language){varxmlDoc= LoadSourceFile(SourceFile);var translatedDictionary =new Dictionary<String, String>();   try {foreach(XmlNode regionNode in xmlDoc.SelectNodes(XML_ROOTNODE)){foreach(XmlNode keyNode in regionNode.ChildNodes){foreach(XmlNode value in keyNode.ChildNodes){if(language == value.Name){ Value = value.InnerText;}}Key= keyNode.Attributes["key"].Value; translatedDictionary.Add(Key, Value);}}} catch (Exception ex){thrownew Exception("Error - "+ SourceFile +": "+ ex.Message);}return translatedDictionary;}public static Dictionary<String, String> GetTranslatedDictionaryFromXML(){return GetTranslatedDictionaryFromXML(DefaultLanguage);}#endregion

#region Method: GetTranslatedDictionaryFromXML public static Dictionary<String, String> GetTranslatedDictionaryFromXML(String language) { var xmlDoc = LoadSourceFile(SourceFile); var translatedDictionary = new Dictionary<String, String>(); try { foreach (XmlNode regionNode in xmlDoc.SelectNodes(XML_ROOTNODE)) { foreach (XmlNode keyNode in regionNode.ChildNodes) { foreach (XmlNode value in keyNode.ChildNodes) { if (language == value.Name) { Value = value.InnerText; } } Key = keyNode.Attributes["key"].Value; translatedDictionary.Add(Key, Value); } } } catch (Exception ex) { throw new Exception("Error - " + SourceFile + ": " + ex.Message); } return translatedDictionary; } public static Dictionary<String, String> GetTranslatedDictionaryFromXML() { return GetTranslatedDictionaryFromXML(DefaultLanguage); } #endregion

Hierbei werden beide Methoden zur Verfügung stehen, somit kann optional die gewünschte Sprache mit übergeben werden, anders verwendet die Methode die definierte Default-Sprache.

[Die Besonderheit in diesem Verfahren ist, dass es möglich ist die angezeigten Sprachen zu „mischen“, so könnten Kundenwünsche in der Art „Ich hätte gerne die Inhalte in Englisch, aber die Menüstruktur auf Holländisch“, umgesetzt werden.]

MVVM

In der View wird das Element wie folgt gebunden, diese Methode kann auf alle Elemente abgebildet weredn:

1 2 <MenuItem Header="{Binding Translation[MenuItemEdit]}"><Image ToolTip="{Binding Translation[LogoToolTip]}" Source=“…“>

<MenuItem Header="{Binding Translation[MenuItemEdit]}"> <Image ToolTip="{Binding Translation[LogoToolTip]}" Source=“…“>

Im ViewModel, wird in das jeweilige ViewModelProperty das Dictionary gespeichert:

1 2 3 Translation = TranslateXml.GetTranslatedDictionaryFromXML(); TranslationFR = TranslateXml.GetTranslatedDictionaryFromXML(“fr-FR“); TranslationNL = TranslateXml.GetTranslatedDictionaryFromXML(“nl-NL“);

Translation = TranslateXml.GetTranslatedDictionaryFromXML(); TranslationFR = TranslateXml.GetTranslatedDictionaryFromXML(“fr-FR“); TranslationNL = TranslateXml.GetTranslatedDictionaryFromXML(“nl-NL“);

Fazit

Der 2. Lösungsansatz ist dem Ersten vorzuziehen, da hier die Vorteile klar auf der Hand liegen. Es wird gewährleistet, das betriebsystemunabhängige Systeme, gleichermaßen eine einzige LanguageSource bereitsteht, die von allen Systemarchitekturen gelesen werden kann.
Dieses Konzept kann ohne Probleme auch auf andere Datenquellen angewendet werden.

Sprachvariablen liegen in einer XML einmalig vor, so wird verhindert das man sich in einer anderen Sprache verschreibt, oder vergisst diese hinzuzufügen. Weiterhin können XML Dateien als Services bereitgestellt und in Workflows mit eingebunden und ggfl. angepasst oder verändert werden.
Eine Erweiterbarkeit der Sprachdateien während der Laufzeit wird ebenfalls durch diese Lösung gewährleistet. Vorteile dieses Ansatzes liegen sicherlich auch in der einfachen Handhabung des XML-Files.

Es werden keine speziellen Programme oder User-Interfaces benötigt, um die Strings anzupassen, z.B. kann die XML nach Excel exportiert werden und an einem Übersetzer „outgesourced“ werden.

Im Endeffekt muss verglichen werden, wie weit man seine Entwicklung modular aufbauen möchte und wie weit man eine Skalierung des System gewährleisten will. Die Entwicklung zeigt aber, dass es wichtig ist, eine Anwendungslandschaft zu entwickeln, die in klaren Schichten voneinander getrennt ist um so Business und GUI vollkommen voneinander zu trennen. Wenn es später heißt, lasst uns die Anwendung auch auf dem IPhone, Smartphone oder mittels Website in PHP/ASP/Silverlight abbilden, spielen solche Entscheidungen eine gravierende Rolle.

Markiert in:Architektur    Development    WPF    XAML    XML

Mario BinderJuni 18, 2009Development, WPF, XAML, XML

Leave a Comment

(0 Comments)

Your email address will not be published. Required fields are marked *