Lokalisierung mit Cultures
Um ein .Net Webprojekt zu lokalisieren, wurden bis anhin bei uns sämtliche Elemente in separaten Strings übersetzt gehalten und zur Laufzeit mittels Select/Case (abhängig von der ausgewählten Sprache) ausgelesen und den Objekten zugeordnet. Ein Relikt aus alten Projekten..
Dass dies auch eleganter geht, zeigt das folgende Beispiel. Nachdem eine .aspx Seite aufgebaut wurde (inkl. Code-behind File), kann in Visual Studio 2005 unter „Tools“ der Punkt „Generate Local Resource“ ausgewählt werden. Es wird automatisch im Projekt ein Ordner App_LocalResources angelegt mit dem Namen der Webform und dem Zusatz .apsx.resx. In dem File finden sich sämtliche verwendeten Elemente der .aspx Seite wieder, zu jedem Element existiert ein String mit dem angezeigten Text. Die Liste kann manuell beliebig erweitert werden, falls neue Buttons oder was auch immer zur Seite hinzugefügt werden. Nun kann das .resx File kopiert und umbenannt werden, beispielsweise „Default.aspx.de-CH.resx“ oder „Default.aspx.en-US.resx“. Der Filenamen enthält nun bereits die Sprachspezifikation. Die einzelnen Strings in den Files können bequem übersetzt werden, Visual Studio stellt dafür einen kleinen Editor zur Verfügung.
Zur Laufzeit kann nun innerhalb der Webform „CurrentCulture“ und „CurrentUICulture“ gesetzt werden, aufgrund dieser Auswahl wird das entsprechende .resx File eingelesen und die Strings automatisch auf die Objekte gemappt. Natürlich können die Strings aber auch manuell ausgelesen werden. Hier ein Codesample:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;
using System.Globalization;
public partial class _Default : System.Web.UI.Page
{
// Methode um manuell ein ResouceObject auszulesen
public string G(string sKey)
{
return GetLocalResourceObject(sKey).ToString(); ;
}
// Init
protected override void InitializeCulture()
{
base.InitializeCulture();
string selectedLanguage = "de-CH";//""en-US";
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
}
// Einem ASP Button einen String manuell zuweisen
protected void Page_Load(object sender, EventArgs e)
{
Button1.Text = G("Button1Resource1.Text");
}
}