В выходные я работал над любимым проектом, чтобы узнать больше о C #, и столкнулся со странной проблемой при работе с локализацией. Чтобы быть более конкретным, у меня проблема с System.Threading.Thread.CurrentThread.CurrentUICulture.
Я настроил свое приложение так, чтобы пользователь мог быстро изменить язык приложения, щелкнув пункт меню. Пункт меню, в свою очередь, сохраняет двухбуквенный код для языка (например, «en», «fr» и т. Д.) В пользовательской настройке «Language», а затем перезапускает приложение.
Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();
Application.Restart();
Когда приложение запускается, первая строка кода в конструкторе формы (даже до InitializeComponent ()) выбирает строку языка из настроек и устанавливает CurrentUICulture следующим образом:
public Form1()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
InitializeComponent();
}
Дело в том, что это не работает последовательно. Иногда все работает хорошо, и приложение загружает правильный язык на основе строки, сохраненной в файле настроек. В других случаях это не так, и язык остается тем же после перезапуска приложения.
Сначала я подумал, что не сохранял язык до перезапуска приложения, но это определенно не тот случай. Когда не удается загрузить правильный язык, если бы я должен был закрыть приложение и запустить его снова, правильный язык был бы найден правильно. Таким образом, это означает, что строка Language была сохранена, но назначение CurrentUICulture в моем конструкторе формы иногда не оказывает никакого влияния.
Любая помощь? Есть ли что-то, чего мне не хватает, как работает многопоточность в C #? Это может зависеть от конкретной машины, поэтому, если будет какая-то разница, я использую двухъядерный процессор Pentium.
UPDATE
Влад попросил меня проверить, какова текущая культура CurrentThread. Поэтому я добавил MessageBox на свой конструктор, чтобы сообщить мне, что такое двухбуквенный код CurrentUICulture, а также значение моей пользовательской строки Language.
MessageBox.Show(string.Format("Current Language: {0}\nCurrent UI Culture: {1}", Properties.Settings.Default.Language, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));
Когда загружен неправильный язык, строка языка и CurrentUICulture имеют неправильный язык. Так что я думаю, что CurrentUICulture был очищен, и моя проблема на самом деле связана с настройкой языка.
Так что, я думаю, проблема в том, что мое приложение иногда загружает ранее сохраненную языковую строку, а не последнюю сохраненную языковую строку. Если приложение перезапустится, оно загрузит текущую сохраненную языковую строку.