2013-07-08 3 views
0

Я изучаю локализацию интерфейса и использую WPF в Visual Studio 2008. Моя цель для моей программы - сделать так, чтобы пользователь мог нажать кнопку и изменить отображаемый язык в окне. Я пытаюсь изменить файлы ресурсов во время выполнения в разделе кода, когда пользователь нажимает кнопку.Изменение файла ресурсов в коде C# позади в событии click

Я прочитал этот вопрос: Programmatically change resource file language (resx) in Code Behind

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

Вот что я пытался не повезло, исходя от предыдущего вопроса:

/// Change to English-US 
     private void Button2_Click(object sender, RoutedEventArgs e) 
     { 
      protected override void InitializeCulture() 
      { 
       base.InitializeCulture(); 
       System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); 
      } 
     } 

/// Change to German 
     private void Button3_Click(object sender, RoutedEventArgs e) 
     { 
      protected override void InitializeCulture() 
      { 
       base.InitializeCulture(); 
       System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE"); 
      } 
     } 

Я программирования в школе, и на моей в течение нескольких лет, так что я m не абсолютное noobie. Однако я новичок в C# и WPF, с которыми я сейчас работаю. Из того, что я знаю, вы не можете иметь функцию внутри функции, как в моем коде. Единственная причина, по которой я это сказал, - это то, что мне нужно, чтобы она работала с событием нажатия кнопки.

Помощь с этим была бы весьма признательна.

Вот новый код:

namespace LocalizationConcept 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      Properties.Resources.Culture = new CultureInfo(ConfigurationManager.AppSettings["Culture"]); 
      ///InitializeComponent(); 
     } 

     /// Exit Button 
     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      System.Environment.Exit(0); 
     } 

     private void ChangeCulture(string cultureKey) 
     { 
      try 
      { 
       System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey); 
      } 
      catch (Exception err) 
      { 
       System.Environment.Exit(0); 
      } 
     } 

     private void Button2_Click(object sender, RoutedEventArgs e) 
     { 
      ChangeCulture("en-US"); 
     } 

     private void Button3_Click(object sender, RoutedEventArgs e) 
     { 
      ChangeCulture("de-DE"); 
     } 
    } 
} 

ответ

1

Похоже, WPF не поддерживает те же функции Winforms, говоря о локализации и gloablization. Хотя я нашел несколько интересных статей, которые показывают шаг за шагом, как заменить язык во время выполнения, на лету.

  • WPF Localization - On-the-fly Language Selection:
    • Это дает возможность для замены языков во время выполнения, на лету
    • Он работает лучше, чем хромой XML, на основе XPath связывания решение
    • Он может быть использован с помощью Стили, шаблоны управления и шаблоны данных
    • Он преобразует форматированный текст с параметрами, используя стандартные и настраиваемые форматы
    • Он предоставляет пользовательскую разметку-расшир. иона, чтобы написать элегантный XAML

  • WPF Runtime Localization
    • Переключение культур во время выполнения - автоматически обновляет все локальные элементы
    • использовать существующую структуру файлов ресурсов (* .resx файлы) , которые могут поддерживаться в Visual Studio
    • Поддерживайте поддержку времени разработки для локализованных элементов, работающих в Expr ession смесь (и, надеюсь, другие приложения дизайн XAML)
0

Это не должно быть в его собственной функции (хотя это может быть).Рассмотрим следующий пример:

private void ChangeCulture(string cultureKey) 
    { 
     try 
     { 
      System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey); 
     } 
     catch (Exception err) 
     { 
      // That culture probably doesn't exist 
     } 
    } 

    private void ButtonA_Click(object sender, EventArgs args) 
    { 
     ChangeCulture("en-US"); 
    } 

    private void ButtonB_Click(object sender, EventArgs args) 
    { 
     ChangeCulture("de-DE"); 
    } 

EDIT:

I found this on another post и он был награжден +100 Баунти, так что я предполагаю, что это отличное решение. Проверьте это.

+0

Я полностью удалил события нажатия кнопок, которые у меня были до этого, и ввел это. У компилятора не было проблем, но язык не меняется при нажатии кнопки. Я отправлю новый код. -It также может быть важно отметить, что у меня есть файл app.config, который я использовал для изменения языка, прежде чем запускать программу. –

+0

Я только что добавил ссылку на аналогичный пост, который имеет отличный ответ для этого, хотя и немного более сложный. –

+0

Я пытаюсь локализовать весь текст в моем интерфейсе. Текст на кнопках, текстовых полях и вкладках. Будет ли эта связь работать и для этих? Единственная причина, по которой я спрашиваю, состоит в том, что они всегда кодируют строки в окне XAML в качестве примера. –

 Смежные вопросы

  • Нет связанных вопросов^_^