Im Artikel Lokalisierung von Webseiten wurde auf Globalisierungs- und Lokalisierungsfunktionen welche automatisch in ASP .NET zur Verfügung stehen, eingegangen. Doch spätestens wenn es sich um umfangreiche Texte handelt, reichen diese Funktionen nicht mehr aus. Zu diesem Zweck können Resourcedateien mit dem ResourceManager gelesen werden.
Ressourcedateien allgemein
Das .NET Framework bietet dem Programmierer drei unterschiedliche Formate für Ressourcedateien an:
Dieser Artikel beschäftigt sich mit dem Format XML. Ressourcedateien dieses Formats haben die Dateiendung .resx und werden bei der Verwendung von Visual Studio .NET automatisch für jede Code-Behind-Klasse erstellt. In einer Ressourcedatei können Texte sowie Bilder gespeichert werden, die für einen bestimmten Kulturkreis definiert werden.
Für jeden Kulturkreis den man ansprechen will muss eine eigene Ressourcedatei erstellt werden. Dabei wird eine bestimmte Notation für den Namen der Datei benötigt Die folgende Tabelle zeigt diese benötigte Notation:
Dateiname |
Erklärung |
texte.resx |
Standard-Ressourcedatei. Diese Datei wird immer dann verwendet wenn für einen ausgewählten Kulturkreis keine Ressourcedatei vorhanden ist. |
texte.de-DE.resx |
Ressourcedatei mit deutschen Inhalten. |
texte.en-GB.resx |
Ressoucedatei mit englischen Inhalten. |
Erstellung von Ressourcedateien
Das .NET Framework bietet ein Programm mit dem man relativ einfach Ressourcedateien erstellen kann. Wer das Visual Studio .NET sein eigen nennen kann der halt eine wesentlich einfachere Methode um Ressourcedateien zu erstellen. Die folgende Abbildung zeigt den Visual Studio .NET Ressourcedateien Editor:
Um Ressourcedateien zum aktuellen Projekt hinzuzufügen öffnet man den Projektmappen-Explorer, klickt mit der rechten Maustaste auf das Projekt und wählt Hinzufügen->Neues Element hinzufügen:
Nachdem die Datei erstellt wurde kann man anfangen die Inhalte zu pflegen. Für das Beispielprojekt wurde folgende Ressourcedatei erstellt:
Eine zweite Datei wurde für den englischen Inhalt angelegt.
Dynamisches Ändern der Texte
Um das ganze jetzt entsprechend mit den WebControls auf der Website zu verknüpfen wird der ResourceManager verwenden.
Um die DropDownList zu füllen wird folgende Methode verwendet:
'## KulturInfo auslesen und DropDownList füllen Private Sub LoadCultureList()
'## Variablen definieren Dim cInfo() As Globalization.CultureInfo Dim listItem As ListItem
'## Kulturinformationen auslesen cInfo = Globalization.CultureInfo.GetCultures( _ Globalization.CultureTypes.SpecificCultures)
'## Leeren Eintrag in die DropDownList schreiben listItem = New ListItem("---") ddlKultur.Items.Add(listItem)
Dim strDisplay As String Dim strValue As String
'## Alle verfügbaren Kulturkreise in die DropDownList schreiben For Each culture As Globalization.CultureInfo In cInfo
strDisplay = culture.DisplayName & " (" & culture.Name & ")" strValue = culture.LCID.ToString()
listItem = New ListItem(strDisplay, strValue) ddlKultur.Items.Add(listItem)
Next
End Sub |
Wenn ein anderer Eintrag aus der DropDownList gewählt wird, dann wird folgender Code ausgeführt:
'## Wenn die Kultur gewechselt wird dann ... Private Sub ddlKultur_SelectedIndexChanged( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ddlKultur.SelectedIndexChanged
Dim selectedCulture As String = ddlKultur.SelectedItem.Value
'## DropDownList prüfen ob ausgewählt If (selectedCulture = "---") Then
lblKName.Text = "" lblKShort.Text = ""
Else
'## CultureInfo anhand der ausgwählten Kultur setzen Dim cultureInfo As New Globalization.CultureInfo( _ Integer.Parse(selectedCulture))
'## CulturInformation in den aktuellen Thread schreiben Threading.Thread.CurrentThread.CurrentCulture = cultureInfo Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo
'## Info Labels zuweisen lblKName.Text = cultureInfo.DisplayName lblKShort.Text = cultureInfo.Name
'## Funktion aufrufen Me.SetKultur(Integer.Parse(selectedCulture))
End If
End Sub |
Zu guter letzt muss die entsprechende Ressourcedatei ausgelesen und der Inhalt den WebControls zugeordnet werden.
'## Informationen anhand der CultureInfo aus der Resourcedatei '## lesen und die entsprechenden Labels und Buttons füllen Private Sub SetKultur(ByVal Culture As Integer) Dim rm As System.Resources.ResourceManager
'## Prüfen ob Kutlur ausgewählt wurde If (Culture <> 0) Then
'## Übergebene CultureInfo in CultureInfo Instanz speichern Dim kInfo As New System.Globalization.CultureInfo(Culture)
Threading.Thread.CurrentThread.CurrentCulture = kInfo Threading.Thread.CurrentThread.CurrentUICulture = kInfo
'## ResourceMananger initialsieren rm = New System.Resources.ResourceManager("ResourceDateien.texte", _ System.Reflection.Assembly.GetExecutingAssembly())
'## Inhalten der ResourceDatei in die Labels schreiben lblNachricht.Text = rm.GetString("nachricht") lblVorname.Text = rm.GetString("vorname") lblNachname.Text = rm.GetString("nachname") lblEmail.Text = rm.GetString("email") lblAnschrift.Text = rm.GetString("anschrift") lblLand.Text = rm.GetString("land") btnGo.Text = rm.GetString("senden")
End If
End Sub |
Sobald jetzt eine andere Kultur in der DropDownList gewählt wird ändert der ResourceManager die entsprechenden Texte. Wird versucht eine Kultur zu wählen für die keine Ressourcedatei erstellt wurde, dann wird automatisch die Standardressourcedatei gewählt!
Hier noch die zur Vollständigkeit die Page_Load Methode:
Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load
If Not (IsPostBack) Then Me.LoadCultureList()
End Sub |
Viel Spaß beim testen :p