Entwickler-Ecke

WPF / Silverlight - Falsche Anzeigesprache


Yankyy02 - Do 02.04.20 13:51
Titel: Falsche Anzeigesprache
Hallo Gemeinde,

nach langem suchen und probieren möchte ich mich nun an euch wenden.
Ich habe folgendes Problem und zwar wird in einer MessageBox die falsche Anzeigesprache verwendet.
In meiner WPF-Desktop Application überschreibe ich die Startup-Methode folgendermaßen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  protected override void OnStartup(StartupEventArgs e)
        {
            CultureInfo culture = CultureInfo.CreateSpecificCulture("de-DE");

            Thread.CurrentThread.CurrentUICulture = culture;
            Thread.CurrentThread.CurrentCulture = culture;

            CultureInfo.DefaultThreadCurrentCulture = culture;
            CultureInfo.DefaultThreadCurrentUICulture = culture;

            FrameworkElement.LanguageProperty.OverrideMetadata(
                typeof(FrameworkElement),
                new FrameworkPropertyMetadata(
                    XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

            base.OnStartup(e);          
        }


Leider passiert es das auf unterschiedlichen Systemen die MessageBox mal mit Ja/Nein Buttons angezeigt wird und mal mit Yes/No.
Verständlicherweise möchte ich das durchgehend die Deutsche Sprache verwendet wird.

* Auf den Testsystemen ist jeweils die gleiche Region/Anzeigesprache/Tasturlayout gesetzt.
* Die Registrierung weißt unter allen Testsystemen den gleichen Wert für International/Locale auf.
* Das .Net Framework Language Pack in deutsch und in der richtigen Version ist auf den Testsystemen installiert.

Ich kann mir nicht erklären warum die Sprache bzw. die Buttons der MessageBox jeweils eine andere Sprache aufweisen.

Gibt es irgendwo noch versteckt eine Property die man setzen kann/muss um durchgehend und eventuell auch unabhängig von der verwendeten "Windows-Sprache" eine gewisse UI-Sprache durchzusetzen?

Danke vorab für eure Vorschläge!


Th69 - Do 02.04.20 14:35

Hallo,

die MessageBox ist ein System-Dialog und verwendet (für die Buttons) immer die eingestellte Sprache des Windows-Systems.

Für WinForms habe ich diesen Artikel Localizing System MessageBox [https://www.codeproject.com/Articles/18399/Localizing-System-MessageBox] gefunden (eigentlich müßte dieser dann auch, entsprechend angepaßt, für WPF so funktionieren).

Aber wofür benötigst du denn die MessageBoxen? Kannst du nicht einen eigenen Dialog erzeugen?


Yankyy02 - Do 02.04.20 14:46

Hallo und danke für deine Antwort,

es geht hier um eine simple Ja - Nein Abfrage und ja man könnte auch einen eigenen Dialog basteln aber wie man schon früh in der Programmierung lernt soll man nicht immer das Rad neu erfinden :wink:
und die vorhandene MessageBox eignet sich ja perfekt dafür.
Den Beitrag habe ich bereits gesehen und probiert ...... dennoch verstehe ich nicht warum es bei 3 gleichen Systemen zur unterschiedlichen Anzeigesprache kommt.
Dann kann ich mir das globale setzen der Spracheinstellung auch gleich sparen. (sofern ich nicht für unterschiedliche Sprachen eine UI anbiete)

Dafür hast du mich jetzt auf eine Idee gebracht .... das WPF Toolkit [https://github.com/xceedsoftware/wpftoolkit/wiki/MessageBox] bietet ihre eigene Implementierung einer MessageBox ..... so sollte ich das Problem umgehen können ....

Was meinst du?


Yankyy02 - Do 02.04.20 15:56

Hat sich erledigt .... ich benutze Komponenten von DevExpress und darunter auch die DXMessageBox .... da läuft die Lokalisierung ein wenig anders jetzt klappts auf allen Systemen.
Die Frage bleibt aber dennoch warum es bei scheinbar identischen Systemen zu unterschiedlichen Sprachen kommt. :?:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    public class DxMessageBoxCustomLocalizer : DXMessageBoxLocalizer
    {
        public override string GetLocalizedString(DXMessageBoxStringId id)
        {
            switch (id)
            {
                case DXMessageBoxStringId.Yes:
                    return "Ja";
                case DXMessageBoxStringId.No:
                    return "Nein";
                case DXMessageBoxStringId.Cancel:
                    return "Abbrechen";
            }

            return base.GetLocalizedString(id);
        }
    }



C#-Quelltext
1:
2:
3:
4:
  protected InfoDocumentViewModel()
        {
            DXMessageBoxLocalizer.Active = new DxMessageBoxCustomLocalizer();
        }