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:
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 :)