2013-07-08 35 views
0

我正在學習接口本地化,並在Visual Studio 2008中使用WPF。我的程序目標是讓用戶可以單擊按鈕並更改顯示的語言在窗口中。我一直試圖在運行時在代碼隱藏部分更改我的資源文件,當用戶單擊按鈕時。在單擊事件中更改C#代碼中的資源文件

我已經經歷了這個問題閱讀: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"); 
      } 
     } 

我在學校和我本人的幾年現在已經被編程,所以我我不是絕對的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相同的特徵。儘管我發現了一些有趣的文章,它們逐步展示瞭如何在運行時替換語言。

  • WPF Localization - On-the-fly Language Selection
    • 它提供了在運行時替換語言,一個選項上即時
    • 它執行比跛腳XML更好,基於XPath結合溶液
    • 它可以通過使用樣式,控件模板和數據模板
    • 它使用默認和自定義格式化程序轉換帶參數的格式化文本
    • 它提供了一個Translate custom markup-extens離子寫一個優雅的XAML

  • WPF Runtime Localization
    • 交換機文化在運行 - 自動更新所有本地化元素
    • 利用現有的資源文件結構(* .resx文件) ,可以在Visual Studio中維護
    • 保持對Expr中工作的本地化元素的設計時支持分裂國家混合(希望其他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"); 
    } 

編輯:

I found this on another post,它被授予+100獎金,所以我想這是一個很好的解決方案。一探究竟。

+0

我完全刪除了之前已有的按鈕單擊事件,並將其輸入。編譯器沒有問題,但單擊按鈕時語言不會更改。我將發佈新代碼。 - 也許很重要的一點是,我有一個app.config文件,在我運行程序之前我一直用它來改變語言。 –

+0

我剛剛添加了一個類似的帖子,有一個很好的答案,儘管多一點參與的鏈接。 –

+0

我試圖本地化我的界面中的所有文本。有按鈕,文本框和選項卡上的文本。這個鏈接也適用於那些人嗎?我問的唯一原因是他們總是將字符串編碼到XAML窗口中作爲示例。 –