Frage

Ich habe an den Wochenenden auf einem Haustier Projekt gearbeitet mehr über C # zu lernen und habe ein seltsames Problem gestoßen, wenn sie mit Lokalisierung arbeiten. Um genauer zu sein, das Problem, das ich habe, ist mit System.Threading.Thread.CurrentThread.CurrentUICulture.

Ich habe meine App so einrichten, dass der Benutzer schnell die Sprache der App, indem Sie einen Menüpunkt ändern kann. Der Menüpunkt wiederum speichert den Code aus zwei Buchstaben für die Sprache (zum Beispiel „en“, „fr“, etc.) in einer Benutzereinstellung namens ‚Sprache‘ und dann startet die Anwendung.

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();
Application.Restart();

Wenn die Anwendung gestartet wird, die erste Zeile Code im Konstruktor des Formulars (auch vor InitializeComponent ()), um die Sprache Zeichenfolge aus den Einstellungen abruft und setzt die CurrentUICulture etwa so:

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    InitializeComponent();
}

Die Sache ist, bedeutet dies nicht konsequent arbeiten. Manchmal alles funktioniert gut und die Anwendung lädt die richtige Sprache basierend auf dem String gespeichert in der Einstellungsdatei. Andere Zeiten, es funktioniert nicht, und die Sprache gleich bleibt, nachdem die Anwendung neu gestartet wird.

Zuerst dachte ich, dass ich nicht speichern Sie die Sprache haben, bevor Sie die Anwendung neu starten, aber das ist definitiv nicht der Fall. Wenn die richtige Sprache nicht geladen werden kann, wenn ich die Anwendung schließen war und es wieder laufen, die richtige Sprache richtig kommen würde. So bedeutet dies, dass die Sprache Zeichenfolge gespeichert wurde, aber die CurrentUICulture Zuordnung in meiner Form Konstruktor wird manchmal keine Wirkung.

Jede Hilfe? Gibt es etwas, was ich bin fehlt, wie Arbeiten in C # Threading? Dies könnte maschinenspezifisch sein, so dass, wenn es einen Unterschied macht ich bin mit Pentium Dual-Core-CPU.

UPDATE

Vlad hat mich gebeten, zu prüfen, was das Current des CurrentUICulture ist. Also habe ich eine MessageBox auf meinem Konstruktor hinzugefügt, mir zu sagen, was der CurrentUICulture zweistelligen Ländercode sowie den Wert meiner Sprache Benutzer Zeichenfolge ist.

MessageBox.Show(string.Format("Current Language: {0}\nCurrent UI Culture: {1}", Properties.Settings.Default.Language, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));

Wenn die falsche Sprache geladen wird, sowohl die Sprache String und CurrentUICulture haben die falsche Sprache. Also habe ich die CurrentUICulture erraten wurde gelöscht und mein Problem ist eigentlich mit der Spracheinstellung.

Also ich denke, das Problem ist, dass meine Anwendung manchmal lädt die zuvor gespeicherten Sprach Zeichenfolge statt der zuletzt gespeicherten Sprach String. Wenn die App neu gestartet wird, wird es dann die eigentliche Sprache Zeichenfolge gespeichert laden.

War es hilfreich?

Lösung

Ich habe das gleiche Problem. Ich fand heraus, dass Application.Restart () nicht wirklich ein absolut Neustart machen, finden Sie unter MSDN .

So Application.Restart () rufen Sie nicht die Initialisierung Dinge innerhalb der Formen Konstruktor wie InitializeComponent () mehr die „Anwendungen werden im Kontext neu gestartet, in dem sie zunächst laufen gelassen wurden.“

So Ihr Code korrekt

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    //...
    InitializeComponent();
}

, aber es funktioniert nicht auf diese Weise mit Application.Restart(). Wenn Sie die App zu schließen und wieder öffnen Ihre (neu) Einstellungen getroffen werden.

So wir einen Weg finden, haben Sie das Formular erneut zu initialisieren, passieren die neuen Spracheinstellungen zu machen.

Andere Tipps

Könnten Sie überprüfen, was ist CurrentUICulture der Thread?

Ich erinnere mich an ein Problem wie das Ihre ist; es wurde durch Neuladen der Ressourcenverzeichnis gelöst, die die Zeichenketten enthalten lokalisiert werden:

Thread.CurrentThread.CurrentUICulture = <new culture>;
ResourceDictionary newDict = new ResourceDictionary();
newDict.Source = localizedStrings.Source;
localizedStrings = newDict;

(und dieser Ansatz funktioniert dynamisch als auch, hier ist einige weitere Informationen).

Sie können manuell die Sprache der aktuellen Form ändern wie folgt aus:

CultureInfo cInfo = new CultureInfo("en-US");
ResourceManager rm = new ResourceManager(GetType());

// For each control on the form, perform the translation manually (probably better in a loop)
control1.Text = rm.GetString(control1.Name + ".Text", cInfo);

// Now set the culture for all other dialogs
Thread.CurrentThread.CurrentUICulture = cInfo;

Ich hoffe, das hilft!

Sie können einfach „Reset“ Ihre Anwendung durch die offenen Formen zu schließen und neu zu erstellen sie. Dann könnte man direkt die Kultur gesetzt, wenn der Benutzer die Einstellung ändert.

Versuchen Sie auch, einige Debug-Ausgabe geben, damit Sie sehen, welche Werte Satz werden und wenn die Kultur eigentlich ist das, was man erwartet.

EDIT: Meine Vermutung:. Da die Daten in eine Datei geschrieben werden muss, und dann aus dieser Datei geladen wird, Sie zu schnell sein kann Neustart für das Schreiben abgeschlossen worden

Durch die Verwendung von CurrentThread.CurrentUICulture, und dann das Formular zu ändern, müssen Sie nicht die Anwendung neu starten müssen. Ref meine alten Post hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top