DevTrain

Autor: Hannes Preishuber

Zahlenumwandlung landesspezifisch mit Cultureinfo

Beim erstellen einer Website für mehrere Sprachen kann mit dem Ressource Manager die Ausgabe beinflusst werden. Aber  auch bei der Eingabe gibt es kulturelle Unterschiede. Zuerst wird dabei wahrscheinlich an Datumswerte gedacht. Dabei  sind selbst bei normalen Zahlen die kleinen Unterschiede von weitreichender Bedeutung. Bestellt der Kunde 1,111 oder 1.111 wird je nach Ordergebiet unterschiedliche Lieferungen erzeugen.

Gesteuert wird dieses Verhalten über die Kultur Einstellungen. Zunächst muss festgehalten werden, das die Kultur 
Info (Culture Info) etwas anderes wie die Sprachinfo ist. Im Österreich heißt es Krapfen und in Deutschland 
Berliner (auch nicht überall). Deshlab sind Culture Info Codes auch aus zwei Teilen zusammengesetzt. Z.b. de-DE.

Der nächste Punkt ist, das an verschiedenen Stellen darauf Einfluss genommen werden kann.

Installierte Sprachversion des Betriebsystem

Vermutlich gibt es noch einige Ecken mehr an dem man hier Schaden anrichten kann.

Zunächst befassen wir uns mit der Browsersprache. Diese wird im Request mitgegeben. Dabei kann es mehrere Sprachen  geben die in einem Array abgelegt sind. In diesem Artikel wird später noch eine Sprache ergänzt.
Response.Write(Request.UserLanguages(0) + "<br>")

Das sagt aber noch immer nicht mit Sicherheit mit welcher Cultureinfo gerade gearbeitet wird. Um dies aber 
zweifelsfrei feststellen zu können, muss der aktuelle Thread angefasst werden. Zunächst ist es nötig den Namensraum 
System Threading einzubinden. Über das Proberty Name von CurrentCulture erhält man den zusammengesetzten Code.
Response.Write(Thread.CurrentThread.CurrentCulture.Name)

       


Unsere sehr einfache Aufgabe ist, wie aus dem Bild bereits ersichtlich, einen Zahlenwert einzugeben und wieder 
anzuzeigen. Für die Auswahl der Culture wird eine Radiobuttonlist eingebaut. Die Zahl wird erfasst, konvertiert und 
 wieder ausgegeben.
Dafür muss zunächst ein CultureInfo Objekt instanziert werden. Diesem gibt man als Parameter den Culture Namen mit  und als zweiten Parameter ob die Benutereinstellungen berücksichtigt werden. Mit False werden diese ignoriert. Um  diese Funktion verwenden zu können muss noch der Namensraum Imports System.Globalization eingebaut werden.

Dieses Objekt wird dann dem Currentthread und der CurrentCulture zugewiesen. Schon hat man für dieses Stück Code  die Culture und damit auch das Verhalten von Konvertierungen geändert.
Bei verschiedenen Umwandlungen kann die Culture auch als Parameter mitgegeben werden, wie hier bei der ToString  Methode. Mit dem N Parameter wird ein Standard Nummer Format der jeweiligen Landessprache erzeugt.
Dim cul1 As New CultureInfo(RadioButtonList1.SelectedValue, False)
Thread.CurrentThread.CurrentCulture = cul1
Dim zahl As Double = CType(TextBox1.Text, Double)
Label1.Text = zahl.ToString("n", cul1)

Was passiert, wenn der Benutezr in den Systemeinstellungen das Land wechselt?

Dann ändert sich eigentlich gar nichts. Einzig im Request Header ist eine andere Culture angegeben.

Nun überschreiben wir in den Einstellungen des Browsers die Sprache. Eigentlich wird hier Arabisch ergänzt und an 
die erste Stelle gereiht.

Auch hier sind die Auswirkungen auf die Funktion gering. Eingaben in für uns üblicher Schreibweise werden anstandslos akzeptiert.

Richtig interessant wird es erst, wenn es voll dynamisch wird. Abhängig von der Landessprache des Browsers bzw. 
deren Einstellung, soll eine Konvertierung durchgeführt werden. Die Erkennung der Sprache wurde hier schon gezeigt. 
Für Testzwecke werden allerdings zwei Listen genommen um die Quell- und Zielplattform angeben zu können.


Wie aus dem Beispiel ersichtlich werden nun zwei CultureInfo Objekte benötigt. Dabei wird die Umgebungsculture auf 
einen anderen Wert gesetzt als bei der Konvertierung mit ToString angegeben.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim cul1 As New CultureInfo(RadioButtonList1.SelectedValue, False)
        Dim cul2 As New CultureInfo(RadioButtonList2.SelectedValue, False)
        Thread.CurrentThread.CurrentCulture = cul1
        Dim zahl As Double = CType(TextBox1.Text, Double)
        Label1.Text = zahl.ToString("n", cul2)
End Sub

Dabei führt eine Eingabe von 10.000,1212 unweigerlich zu einer Fehlermeldung, wenn als Quelle en-US angegeben wird. 
Ist auch logisch, da dort Komma und Punkt anders verwendet werden.

Damit ist nur ein kleiner aber wichtiger Teil von mehrsprachigen Websites behandelt.
Dabei trifft das Thema auch den "normalen" Winforms Entwickler.

 


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