DevTrain

Autor: Rene Paschold

Lokalisierung die 2te: Ressourcedateien verwenden

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


Erfasst am: 10.11.2003 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=895
© Copyright 2003 ppedv AG - http://www.ppedv.de