Question

Je travaille sur un projet animal de compagnie le week-end pour en savoir plus sur C # et ont rencontré un problème étrange lorsque vous travaillez avec la localisation. Pour être plus précis, le problème est que j'ai avec System.Threading.Thread.CurrentThread.CurrentUICulture.

J'ai mis mon application afin que l'utilisateur peut changer rapidement la langue de l'application en cliquant sur un élément de menu. L'élément de menu à son tour, enregistre le code à deux lettres pour la langue (par exemple « en », « fr », etc.) dans un cadre utilisateur appelé « Langue » et redémarre l'application.

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

Lorsque l'application est lancée, la première ligne de code dans le constructeur du formulaire (avant même InitializeComponent ()) va chercher la chaîne Langue des paramètres et définit la CurrentUICulture comme ceci:

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

La chose est, cela ne fonctionne pas toujours. Parfois, tout fonctionne bien et les charges d'application de la langue adéquate en fonction de la chaîne enregistrées dans le fichier de paramètres. D'autres fois, il ne fonctionne pas et la langue reste le même après redémarrage de l'application.

Au début, je pensais que je ne l'ai pas sauver la langue avant de redémarrer l'application, mais qui est certainement pas le cas. Lorsque la langue correcte ne se charge pas, si je devais fermer l'application et l'exécuter à nouveau, la langue correcte serait venu correctement. Donc, cela signifie que la chaîne de langue a été enregistrée, mais l'affectation CurrentUICulture dans mon constructeur de forme est parfois avoir aucun effet.

Toute aide? Y at-il quelque chose que je manque de la façon dont le filetage fonctionne en C #? Cela pourrait être une machine spécifique, donc si cela fait une différence que je utilise Pentium Dual-Core.

UPDATE

Vlad m'a demandé de vérifier ce que CurrentUICulture du CurrentThread est. Donc, j'ai ajouté un MessageBox sur mon constructeur de me dire ce que le CurrentUICulture code à deux lettres est ainsi que la valeur de ma chaîne utilisateur Langue.

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

Lorsque la mauvaise langue est chargée, à la fois la chaîne de langue et CurrentUICulture ont la mauvaise langue. Donc je suppose que le CurrentUICulture a été effacé et mon problème est en fait avec le paramètre de langue.

Je suppose que le problème est que ma demande parfois des charges la chaîne de langue précédemment enregistrée plutôt que la dernière chaîne de langue enregistrée. Si l'application est redémarré, il chargera alors la chaîne de langue enregistrée réelle.

Était-ce utile?

La solution

J'ai eu le même problème. Je me suis dit que Application.Restart () ne font pas vraiment, voir absolument redémarrer MSDN .

Application.Restart () ne remet pas les choses dans le constructeur d'initialisation des formulaires comme InitializeComponent (), plus les « applications sont redémarrés dans le contexte dans lequel ils ont d'abord été exécutés. »

Donc, votre code est correct

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

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

mais il ne fonctionne pas de cette façon avec Application.Restart(). Si vous fermez l'application et l'ouvrir à nouveau votre (nouveau) les paramètres sont prises.

Nous devons donc trouver un moyen d'initialiser à nouveau le formulaire pour que les nouveaux paramètres de langue se produisent.

Autres conseils

Pourriez-vous vérifier quel est le CurrentUICulture de votre fil?

Je me souviens d'avoir un problème comme le vôtre; il a été résolu en rechargeant le dictionnaire de ressources contenant les chaînes à localiser:

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

(et cette approche a fonctionné de façon dynamique et est un peu plus d'informations).

Vous pouvez changer manuellement la langue de la forme actuelle semblable à ceci:

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;

L'espoir qui aide!

Vous pourriez simplement « reset » de votre application en fermant les formes ouvertes et les recréer. Ensuite, vous pouvez définir directement la culture lorsque l'utilisateur modifie le réglage.

De plus, essayez de donner une sortie de débogage de sorte que vous voyez quelles valeurs sont fixées et si la culture est en fait ce que vous attendez.

EDIT: Je pense. Comme les données doivent être écrites dans un fichier, puis chargé à partir de ce fichier, vous pouvez remettre en marche trop rapidement pour l'écriture d'avoir terminé

En utilisant CurrentThread.CurrentUICulture, puis changer la forme, vous n'avez pas besoin de redémarrer l'application. Ref mon ancien poste ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top