Опубликован: 11.09.2006 | Доступ: свободный | Студентов: 7649 / 473 | Оценка: 4.26 / 3.45 | Длительность: 30:46:00
ISBN: 978-5-9556-0080-2
Лекция 8:

Справочные материалы. перевод приложений. специальные возможности

В конструкторе формы извлекается текстовая переменная из заданного ресурса:

public Form1()
 {
    
 InitializeComponent();
 //Инициализируем переменные
 EnglishCulture = "en-US";
 RussianCulture = "ru-RU";
 // Перменной CultureDefine присваиваем значение культуры, установленной на компьютере, 
 //используя свойство класса ResourceManager
 CultureDefine = CultureInfo.InstalledUICulture.ToString();
 // Создаем новый объект resourceManager, извлекающий из сборки 
 //текстовую переменную ClosingText
 resourceManager = new ResourceManager("TextEditor.ClosingText", Assembly.GetExecutingAssembly());
      
 }
Листинг 8.3.

Перегружаем конструктор формы:

public Form1(string FormCulture)
 {
    
 InitializeComponent();
 EnglishCulture = "en-US";
 RussianCulture = "ru-RU";
 //В качестве культуры устанавливаем значение CultureDefine
 CultureDefine = FormCulture;
 // Создаем новый объект resourceManager, извлекающий из сборки 
 //текстовую переменную ClosingText
 resourceManager = new ResourceManager("TextEditor.ClosingText", Assembly.GetExecutingAssembly());
  
 }
Листинг 8.4.

Окно-предупреждение появляется при наступлении события формы Closing. Заменяем строку Do you want to save changes in this document? на извлекаемую переменную MessageText файла ресурса (выделено цветом):

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
 {
…

  if(MessageBox.Show(resourceManager.GetString("MessageText"), 
  "Message", MessageBoxButtons.YesNo, 
  MessageBoxIcon.Question) == DialogResult.Yes)

…
 }

Добавляем возможность изменения языка при выборе определенного пункта меню. Создаем обработчик пункта меню mnuEnglish:

private void mnuEnglish_Click(object sender, System.EventArgs e)
  {
  //Устанавливаем английскую культуру в качестве выбранной.
  CultureDefine = EnglishCulture;
  // Устанавливаем выбранную культуру в качестве культуры  пользовательского интерфейса 
  Thread.CurrentThread.CurrentUICulture = new CultureInfo(CultureDefine, false);
  // Устанавливаем в качестве текущей культуры выбранную
  Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureDefine, false);
  //Создаем новый экземпляр frm формы Form1:
  Form1 frm = new Form1(CultureDefine);
  //Скрываем текущий экземпляр
  this.Hide();
  //Вызываем новый экземпляр
  frm.Show();
}
Листинг 8.5.

Обработчик пункта меню mnuRussian аналогичен, только в качестве выбранной устанавливается русская культура:

private void mnuRussian_Click(object sender, System.EventArgs e)
  {
  CultureDefine = RussianCulture;
  Thread.CurrentThread.CurrentUICulture = new CultureInfo(CultureDefine, false);
  Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureDefine, false);
  Form1 frm = new Form1(CultureDefine);
  this.Hide();
  frm.Show();
  }

Запускаем приложение. При изменении языка текущая форма скрывается, вместо нее появляется новая форма с нужным интерфейсом. При попытке закрыть форму с изменениями в сохраненном документе текст в окне предупреждения появляется на выбранном языке (рис. 8.31 и 8.32).

Русская версия приложения

Рис. 8.31. Русская версия приложения
Английская  версия приложения

Рис. 8.32. Английская версия приложения

При закрывании видимой формы остаются запущенными скрытые копии. Для полного завершения работы с приложением в событии Closed формы Form1 создадим процедуру выхода:

private void Form1_Closed(object sender, System.EventArgs e)
 {
   Application.Exit();
 }

Другие текстовые переменные, например, заголовок Message, также могут быть без труда локализованы при добавлении их в файлы ресурсов (рис. 8.33).

Для перевода заголовка  была добавлена переменная ItemText в файлы ресурсов

Рис. 8.33. Для перевода заголовка была добавлена переменная ItemText в файлы ресурсов

На диске, прилагаемом к книге, вы найдете приложение TextEditor (Code\Glava8\TextEditor).

Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/