Dieser Artikel wurde maschinell übersetzt.
Silverlight-Lokalisierung
Tipps und Tricks für das Laden von Silverlight-Locale-Ressourcen
Matthew Delisle
Silverlight ist eine großartige Framework zum Erstellen von rich Internet Applications (RIAs), jedoch nicht noch die stabile Unterstützung für Lokalisierung, die Sie in anderen Komponenten von Microsoft zu genießen.NET Framework. Silverlight verfügt RESX-Dateien, die eine einfache ResourceManager-Klasse und ein Element in der Projektdatei. Aber nach, die Sie selbst sind. Es gibt keine benutzerdefinierten Markuperweiterungen und keine Unterstützung für die DynamicResource-Klasse.
In diesem Artikel zeige ich Ihnen wie Sie alle diese Probleme zu beheben. Ich werde eine Lösung vorstellen, die einen Entwickler Ressourcensets zur Laufzeit zu laden, ein beliebiges Format zum Speichern von Ressourcen verwenden, Ressourcen ändern, ohne zu kompilieren und verzögerte Laden von Ressourcen zu demonstrieren.
Dieser Artikel ist in drei Teile aufgeteilt. Zunächst werde ich eine einfache Anwendung mit den Lokalisierungsprozess von Microsoft ausführliche entwickeln. Ich werde ein anderes Lokalisierungslösung erläutern, die einige Vorteile über den standard-Prozess hat. Schließlich wird die Lösung mit einer Erläuterung von Back-End-Komponenten, die erforderlich sind, um die Lösung zu vervollständigen rundet.
Das Standardverfahren für die Lokalisierung
Ich beginne, durch den Aufbau einer Silverlight-Anwendung, die den Lokalisierungsprozess von Microsoft beschrieben verwendet werden. Eine ausführliche Beschreibung des Prozesses steht unter MSDN.Microsoft.com/library/cc838238(VS.95).
Die Benutzeroberfläche enthält einen TextBlock und ein Bild wie im Abbildung 1.
Abbildung 1 der Anwendung
Der Lokalisierungsprozess von Microsoft beschrieben verwendet RESX-Dateien zum Speichern der Ressourcendaten für die. Die RESX-Dateien sind in die Hauptassembly oder eine Satellitenassembly eingebettet und nur einmal beim Start der Anwendung geladen wird. Sie können Anwendungen, die gezielt für bestimmte Sprachen durch Ändern des SupportedCultures-Elements in der Projektdatei erstellen. In dieser Beispielanwendung wird für zwei Sprachen, Englisch und Französisch lokalisiert. Nach dem Hinzufügen der zwei Ressourcendateien und zwei Bilder, die Flags darstellt, sieht die Projektstruktur wie Abbildung 2.
Abbildung 2 Projektstruktur nach dem Hinzufügen von RESX-Dateien
Ich umgeändert die Build-Aktion für die Bilder in Inhalt, so dass die Bilder mit einer weniger ausführliche Syntax verwiesen werden kann. Ich werde zwei Einträge für jede Datei hinzufügen. TextBlock wird über eine Eigenschaft namens Welcome verwiesen, und das Bild-Steuerelement über eine Eigenschaft mit dem Namen FlagImage verwiesen wird.
Beim Erstellen von Ressourcendateien in einer Silverlight-Anwendung ist der Default-Modifizierer für die generierte Klasse intern. Leider kann XAML interne Member nicht lesen, auch wenn sie in derselben Assembly gespeichert sind. Um dieses Problem zu lösen, müssen die generierte Klassenmodifizierer in public geändert werden. Dies kann in der Entwurfsansicht der Ressourcendatei erreicht werden. Das Zugriffsmodifizierer Dropdown-Menü können Sie den Umfang der generierten Klasse festlegen.
Nachdem Ressourcendateien bereit sind, müssen Sie die Ressourcen in XAML zu binden. Dazu erstellen Sie eine Wrapper-Klasse mit einem statischen Feld verweisen auf eine Instanz der Resource-Klasse. Die Klasse ist dies ganz einfach:
public class StringResources { private static readonly strings strings = new strings(); public strings Strings { get { return strings; } } }
Um die Klasse aus XAML zugreifen zu können, müssen Sie eine Instanz zu erstellen. In diesem Fall werde ich die Instanz in der App-Klasse erstellen, damit es im gesamten Projekt zugegriffen werden kann:
<Application.Resources>
<local:StringResources x:Key="LocalizedStrings"/>
</Application.Resources>
Datenbindung in XAML ist jetzt möglich. Das XAML für den TextBlock und das Bild sieht folgendermaßen aus:
<StackPanel Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Center"> <TextBlock Text="{Binding Strings.Welcome, Source={StaticResource LocalizedStrings}}" FontSize="24"/> </StackPanel> <Image Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Center" Source="{Binding Strings.FlagImage, Source={StaticResource LocalizedStrings}}"/>
Der Pfad ist der String-Eigenschaft, gefolgt von der Taste Resource-Eintrag. Die Quelle ist die Instanz des Wrappers StringResources aus der App-Klasse.
Festlegen der Kultur
Es gibt drei Anwendungseinstellungen, die zum Abholen von Kultureinstellungen des Browsers, und zeigen die entsprechende Kultur der Anwendung konfiguriert werden müssen.
Die erste Einstellung ist das SupportedCultures-Element in der CSPROJ-Datei. Es gibt derzeit keine Dialogfenster in Visual Studio, um die Einstellung zu bearbeiten, damit die Projektdatei muss manuell bearbeitet werden. Sie können einer Projektdatei entweder indem Sie Sie außerhalb von Visual Studio oder Entladen des Projekts, und wählen bearbeiten aus dem Kontextmenü innerhalb von Visual Studio öffnen bearbeiten.
So aktivieren Sie Englisch und Französisch für diese Anwendung sieht der Wert des Elements SupportedCultures:
Die Werte für die Kulturen sind durch Kommas getrennt. Sie brauchen die neutrale Kultur angeben.Es ist in der Haupt-DLL kompiliert.
Die folgenden Schritte sind erforderlich, um die Spracheinstellungen des Browsers abzuholen. Das eingebettete Silverlight-Objekt auf der Webseite muss ein Parameter hinzugefügt. Der Parameterwert ist die aktuelle Benutzeroberflächenkultur der Serverseite entnommen. Dies erfordert die Webseite in einer ASPX-Datei sein. Die Parametersyntax lautet:
Die endgültige obligatorischen Schritt in diesem Prozess ist die Datei web.config bearbeiten und Hinzufügen von Globalization-Element innerhalb des system.web-Elements, das Festlegen der Werte von seine Attribute automatisch:
Wie bereits erwähnt, hat eine Silverlight-Anwendung eine neutrale Sprache eingestellt. Die Einstellung ist erreicht, indem die Projekteigenschaften die Registerkarte Silverlight auf Assemblyinformationen. Die neutrale Sprache-Eigenschaft befindet sich im unteren Bereich des Dialogfensters, wie im Abbildung 3.
Abbildung 3 die neutrale Sprache festlegen
Ich empfehle die neutrale Sprache auf einen ohne Bereich festlegen. Diese Einstellung ist ein Fallback und ist nützlicher, wenn es eine Vielzahl von möglichen Gebietsschemas abdeckt. Festlegen einer neutralen Sprache Fügt ein Assemblyattribut in die Datei assemblyinfo.cs wie folgt:
Nachdem alle, mit der was Sie mit landen ist eine lokalisierte Anwendung, die Spracheinstellungen des Browsers beim Start liest und lädt die entsprechenden Ressourcen.
Eine benutzerdefinierte Lokalisierungsprozess
Die Einschränkungen des Lokalisierungsprozesses standard entstammen ResourceManager und RESX-Dateien. Die ResourceManager-Klasse ändern nicht Ressourcensets zur Laufzeit basierend auf der Kultur Änderungen innerhalb der Umgebung. Mithilfe von RESX-Dateien sperrt den Entwickler in einem Ressourcenset pro Sprache und Inflexibilität bei der Verwaltung der Ressourcen.
Als Reaktion auf diese Einschränkungen sehen wir uns eine alternative Lösung, die dynamische Ressourcen einsetzt.
Um Ressourcen dynamisch zu gestalten, muss der Ressourcen-Manager Benachrichtigung senden, wenn die aktive Ressource Änderungen festlegen. Zum Senden von Benachrichtigungen in Silverlight implementieren Sie die INotifyPropertyChanged-Schnittstelle. Jeden Ressourcensatz wird intern ein Wörterbuch mit Schlüssel-Wert vom Typ String sein.
Prism-Framework und die verwaltete Erweiterbarkeit Framework (MEF) werden häufig für Silverlight-Entwicklung, und dieser Frameworks, die die Anwendung in mehrere XAP-Dateien aufzuteilen. Für die Lokalisierung benötigt jeder XAP-Datei eine eigene Instanz des Ressourcen-Managers. Zum Senden von Benachrichtigungen an alle XAP-Datei (jede Instanz des Ressourcen-Managers) muss jede Instanz, die erstellt wird, und verfolgen die Liste durchlaufen, wenn Benachrichtigungen gesendet werden müssen. Abbildung 4 zeigt den Code für diese SmartResourceManager-Funktion.
Abbildung 4 SmartResourceManager
public class SmartResourceManager : INotifyPropertyChanged { private static readonly List<SmartResourceManager> Instances = new List<SmartResourceManager>(); private static Dictionary<string, string> resourceSet; private static readonly Dictionary<string, Dictionary<string, string>> ResourceSets = new Dictionary<string, Dictionary<string, string>>(); public Dictionary<string, string> ResourceSet { get { return resourceSet; } set { resourceSet = value; // Notify all instances foreach (var obj in Instances) { obj.NotifyPropertyChanged("ResourceSet"); } } } public SmartResourceManager() { Instances.Add(this); } public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string property) { var evt = PropertyChanged; if (evt != null) { evt(this, new PropertyChangedEventArgs(property)); } }
Wie Sie sehen können, wird eine statische Liste erstellt, um alle Instanzen der Ressource-Managers gespeichert. Die aktive Ressourcensatz wird in das Feld ResourceSet und jede Ressource, die geladen wurde in der Liste ResourceSets gespeichert. Im Konstruktor wird die aktuelle Instanz in der Liste Instanzen gespeichert. Die Klasse implementiert die INotifyPropertyChanged Standardantwort. Wenn die aktive Ressource geändert wird, kann ich Durchlaufen der Liste der Instanzen und jeweils PropertyChanged-Ereignis ausgelöst.
Die SmartResourceManager-Klasse eine Möglichkeit zum Ändern der Kultur zur Laufzeit benötigt, und es ist so einfach wie eine Methode, die ein CultureInfo-Objekt akzeptiert:
public void ChangeCulture(CultureInfo culture) { if (!ResourceSets.ContainsKey(culture.Name)) { // Load the resource set } else { ResourceSet = ResourceSets[culture.Name]; Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = culture; } }
Diese Methode überprüft, ob die angeforderte Kultur noch geladen wurde. Wenn dies nicht der Fall, lädt die Kultur und als aktiv festgelegt. Wenn die Kultur bereits geladen wurde, legt die Methode einfach die entsprechende Ressource als aktiv festlegen. Der Code zum Laden einer Ressource wird für den Moment einfach weggelassen.
Der Vollständigkeit halber auch zeige ich Ihnen die zwei Methoden, um programmgesteuert eine Ressource zu laden (siehe Abbildung 5). Die erste Methode akzeptiert nur einen Ressourcenschlüssel und gibt die Ressource aus der aktiven Kultur zurück. Die zweite Methode nimmt eine Ressource und einen Kulturnamen für die und gibt die Ressource für diese spezifische Kultur zurück.
Abbildung 5 Laden von Ressourcen
public string GetString(string key) { if (string.IsNullOrEmpty(key)) return string.Empty; if (resourceSet.ContainsKey(key)) { return resourceSet[key]; } else { return string.Empty; } } public string GetString(string key, string culture) { if (ResourceSets.ContainsKey(culture)) { if (ResourceSets[culture].ContainsKey(key)) { return ResourceSets[culture][key]; } else { return string.Empty; } } else { return string.Empty; } }
Wenn Sie die Anwendung sofort ausgeführt wird, würden alle lokalisierte Zeichenfolgen leer sein, da keine Ressourcensets heruntergeladen wurden. Um die anfängliche Ressourcensatz zu laden, werde ich erstellen Sie eine Methode mit dem Namen initialisieren, die die neutrale Sprache Datei- und Kultur-ID akzeptiert. Diese Methode sollte nur einmal während der Lebensdauer der Anwendung aufgerufen werden (siehe Abbildung 6).
Abbildung 6 beim Initialisieren der neutralen Sprache
public SmartResourceManager() { if (Instances.Count == 0) { ChangeCulture(Thread.CurrentThread.CurrentUICulture); } Instances.Add(this); } public void Initialize(string neutralLanguageFile, string neutralLanguage) { lock (lockObject) { if (isInitialized) return; isInitialized = true; } if (string.IsNullOrWhiteSpace(neutralLanguageFile)) { // No neutral resources ChangeCulture(Thread.CurrentThread.CurrentUICulture); } else { LoadNeutralResources(neutralLanguageFile, neutralLanguage); } }
Bindung in XAML
Eine benutzerdefiniertes Markup-Erweiterung würde die meisten Pneumatik / Bindungssyntax für die lokalisierten Ressourcen bereitstellen. Benutzerdefinierte Markuperweiterungen sind leider nicht in Silverlight verfügbar. Bindung für ein Wörterbuch in Silverlight 3 und höher verfügbar, und die Syntax sieht folgendermaßen aus:
<StackPanel Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Center"> <TextBlock Text="{Binding Path=ResourceSet[Welcome], Source={StaticResource SmartRM}}" FontSize="24"/> </StackPanel> <Image Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Center" Source="{Binding ResourceSet[FlagImage], Source={StaticResource SmartRM}}"/>
Der Pfad enthält den Namen der Wörterbucheigenschaft mit dem Schlüssel in eckigen Klammern. If you’re using Silverlight 2, there are two options available: creating a ValueConverter class or emitting a strongly typed object using reflection. Erstellen ein stark typisiertes Objekt mithilfe von Reflektion ist über den Rahmen dieses Artikels hinaus. Der Code für ein ValueConverter aussehen würde Abbildung 7.
Abbildung 7 benutzerdefinierte ValueConverter
public class LocalizeConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) return string.Empty; Dictionary<string, string> resources = value as Dictionary<string, string>; if (resources == null) return string.Empty; string param = parameter.ToString(); if (!resources.ContainsKey(param)) return string.Empty; return resources[param]; } }
Die LocalizeConverter-Klasse nimmt das Wörterbuch und übergebenen Parameter und gibt den Wert für diesen Schlüssel im Wörterbuch. Nach dem Erstellen einer Instanz des Konverters, würde die Bindungssyntax wie folgt aussehen:
<StackPanel Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Center"> <TextBlock Text="{Binding Path=ResourceSet, Source={StaticResource SmartRM}, Converter={StaticResource LocalizeConverter}, Convert-erParameter=Welcome}" FontSize="24"/> </StackPanel> <Image Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Center" Source="{Binding ResourceSet, Source={StaticResource SmartRM}, Converter={StaticResource LocalizeConverter}, ConverterParameter=FlagImage}"/>
Die Syntax ist ausführlicher unter Verwendung des Konverters, obwohl Sie mehr Flexibilität haben. Allerdings werden für den Rest des Artikels, ohne den Konverter wir stattdessen die Wörterbuch-Bindungssyntax verwenden.
Gebietsschemaeinstellungen Redux
Es gibt zwei Einstellungen für Anwendungen, die für die Kultur von der Silverlight-Anwendung aufgenommen zu werden, konfiguriert werden müssen. Hierbei handelt es sich um die gleichen Einstellungen, die mit den standardmäßigen Lokalisierungsprozess besprochen. Globalization-Element in der Datei web.config muss Culture und UiCulture Auto-Werte enthalten:
Außerdem muss das Silverlight-Objekt in der ASPX-Datei in dem Thread aktuelle UI Culture-Wert als Parameter übergeben werden:
Um die dynamische Lokalisierung der Anwendung zu präsentieren, werde ich fügen einige Schaltflächen, die Änderung erleichtert die Kultur, wie in in Abbildung 8. Das Click-Ereignis für die englische Schaltfläche sieht folgendermaßen aus:
(App.Current.Resources["SmartRM"] as SmartResourceManager).ChangeCulture( new CultureInfo("en"));
Abbildung 8 Änderung der Unternehmenskultur-Schaltflächen
Mit einigen Daten Pseudo würde die Anwendung ausführen und die entsprechende Sprache anzuzeigen. Die Lösung hier ermöglicht die dynamische Lokalisierung zur Laufzeit und ist erweiterbar sein müssen, die Ressourcen, die mithilfe einer benutzerdefinierten Logik zu laden.
Im nächste Abschnitt konzentriert sich auf die verbleibende Finanzierungslücke ausfüllen:, wo die Ressourcen gespeichert werden und wie diese abgerufen werden.
Serverseitige Komponenten
Jetzt erstellen wir eine Datenbank zum Speichern von Ressourcen und ein Windows Communication Foundation (WCF)-Dienst zum Abrufen von Ressourcen. In größeren Anwendungen Daten und der Geschäftsschicht erstellen sollen, aber in diesem Beispiel nicht ich alle Abstraktionen verwenden.
Der Grund dafür, dass ich habe mich entschieden, dass einen WCF-Dienst ist für die einfache Erstellung und Robustheit von WCF angeboten. Der Grund für die Ressourcen in einer relationalen Datenbank speichern gewählten ist für einfache Wartung und Verwaltung. Konnte eine Verwaltungsanwendung erstellt werden, würde ermöglichen, Übersetzer, die Ressourcen problemlos zu ändern.
Ich bin für diese Anwendung die SQL Server 2008 Express verwenden. Das Schema wird angezeigt, in Abbildung 9.
Abbildung 9 Schema für die Lokalisierung Tabellen in SQL Server 2008 Express
Ein Tag ist eine benannte Gruppe von Ressourcen. Eine StringResource ist die Entität, die eine Ressource darstellt. Die Gebietsschema-ID-Spalte steht für den Namen der Kultur, der die Ressource abgedeckt ist. Die Comment-Spalte wird aus Gründen der Kompatibilität mit der RESX-Format hinzugefügt. CreatedDate und ModifiedDate-Spalten werden für Überwachungszwecke hinzugefügt.
Ein StringResource kann mehrere Tags zugeordnet werden. Der Vorteil dabei ist, können bestimmte Gruppen (z. B. die Ressourcen für einen einzelnen Bildschirm) zu erstellen und nur die Ressourcen herunter. Der Nachteil ist, dass Sie mehrere Ressourcen mit dem gleichen LocaleId, Schlüssel und Tag zuweisen können. In diesem Fall sollten Sie einen Trigger erstellen oder Aktualisieren von Ressourcen verwalten, oder verwenden die ModifiedDate-Spalte, beim Abrufen der Ressource legt, fest um festzustellen, welche die aktuelle Ressource ist zu schreiben.
Ich werde zum Abrufen der Daten mithilfe von LINQ to SQL. Der erste Vorgang in einem Kulturnamen übernimmt und alle diese Kultur zugeordnete Ressourcen zurückgeben. Hier ist die Schnittstelle:
[ServiceContract] public interface ILocaleService { [OperationContract] Dictionary<string, string> GetResources(string cultureName); }
Hier ist die Implementierung:
public class LocaleService : ILocaleService { private acmeDataContext dataContext = new acmeDataContext(); public Dictionary<string, string> GetResources(string cultureName) { return (from r in dataContext.StringResources where r.LocaleId == cultureName select r).ToDictionary(x => x.Key, x => x.Value); } }
Der Vorgang findet einfach alle Ressourcen, deren LocaleId CultureName-Parameter entspricht. Das DataContext-Feld ist eine Instanz von LINQ to SQL-Klasse, die die SQL Server-Datenbank verknüpft. Das war's! LINQ und WCF stellen die Dinge so einfach.
Jetzt ist es Zeit für den WCF-Dienst mit der SmartResourceManager-Klasse zu verknüpfen. Nach dem Hinzufügen von Dienstverweisen auf die Silverlight-Anwendung, registriert das abgeschlossene Ereignis für den Betrieb des GetResources im Konstruktor empfangen werden:
public SmartResourceManager() { Instances.Add(this); localeClient.GetResourcesCompleted += localeClient_GetResourcesCompleted; if (Instances.Count == 0) { ChangeCulture(Thread.CurrentThread.CurrentUICulture); } }
Die Rückrufmethode sollte die Liste der Ressourcensets Ressourcensets hinzu, und machen Sie die Ressource zum aktiven Satz festgelegt. Dieser Code ist in Abbildung 10 dargestellt.
Abbildung 10 Hinzufügen von Ressourcen
private void localeClient_GetResourcesCompleted(object sender, LocaleService.GetResourcesCompletedEventArgs e) { if (e.Error != null) { var evt = CultureChangeError; if (evt != null) evt(this, new CultureChangeErrorEventArgs( e.UserState as CultureInfo, e.Error)); } else { if (e.Result == null) return; CultureInfo culture = e.UserState as CultureInfo; if (culture == null) return; ResourceSets.Add(culture.Name, e.Result); ResourceSet = e.Result; Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = culture; } }
Die ChangeCulture-Methode muss geändert werden, um einen Aufruf an die WCF-Operation durchzuführen:
public void ChangeCulture(CultureInfo culture) { if (!ResourceSets.ContainsKey(culture.Name)) { localeClient.GetResourceSetsAsync(culture.Name, culture); } else { ResourceSet = ResourceSets[culture.Name]; Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = culture; } }
Beim Laden des neutralen Gebietsschemas
Diese Anwendung benötigt eine Möglichkeit zum Wiederherstellen, falls die Web Services können keine Verbindung hergestellt werden oder ein Timeout sind. Eine Ressourcendatei mit die neutralen Sprachressourcen sollte außerhalb der Webdienste gespeichert und beim Start geladen werden. Dies dient als Fallback und eine Leistungsverbesserung der über die Service-Aufruf.
Ich werde eine andere SmartResourceManager-Konstruktor mit zwei Parametern erstellen: eine URL, die auf die Ressourcendatei für die neutrale Sprache und Kulturcode zur Kennzeichnung der Kultur der Ressourcendatei (finden Sie unter Abbildung 11).
Abbildung 11 beim Laden des neutralen Gebietsschemas
public SmartResourceManager(string neutralLanguageFile, string neutralLanguage) { Instances.Add(this); localeClient.GetResourcesCompleted += localeClient_GetResourcesCompleted; if (Instances.Count == 1) { if (string.IsNullOrWhiteSpace(neutralLanguageFile)) { // No neutral resources ChangeCulture(Thread.CurrentThread.CurrentUICulture); } else { LoadNeutralResources(neutralLanguageFile, neutralLanguage); } } }
Wenn keine neutrale Ressource-Datei vorhanden ist, wird der normale Prozess des Aufrufens des WCF-Aufrufs durchgeführt. LoadNeutralResources-Methode verwendet ein WebClient, um die Ressourcendatei vom Server abgerufen werden. Anschließend analysiert die Datei und die XML-Zeichenfolge in ein Dictionary-Objekt konvertiert. Ich den Code anzeigen wird nicht hier, wie es ein bisschen zu lang und etwas trivial ist, aber Sie es im Codedownload für diesen Artikel finden Wenn Sie sich interessieren.
Um den parametrisierten SmartResourceManager-Konstruktor aufrufen, muss die Instanziierung der SmartResourceManager in der Code-Behind der App-Klasse zu verschieben, (Da Silverlight XAML 2009 nicht unterstützt). Hartcodieren soll der Ressourcendatei oder den Kulturcode, allerdings nicht so dass ich werde eine benutzerdefinierte ConfigurationManager-Klasse zu erstellen, die Sie im Codedownload Auschecken können.
Nach der Integration der ConfigurationManager in die App-Klasse, sieht die Startup-Ereignis Callback-Methode:
private void Application_Startup(object sender, StartupEventArgs e) { ConfigurationManager.Error += ConfigurationManager_Error; ConfigurationManager.Loaded += ConfigurationManager_Loaded; ConfigurationManager.LoadSettings(); }
Die Start-Rückrufmethode dient jetzt laden die Anwendungseinstellungen und für Rückrufe registrieren. Wenn Sie dem Laden von Konfigurationseinstellungen für den Hintergrund aufzurufen, achten Sie darauf, dass Sie die Racebedingungen, die Sie stoßen können. Hier werden die Rückrufmethoden für die ConfigurationManager-Ereignisse:
private void ConfigurationManager_Error(object sender, EventArgs e) { Resources.Add("SmartRM", new SmartResourceManager()); this.RootVisual = new MainPage(); } private void ConfigurationManager_Loaded(object sender, EventArgs e) { Resources.Add("SmartRM", new SmartResourceManager( ConfigurationManager.GetSetting("neutralLanguageFile"), ConfigurationManager.GetSetting("neutralLanguage"))); this.RootVisual = new MainPage(); }
Die Error-Ereignismethode Rückruf lädt SmartResourceManager ohne eine neutrale Sprache und die Loaded-Ereignis Callback-Methode lädt eine neutrale Sprache.
Ich muss die Ressourcendatei an einem Speicherort abgelegt, wo ich alles neu kompilieren, wenn ich ihn ändern verfügen. Ich werde es im ClientBin Verzeichnis des Webprojekts gespeichert und nach dem Erstellen der Ressourcendatei, werde ich Ihrer Erweiterung zu XML ändern, sodass es öffentlich zugänglich ist und die WebClient-Klasse darauf aus der Silverlight-Anwendung zugreifen kann. Da Sie öffentlich zugänglich ist, speichern Sie nicht vertraulichen Daten, in der Datei.
ConfigurationManager liest auch aus dem ClientBin Verzeichnis. Das Programm sucht nach einer Datei namens appSettings.xml, und die Datei sieht folgendermaßen aus:
<AppSettings> <Add Key="neutralLanguageFile" Value="strings.xml"/> <Add Key="neutralLanguage" Value="en-US"/> </AppSettings>
Nach appSettings.xml und strings.xml vorhanden sind, können ConfigurationManager und SmartResourceManager zusammenarbeiten, um die neutrale Sprache zu laden.Es ist Raum für Verbesserungen in diesem Prozess, denn wenn aktive Threadkultur sich von der neutralen Sprache unterscheidet und der Web-Dienst nicht verfügbar ist, die Kultur des Threads aktiv anders als die aktive Ressourcensatz.Ich werde, die als Übung für Sie lassen.
Zusammenfassung
Was ich in diesem Artikel gehen nicht über wurde die Ressourcen auf der Serverseite normalisieren.Nehmen wir an, dass die Ressource fr-FR zwei Schlüssel fehlt, die die fr-Ressource verfügt.Beim Anfordern von fr-FR-Ressourcen sollten der Webdienst die fehlenden Schlüssel aus der allgemeineren fr-Ressource einfügen.
Ein weiterer Aspekt, der in diese Lösung integriert ist, die ich nicht behandelt habe Laden von Ressourcen durch Kultur und Ressource-Satz statt nur Kultur ist.Dies ist nützlich für das Laden von Ressourcen pro Bildschirm oder XAP-Datei.
Die Lösung, die Sie über hier natürlich lässt einige nützliche Dinge, jedoch einschließlich Ladelisten Ressourcensets zur Laufzeit mit einem beliebigen Format zum Speichern von Ressourcen, ohne zu kompilieren und verzögerte Laden Ressourcen ändern möchten.
Die hier vorgestellte Lösung allgemeine, und Sie können hinein in mehreren Punkten einbinden und deutlich verändern die Implementierung.Ich hoffe, dass dadurch Ihre täglichen programming Last zu verringern.
Für weitere eingehende Lektüre über Internationalisierung, Besuche das Buch "NET Internationalisierung:. Die Developer's Guide to Building Global Windows-und Web-Anwendungen" (Addison-Wesley, 2006), by Guy Smith-Ferrier.Smith-Ferrier hat auch eine großartige Videoqualität auf Internationalisierung auf seiner Website.Das Video wird aufgerufen, "Internationalizing Silverlight am SLUGUK")Bit.LY/gJGptU).
Matthew Delisle genießt Erforschung der Software und Hardware-Aspekte von Computern. Seine erste Tochter entstand im Jahr 2010und er denkt er ist nun fast fertig programming seine berufliche Laufbahn beginnen.
Dank an den folgenden technischen Experten für die Überprüfung dieses Artikels: John Brodeur
Receive the MSDN Flash e-mail newsletter every other week, with news and information personalized to your interests and areas of focus.