AutoCAD und .Net Framework - Globalisierung oder wie wird sprachunabhängig programmiert -
Freitag, 8. Januar 2010Ich muss mein erstes Programm für unterschiedlichen Sprachen - englisch, tschechisch, deutsch etc. - zur Verfügung stellen. Das Programm wird u.a. in Toronto, Kanada eingesetzt, was mich schon ein wenig stolz macht.
Ich möchte hier die allgemeine Vorgehensweise für .Net-Programme erläutern, in einem späteren Post werde ich die globalisierung für eigene AutoCAD-Befehle erläutern.
Zunächst wird eine Resource-Datei für jede unterstützte Sprache erstellt. Diese Datei muss einen bestimmten Dateiname erhalten, damit .Net anhand der Windows-Ländereinstellung die zugehörige Sprachdatei erkennt.
Beispiel für deutsch (Deutschland):
[Assemblyname].de-DE.resx
Beispiel für englisch (England)
[Assemblyname.en-GB.resx
Wobei der Assemblyname frei wählbar ist.
Hier ein Beispiel einer Resource-Datei aus Visual C#.

Zunächst werden Variablen für die Instanzen der Klasse System.Resources.ResourceManager und der Klasse CultureInfo deklariert.
private CultureInfo hCI;
Mit Hilfe des Resourcemanager kann auf die Resource-Datei zugegriffen werden um den länderspezifischen Text zu ermitteln.
Im folgenden Beispiel möchte ich zunächst die Instanzierung der Klasse System.Resources.ResourceManager erläutern.
System.Resources.ResourceManager("[Assemblyname].[Assemblyname]",
System.Reflection.Assembly.GetExecutingAssembly());
Mit Hilfe der länderspezifischen Einstellung von Windows,
System.Globalization.CultureInfo.CurrentCulture.Name;
wird der Kulturname ermittelt und dem Thread dieses mitgeteilt.
System.Threading.Thread.CurrentThread.CurrentCulture = hCI;
System.Threading.Thread.CurrentThread.CurrentUICulture = hCI;
Mit der Methode Getstring des Resourcemanager wird auf die Resourcedatei zugegriffen und der entsprechende Text ermittelt. Es ist darauf zu achten, dass diese Methode innerhalb eines Try-Blockes aufgerufen wird, damit bei einem Fehler das Programm nicht abstürzt.
Das folgende Beispiel ermittelt den Text “Wenden Sie sich bitte an Ihren Administrator!” aus der Resource-Datei.
Um alle Steuerelemente eines Dialoges zu übersetzen, nutze ich die Methode SetControlText. Diese Methode ruft sich selbst rekursive auf, da Steuerelemente selber Steuerelemente enthalten können.
{
Control hControl = Control;
foreach(Control hControlItem in hControl.Controls)
{
if (hControlItem.Text != null)
{
if (hControlItem.Text.Length > 0)
{
try
{
string hControlType = hControlItem.ToString();
string[] hCTypeSplit = hControlType.Split(',');
if (hCTypeSplit[0] == "System.Windows.Forms.Label")
{
hControlItem.Text = hRM.GetString(hControlItem.Text) + ":";
}
else
{
hControlItem.Text = hRM.GetString(hControlItem.Text);
}
}
catch(System.Exception e)
{
}
}
}
this.SetControlText(hControlItem);
}
}
Hier der vollständige Code:
System.Resources.ResourceManager("[Assemblyname].[Assemblyname]",
System.Reflection.Assembly.GetExecutingAssembly());
string hCultureName =
System.Globalization.CultureInfo.CurrentCulture.Name;
switch (hCultureName)
{
case "de-DE":
case "de-LI":
case "de-LU":
case "de-AT":
case "de-CH":
hCI = new CultureInfo("de-DE");
break;
default:
hCI = new CultureInfo("en-GB");
break;
}
if (hCI != null)
{
System.Threading.Thread.CurrentThread.CurrentCulture = hCI;
System.Threading.Thread.CurrentThread.CurrentUICulture = hCI;
this.SetControlText(this);
}
Viel Spaß beim Ausprobieren
Autor: Dipl.-Ing. Jürgen A. Becker
Kontakt: Juergen.Becker@CAD-Becker.de oder Juergen.Becker@AUGI.COM
- Langjährige Schulungserfahrung
- Autorisierter AutoCAD Trainer (AutoCAD, Mechanical Desktop etc.)
- Software- und Datenbankentwicklung









RSS Feed