DevTrain

Autor: Rene Paschold

Lokalisierung von Webseiten

Das entwickeln von internationalen Webanwendungen war bisher sehr aufwendige Programmierarbeit da oftmals für nationale Darstellungen eigene Webseiten entwickelt werden mußten. Dies ist beispielsweise für die Darstellung von Datumswerten oder Währungsbeträge der Fall gewesen.

Die Framework Class Library stellt uns dafür einen eigenen Namespace zur Verfügung:
System.Globalization

Darin enthalten sind umfangreiche Klassen um internationale Regionen und Kulturkreise verwenden zu können ohne das man für jede Sprache eine eigene Webseite programmieren muss.

Kulturen
Bei der Entwicklung mit .NET unterscheidet man zwischen drei verschiedenen Kulturarten.

Kulturart Beschreibung
Invariante Kultur Diese Kultur ist sprachlich dem englischen zugeordnet aber keinem Land und keiner Region. Verwendet wird diese Kulturart dann wenn kulturelle Informationen, aber kein spezielles Land oder Region definiert werden. 
Neutrale Kultur Die neutrale Kultur kommt dann zum Einsatz wenn Kulturen einer Sprache, aber keinem Land und keiner Region zugewiesen sind. Beispielsweise die deutsche Sprache: In Europa wird diese von mehreren Ländern verwendet. Deutschland, Österreich, Luxemburg, Schweiz und Lichtenstein. Aus diesem Grund kann auf Recourcen der gleichen Sprache zugegriffen werden.
Spezifische Kultur Diese Kultur kommt dann zum Einsatz wenn sich die Sprache, das Land und die Region fest zuordnen lassen. Erst durch diese explizite Zuordnung bekommt man Zugang zu Datums- und Zahlenformaten sowie weitere Werte die in der Systemsteuerung unter Ländereinstellungen gesetzt werden können.


Kulturnamen
Jeder Kulturname hat eine eindeutige Kennzeichnung. Diese Kennzeichnung wird wie folgt zusammengesetzt:
Zwei Kleinbuchstaben für den Sprachcode sowie zwei Grußbuchstaben für den Landes-/Regionscode. Im folgenden findet man einen Auszug der verschiedenen Kulturnamen.

Kulturname Kulturbezeichner Sprache Land/Region
de 0x0007 Deutsch
de-AT 0x0C07 Deutsch Österreich
de-DE 0x0407 Deutsch Deutschland
de-LI 0x1407 Deutsch Liechtenstein
de-LU 0x1007 Deutsch Luxemburg
de-CH 0x0807 Deutsch Schweiz
en 0x0009 Englisch
en-AU 0x0C09 Englisch Australien
en-CA 0x1009 Englisch Kanada
en-NZ 0x1409 Englisch Neuseeland
en-GB 0x0809 Englisch Großbritannien
en-US 0x0409 Englisch USA
ru 0x0019 Russisch
ru-RU 0x0419 Russisch Russland
fr 0x000C Französisch
fr-BE 0x080C Französisch Belgien
fr-CA 0x0C0C Französisch Kanada
fr-LU 0x140C Französisch Luxemburg
fr-FR 0x140C Französisch Frankreich

Nun aber genug Theorie. Wie kann man jetzt die verschiedenen Kulturen auf seiner Webseite verwenden? Es gibt zwei Wege dies zu tun. Einmal global über die web.config oder dynamisch im SourceCode.

web.config
Die web.config stellt dem Entwickler ein Element zur Verfügung mit dem man die komplette Lokalisierung für das Webprojekt vornehmen kann. Folgendes Beispiel soll dies verdeutlichen:

<configuration>
  <system.web>
    <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="de-DE"
    uiCulture="de-DE" />
  </system.web>
</configuration>

Folgende Attribute sind für das globalization Element verfügbar:

Attribut Beschreibung
requestEncoding Encoding-Format für eine eingehende Anfrage an den Webserver.
responseEncoding Encoding-Format für eine Ausgabe.
fileEncoding Standard Encoding-Format für aspx, asmx und asax Dateien.
culture Die Standard-Kulturinformation für Ressourcen der Anwendung.
uiCulture Die Standard-Kulturinformation für Formatierungen von Ausgaben

Dynamische Lokalisierung
Die Lösung mittels der web.config ist eine einfache und schnell Sache allerdings reicht es für die meisten Anwendungen nicht aus feste Lokalisierungen vorzunehmen. Um die Kulturinformationen zu Laufzeit zu ändern wird ein Zugriff auf den aktuellen Thread benötigt. Diese geschieht mit Hilfe der Klasse Symste.Threading.

Beispiel:
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE")
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US")

Im folgenden findet man ein komplettes Beispiel welches die Lokalisierung verdeutlichen soll:

Vor Auswahl Nach Auswahl

Die DropDownList wird dynamisch mit allen Kulturinformationen gefüllt die das .NET Framework zur Verfügung stellt. Hier der entsprechende Code:

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

Private Sub LoadCultureList()

  Dim cInfo() As Globalization.CultureInfo
  Dim listItem As ListItem

  '-- Kulturinformationen auslesen
  cInfo = Globalization.CultureInfo.GetCultures( _
   Globalization.CultureTypes.SpecificCultures)

  listItem = New ListItem("---")

  ddlKultur.Items.Add(listItem)

 
Dim strDisplay As String
 
Dim strValue As String

  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


Als nächstes soll mit Auswahl einer Kultur die Darstellung der Seite entsprechend geändert würde. Dazu setzt man die Eigenschaft AutoPostBack der DropDownList auf True und erzeugt folgende Methode:

Private Sub ddlKultur_SelectedIndexChanged(ByVal sender As System.Object, _
 
ByVal e As System.EventArgs) Handles ddlKultur.SelectedIndexChanged

  Dim selectedCulture As String = ddlKultur.SelectedItem.Value

 
If (selectedCulture = "---") Then
   
lblDatum.Text = ""
    lblKulturAnzeige.Text = ""
    lblKulturName.Text = ""
    lblWaehrung.Text = ""
    Calendar1.Visible =
False
 
Else
   
Dim cultureInfo As New Globalization.CultureInfo( _
    
Integer.Parse(selectedCulture))
    Dim money As Decimal = Decimal.Parse("8932.64")

    Threading.Thread.CurrentThread.CurrentCulture = cultureInfo
   
Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo

   
lblKulturAnzeige.Text = cultureInfo.DisplayName
   
lblKulturName.Text = cultureInfo.Name
   
lblDatum.Text = Date.Now.ToLongDateString() & " " & _
   
Date.Now.ToLongTimeString()
   
lblWaehrung.Text = Microsoft.VisualBasic.FormatCurrency(money)
   
Calendar1.Visible = True
 
End If

End Sub

Hier noch ein Screenshot vom Aufbau der ASPX Seite:

Viel Spaß damit :)


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