Entwickler-Ecke

WinForms - Punkt-Komma Problem bei Multilanguage


Rico913 - Mi 26.04.23 12:13
Titel: Punkt-Komma Problem bei Multilanguage
Hi,

ich habe ein umfangreiches Program zum Verarbeiten und Bemaßen von Bildern geschrieben und möchte es nun für unsere englisch-sprechenden Kollegen verfügbar machen.
Wenn ich nun die Kultur in der Program.cs, wie folgt ändere:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
ResourceManager resMgm = new ResourceManager("user.settings", Assembly.GetExecutingAssembly());
string Lang = resMgm.GetString("Spracheinstellung");
string LangCode;
if (Lang == "deutsch")
{
    LangCode = "de";
}
else
{
    LangCode = "en";
}
LangCode = "de";
CultureInfo myCultureInfo = new CultureInfo(LangCode);
Thread.CurrentThread.CurrentCulture = myCultureInfo;
Thread.CurrentThread.CurrentUICulture = myCultureInfo;

habe ich das Problem, dass meine an den Stellen, wo Berechnungen durchgeführt oder Strings konvertiert werden, ich Probleme mit dem englischen Zahlenformat (Punkt statt Komma) bekomme und dies zu falschen Ergebnissen führt.

Ich hab es an einer Stelle so gelöst:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
string LangText = Properties.User.Default.Spracheinstellung;
string LangCode;
string temp_DM3;
string temp_SER;
if (LangText == "deutsch")
{
    temp_DM3 = Properties.User.Default.ImportFilter_DM3_setting;
    temp_SER = Properties.User.Default.ImportFilter_DM3_setting;
}
else
{
    temp_DM3 = Properties.User.Default.ImportFilter_DM3_setting.ToString().Replace(","".");
    temp_SER = Properties.User.Default.ImportFilter_DM3_setting.ToString().Replace(","".");
}

Aber, ich habe so viel Stellen im Programm, wo es zu einem Fehler kommen kann und ich jede einzelne finden und lösen muss.

Gibt es dafür eine elegantere, einfache Lösung? Oder vielleicht ein komplett anderen Ansatz?

Moderiert von user profile iconTh69: Titel geändert ("Punk" -> "Punkt" ;- ).
Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


jaenicke - Mi 26.04.23 14:10

Hallo und :welcome: im Forum!

Für die Anzeige und Eingabe kannst du ja die Standardumwandlung nutzen.

Alles, was irgendwo gespeichert werden soll, muss in einem einheitlich definierten Format gespeichert werden. Dafür solltest du allerdings kein Replace verwenden, sondern die passende CultureInfo an ToString usw. übergeben. Wenn du keine zentrale Schnittstelle für dem Zugriff auf Einstellungen oder andere gespeicherte Daten hast, wirst du das überall anpassen müssen.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Mi 26.04.23 15:53

Ähnlich habe ich meine Antwort in seinem Crosspost myCSharp.de: Punk(t)-Komma Problem bei Multilanguage [https://mycsharp.de/forum/threads/125271] formuliert.


Ralf Jansen - Mi 26.04.23 17:23

Das sieht mir nach clientseitigem Code aus warum versuchst du da die Kultur über eigene Einstellungen zu ändern Windows hat da schon welche. Und die müssen nicht mal zur den Standardkulturen passen. Jeder kann an seinen Ländereinstellungen schrauben. Es macht Sinn auf einem Server wenn man da Threads an die clientseitige Kultur anpassen will, oder wenn man da eigene Threads startet und die Kultur des startenden Threads übernehmen will (das macht das Framework nicht selbst).