Autor Beitrag
MoBBer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37
Erhaltene Danke: 1



BeitragVerfasst: Mi 15.07.09 15:15 
Hallo zusammen,

damit mein Programm in verschiedensten Sprachen übersetzt wird, benutze ich die nette Lokalisierungs Funktion von .Net, funktioniert auch alles einwandfrei.
Nun möchte ich aber dem Benutzer die Möglichkeit bieten über eine zweite Form die Sprache zu ändern falls ihm die Sprache vom System nicht zusagt, was durchaus vorkommen kann. Dabei ist mein Problem, dass ich die CurrentUICulture, ja vor InitializeComponet setzten muss. Gibt es überhaupt eine Möglichkeit über Lokalisierung die Sprache nachträglich noch zu ändern?

ausblenden C#-Quelltext
1:
2:
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
InitializeComponent();


Vielen Dank schonmal im Vorraus
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 15.07.09 16:04 
Evtl. hilft dir folgende Komponente dabei: www.codeproject.com/...ChangeUICulture.aspx
MoBBer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37
Erhaltene Danke: 1



BeitragVerfasst: Do 16.07.09 08:16 
Wunderbar vielen Dank, hat mir echt weiter geholfen.

Ein Tipp für alle, die die Komponente benutzen wollen ich würde den Teil mit SuspendLayout weglassen. Da ich keinen sichtbaren Unterschiede gesehen habe außer, dass meine Checkboxen fehlerhaft dargestellt wurden. Ab Leerzeichen wurde der String nicht mehr angezeigt bzw. hat Text gefehlt, da sich die Größe nicht auf den neuen Text angepasst hat.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
private void SpracheAendern(CultureInfo ci)
        {
            Thread.CurrentThread.CurrentUICulture = ci;
            ComponentResourceManager crm = new ComponentResourceManager(this.GetType());
            FieldInfo[] fieldInfos = this.GetType().GetFields(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic);

            String text = crm.GetString("$this.Text");
            if (text != null)
                this.Text = text;
            for (int index = 0; index < fieldInfos.Length; index++)
            {
                if (fieldInfos[index].FieldType.GetProperty("Text"typeof(String)) != null)
                {
                    text = crm.GetString(fieldInfos[index].Name + ".Text");
                    if (text != null)
                    {
                        fieldInfos[index].FieldType.InvokeMember("Text", BindingFlags.SetProperty, null
                                                                 fieldInfos[index].GetValue(this), new object[] { text });
                    }
                }
            }
        }


Hab dazu nun eine Frage die "gerufene" Form soll die "rufend"e Form ja nicht kennen. Nun benutze ich die Komponente, von oben, in dem Paint Event der ersten Form und löse diese mit owner.refresh() aus der zweiten Form aus. Verstößt das nun schon gegen die Regeln der OOP?