Вопрос

Я работал над домашним животным проектом на выходных, чтобы узнать больше о C # и столкнулся с нечетной проблемой при работе с локализацией. Быть более конкретным, проблема у меня есть с системой.threading.thread.currentThread.CurrentureCulture.

Я настроил свое приложение, чтобы пользователь мог быстро изменить язык приложения, нажав пункт меню. Пункт меню в свою очередь, сохраняет два буквенного кода для языка (например, «en», «fr» и т. Д.) В пользовательской настройке «Язык», а затем перезапускает приложение.

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

Когда приложение запущено, первая строка кода в конструкторе формы (даже до INAILIZECOMPONENT ()) выбирает языковой строки из настроек и устанавливает текущее заводское хозяйство:

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

Дело в том, что это не работает последовательно. Иногда все хорошо работает, и приложение загружает правильный язык на основе строки, сохраненной в файле настроек. Другие времена это не так, и язык остается прежним, после перезагрузки приложения.

Сначала я подумал, что не спасил язык, прежде чем перезапустить приложение, но это определенно не так. Когда правильный язык не загружается, если бы я закрыл приложение и запускаю его снова, правильный язык будет правильно. Таким образом, это подразумевает, что языковая строка была сохранена, но назначение о текущих целях в моем формовом конструкторе не имеет никакого эффекта иногда.

Любая помощь? Есть ли что-то, что мне не хватает о том, как Threading работает в C #? Это может быть специально для машин, поэтому, если это имеет какую-либо различие, я использую Pentium Dual-Core CPU.

ОБНОВИТЬ

Влад попросил меня проверить, что такое текущее заводское хозяйство akeThread. Поэтому я добавил сообщение MessageBox на моем конструкторе, чтобы сказать мне, каковы текущий двухбуквенный код, а также значение моей языковой строки пользователя.

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

Когда неверный язык загружен, как языковая строка, так и текущие заводцы имеют неправильный язык. Поэтому я предполагаю, что текущее заводское хозяйство было очищено, и моя проблема на самом деле с настройкой языка.

Так что я думаю, проблема в том, что мое приложение иногда загружает ранее сохраненную языковую строку, а не последнюю сохраненную языку. Если приложение перезапущено, он будет загружать фактическую сохраненную язык языковой строки.

Это было полезно?

Решение

У меня та же проблема. Я выяснил, что Application.Restart () на самом деле не делает абсолютно перезапустить, увидеть MSDN.

Таким образом, Application.RESTART () не вызывает инициализации вещей в конструкторе форм, как инициализируют Component (), больше «приложений перезагружаются в контексте, в котором они были изначально работают».

Так что ваш код правильный

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

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

Но это не работает таким образом с Application.Restart(). Отказ Если вы закроете приложение и снова откройте его, ваши (новые) настройки сделаны.

Поэтому мы должны найти способ снова инициализации формы, чтобы получить новые языковые настройки.

Другие советы

Не могли бы вы проверить, каковы ваши темы CurrentUICulture?

Я помню, как проблема, как ваша; Он был решен путем перезагрузки словаря ресурсов, содержащий строки, которые должны быть локализованы:

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

(и этот подход работал динамически; здесь это еще одна информация).

Вы можете вручную изменить язык текущей формы, аналогичной этому:

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;

Надеюсь, это поможет!

Вы можете просто «сбросить» ваше приложение, закрыв открытые формы и повторно создаю их. Тогда вы можете напрямую установить культуру, когда пользователь меняет настройку.

Кроме того, попробуйте дать некоторую вывод отладки, чтобы вы видите, какие значения устанавливаются, и если культура на самом деле то, что вы ожидаете.

Редактировать: Мое предположение: поскольку данные должны быть записаны в файл, а затем загружены из этого файла, вы можете быть перезапущены слишком быстро для получения записи.

Используя Creethread.CurrentureCulture, а затем изменив форму, вам не нужно перезапустить приложение. Реф моего старого поста здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top