Diese Website verwendet Cookies für Analysen, personalisierte Inhalte und Werbung. Indem Sie diese Website nutzen, erklären Sie sich mit dieser Verwendung einverstanden. Weitere Informationen
Microsoft Logo
Gray Pipe
  • Developer Network
    • Downloads
      • Visual Studio
      • SDKs
      • Testsoftware
    • Programme
      • Abonnements
      • Students
      • ISV
      • Start-ups
      • Veranstaltungen
    • Community
      • Magazine
      • Foren
      • Blogs
      • Channel 9
    • Dokumentation
      • Microsoft API- und Referenzkatalog
      • Entwicklungscenter
      • Zurückgezogene Inhalte
    • Code
Developer Network Developer
MSDN-Abonnements
Tools herunterladen
Magazin
  • Ausgaben und Downloads
    • Alle Ausgaben
    • 2109
      • January 2019
    • 2018
      • Connect(); 2018
      • Dezember 2018
      • November 2018
      • Oktober 2018
      • September 2018
      • August 2018
      • Juli 2018
      • Juni 2018
      • Mai 2018
      • April 2018
      • März 2018
      • Februar 2018
      • Januar 2018
    • 2017
      • Dezember 2017
      • November 2017
      • Oktober 2017
      • September 2017
      • August 2017
      • Juni 2017
      • Mai 2017
      • April 2017
      • März 2017
      • Februar 2017
      • Januar 2017
    • 2016
      • Dezember 2016
      • Connect(); 2016
      • November 2016
      • Oktober 2016
      • September 2016
      • August 2016
      • Juli 2016
      • Juni 2016
      • Mai 2016
      • April 2016
      • März 2016
      • Februar 2016
      • Januar 2016
    • 2015
      • Dezember 2015
      • November 2015
      • SONDERAUSGABE 2015 ZU WINDOWS 10
      • Oktober 2015
      • September 2015
      • August 2015
      • Juli 2015
      • Juni 2015
      • Mai 2015
      • April 2015
      • März 2015
      • Februar 2015
      • Januar 2015
    • 2014
      • MSDN Magazin Sonderausgabe 2014
      • MSDN Magazin Dezember 2014
      • MSDN Magazin November 2014
      • MSDN Magazin Oktober 2014
      • MSDN Magazin September 2014
      • MSDN Magazin August 2014
      • MSDN Magazin Juli 2014
      • MSDN Magazin Juni 2014
      • MSDN Magazin Mai 2014
      • MSDN Magazin April 2014
      • MSDN Magazin März 2014
      • MSDN Magazin Februar 2014
      • MSDN Magazin Januar 2014
    • 2013
      • MSDN Magazin Dezember 2013
      • MSDN Magazin November 2013
      • MSDN Magazin Oktober 2013
      • MSDN Magazin September 2013
      • MSDN Magazin August 2013
      • MSDN Magazin Juli 2013
      • MSDN Magazin Juni 2013
      • MSDN Magazin Mai 2013
      • MSDN Magazin April 2013
      • MSDN Magazin März 2013
      • MSDN Magazin Februar 2013
      • MSDN Magazin Januar 2013
    • 2012
      • MSDN Magazin Dezember 2012
      • MSDN Magazin November 2012
      • MSDN Magazin Oktober 2012
      • MSDN Magazin Windows 8 – Sonderausgabe 2012
      • MSDN Magazin September 2012
      • MSDN Magazin August 2012
      • MSDN Magazin Juli 2012
      • MSDN Magazin Juni 2012
      • MSDN Magazin Mai 2012
      • MSDN Magazin April 2012
      • MSDN Magazin März 2012
      • MSDN Magazin Februar 2012
      • MSDN Magazin Januar 2012
      • MSDN Magazine-Ausgaben von 2012
    • 2011
      • MSDN Magazin Dezember 2011
      • MSDN Magazin November 2011
      • MSDN Magazin Oktober 2011
      • MSDN Magazin September 2011
      • MSDN Magazin August 2011
      • MSDN Magazin Juli 2011
      • MSDN Magazin Juni 2011
      • MSDN Magazin Mai 2011
      • MSDN Magazin April 2011
      • MSDN Magazin März 2011
      • MSDN Magazin Februar 2011
      • MSDN Magazin Januar 2011
    • 2010
      • MSDN Magazin Dezember 2010
      • MSDN Magazin November 2010
      • MSDN Magazin Oktober 2010
      • MSDN Magazin September 2010
      • MSDN Magazin August 2010
      • MSDN Magazin Juli 2010
      • MSDN Magazin Juni 2010
      • MSDN Magazin Mai 2010
      • MSDN Magazin April 2010
      • MSDN Magazin März 2010
      • MSDN Magazin Februar 2010
      • MSDN Magazin Januar 2010
    • 2009
      • MSDN Magazin Dezember 2009
      • MSDN Magazin November 2009
      • MSDN Magazin Oktober 2009
      • MSDN Magazin September 2009
      • MSDN Magazin August 2009
      • MSDN Magazin Juli 2009
      • MSDN Magazin Juni 2009
      • MSDN Magazin Mai 2009
      • MSDN Magazin April 2009
      • MSDN Magazin März 2009
      • MSDN Magazin Februar 2009
      • MSDN Magazin Januar 2009
  • Abonnieren
  • Artikel einsenden
search clear
Es tut uns leid. Der angeforderte Inhalt wurde entfernt. Sie werden in 1 Sekunde automatisch umgeleitet.
Ausgaben und Downloads 2011 MSDN Magazin März 2011 Silverlight-Lokalisierung: Tipps und Tricks für das Laden von Silverlight-Locale-Ressourcen

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:

C#
Kopieren
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:

C#
Kopieren
<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:

C#
Kopieren
<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:

XML
Kopieren
<SupportedCultures> (fr) </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:

XML
Kopieren
< Param Name = "Uiculture"Wert = "< % %=Thread.CurrentThread.CurrentCulture.Name >"/ >

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:

XML
Kopieren
< Globalization Culture = "auto"UiCulture = "auto" / >

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:

XML
Kopieren
[assembly: NeutralResourcesLanguageAttribute("en")]

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

C#
Kopieren
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:

C#
Kopieren
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

VB
Kopieren
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

C#
Kopieren
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:

XML
Kopieren
<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

VB
Kopieren
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:

XML
Kopieren
<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:

XML
Kopieren
< Globalization Culture = "auto"UiCulture = "auto" >< / Globalisierung >

Außerdem muss das Silverlight-Objekt in der ASPX-Datei in dem Thread aktuelle UI Culture-Wert als Parameter übergeben werden:

XML
Kopieren
< Param Name = "Uiculture"Wert = "< % %=Thread.CurrentThread.CurrentCulture.Name >"/ >

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:

C#
Kopieren
(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:

C#
Kopieren
[ServiceContract]
public interface ILocaleService {
  [OperationContract]
  Dictionary<string, string> GetResources(string cultureName);
}

Hier ist die Implementierung:

C#
Kopieren
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:

C#
Kopieren
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

C#
Kopieren
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:

C#
Kopieren
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

C#
Kopieren
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:

VB
Kopieren
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:

C#
Kopieren
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:

XML
Kopieren
<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

 

MSDN Magazine Blog

14 Top Features of Visual Basic 14: The Q&A
Wednesday, Jan 7
Big Start to the New Year at MSDN Magazine
Friday, Jan 2

More MSDN Magazine Blog entries >


Current Issue


November 2018

Browse All MSDN Magazines


Subscribe to the MSDN Flash newsletter Subscribe to MSDN Flash newsletter


Receive the MSDN Flash e-mail newsletter every other week, with news and information personalized to your interests and areas of focus.

Folgen Sie uns
  • https://www.facebook.com/microsoftdeveloper
  • https://twitter.com/msdev
  • https://plus.google.com/111221966647232053570/
Registrieren Sie sich für den MSDN Newsletter
Ist diese Seite hilfreich?
Ihr Feedback ist uns wichtig.
Teilen Sie uns Ihre Meinung mit.
Weiteres Feedback?
1500 verbleibende Zeichen
Vielen Dank!
Vielen Dank für Ihr Feedback.

Entwicklungscenter

  • Windows
  • Office
  • Visual Studio
  • Microsoft Azure
  • Mehr...

Lernressourcen

  • Microsoft Virtual Academy
  • Channel 9
  • MSDN Magazine

Community

  • Foren
  • Blogs
  • CodePlex

Support

  • Selbsthilfe

Programme

  • BizSpark (für Startups)
  • Microsoft Imagine (for students)
Deutschland (Deutsch)
  • Impressum
  • Newsletter
  • Datenschutz & Cookies
  • Nutzungsbedingungen
  • Marken
logo © 2019 Microsoft