Navigation and service panel


Content

This text is fallbacked from the German Version. If you need use Google Translate


Sprachspezifische Formatierungen

By Kevin Brechbühl on 23. November 2012, No comments

Verschiedene Texte wie Zahlen oder Preise sind pro Land und pro Sprache unterschiedlich formatiert. Z.B. verwendet man in Deutschland als Dezimalzeichen einer Preisangabe ein Komma (,) und in der Schweiz ein Punkt (.). Das gleiche gilt für Daten: Im Englischen wird ein Datum mit einem Schrägstrich getrennt (23/11/2012) und im Deutschen mit einem Punkt (23.11.2012). Der folgende Beitrag zeigt, wie die kulturabhängige Formatierung (pro Land/Sprache) auch in Sitecore möglich ist.

In einer ASP.net Anwendung hat jeder Thread eine sogenannte Culture zugewiesen. Das CultureInfo-Objekt definiert die Ausgabe sämtlicher sprach- oder landesabhängigen Informationen über das .net Framework. Beim Formatieren eines Strings kann man ebenfalls eine CultureInfo mitgeben, so dass die entsprechende Culture zur Formatierung verwendet wird. Folgender Code formatiert den Preis in Englisch:

decimal amount = 10;
string.Format(new System.Globalization.CultureInfo("en-GB"), "{0:C}", amount);

Wird keine CultureInfo mitgegeben, so wird die Culture des aktuellen Threads verwendet. In Sitecore besitzt man neben dem globalen Sitecore.Context auch immer eine Sprache, welche in Sitecore.Context.Language hinterlegt ist. Jede Sprache, welche unter /sitecore/system/Languages gepflegt ist hat ein Feld "Regional ISO Code", welche doch eigentlich die Culture für die aktuelle Sprache festlegen sollte? Leider setzt Sitecore die Culture des aktuellen Threads nicht und man kann somit nicht auf eine automatische sprachabhängige Formatierung zurückgreifen (standardmässig hat ein Thread immer die in Windows hinterlegte Sprache als Culture).

Über einen Pipeline Processor kann jedoch die Culture anhand der aktuellen Sprache selbst gesetzt werden. Folgender Processor in der httpRequestBegin-Pipeline übernimmt dies:

public class CultureResolver
{
    public void Process(HttpRequestArgs args)
    {
        if (Sitecore.Context.Language != null && Sitecore.Context.Database != null && !string.IsNullOrEmpty(Sitecore.Context.Language.Name))
        {
            Item language = Sitecore.Context.Database.GetItem("/sitecore/system/Languages/" + Sitecore.Context.Language.Name);
            if (language != null)
            {
                CultureInfo culture = new CultureInfo(language["regional iso code"]);
                if (culture != null)
                {
                    System.Threading.Thread.CurrentThread.CurrentCulture = culture;
                    System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
                }
            }
        }
    }
}

Dieser sollte direkt unterhalb des LanguageResolver von Sitecore ausgeführt werden. Somit muss er wie folgt konfiguriert werden:

<pipelines>
    <httpRequestBegin>
        <processor  patch:after="processor[@type='Sitecore.Pipelines.HttpRequest.LanguageResolver, Sitecore.Kernel']"
                    type="Unic.Pipelines.HttpRequest.CultureResolver, Unic" />
    </httpRequestBegin>
</pipelines>

Somit ist die Culture von .net immer auf die aktuelle Sprache eingestellt und sämtliche Formatierungen werden richtig ausgegeben.

No comments

Add your comment

Your email address will not be published. Required fields are marked *

*