C# winForm資源文件實現多語言切換


 

C# winForm資源文件實現多語言切換

這是我目前看到過最簡單的多語言切換了

操作步驟

界面上的多語

Step1.將界面Form的屬性的Localizable屬性設為True

Step2.切換界面From的Language屬性為欲使用的語系

設完后會在分頁標簽上看到目前設定的語系

Step3.設定界面上欲顯示的字樣並適當的調整版面

 

到此,用資源檔做的多語系程序就完成了。

 

我們可以到檔案總管看一下,可看到Visual Studio自己幫我們產生了對應的資源檔。

因此,在實作界面上的多語時,我們並不需自己手動加入資源檔。

信息的多語

上面的示例帶出了界面上支持多語的寫法,但卻不適用於信息上,若要在信息上也支持多語。請依下列步驟:

Step1.加入資源檔 

資源檔依照“資源文件名.文化特性.resx”格式命名,如“Resources.zh-tw.resx”。

 

Step2.設定資源檔內的信息內容 

在資源檔上連點兩下

 

設定對應的語系字串

 

Step3.使用資源檔內的信息內容 

這邊只要透過My.Resources去取出資源檔內的值即可,內部OR Mapping轉換都幫你做好好,可以用強型別的方式直接取用,能避免掉許多不必要的低級錯誤。 

MsgBox(My.Resources.Resource1.String1)

 其實個人習慣是命名為“Resources.文化特性.resx”,因為項目里已偷放了一個Resources.resx資源檔,因此只需加入非預設語系的資源檔即可

在使用上也會變得較為簡短

 

MsgBox(My.Resources.String1)

切換語系

依上面步驟操作完后,其實已具多語支持能力。當程序開啟時,會自動依照當前語系去顯示界面畫面。因此我們開啟時應該是顯示中文而不是本來的英文。若要自己切換語系可利用Threading.Thread.CurrentThread.CurrentUICulture。

 

Threading.Thread.CurrentThread.CurrentUICulture = New CultureInfo(“en”)

值得注意的是,這樣的寫法是不會影響已開啟的視窗的。只有后來開啟的視窗會被切換語系。

 

那是否已開啟的視窗就無法切換了呢?那倒也不是。可以透過使用ResourceManager.GetString去取得對應的字串,把取出的字串再設到界面上即可。但是這也不是很好的方法,個人傾向使用ComponentResourceManager配合遞回去把界面上的字串換成對應語系的字串。有興趣的可以參考Form.Designer.vb檔的代碼。

 

注意事項

在用多國語言資源檔時,建議最后在弄其它語系的設定。因為當我們設定多語系時,Visual Studio會自動幫我們產生資源檔,且內含預設的設定值。若太早讓Visual Studi產生資源檔,則預設的設定值將只有少少的幾個,后面的設定值都需手動的設定,且每個語系的資源檔都要設定。

 

   
   
   
   
   
   

調用

SetLang("語言標識", this, typeof(窗體));

 

 public static class JapanHelper
  {
    /// <summary>
    /// 設置當前程序的界面語言
    /// </summary>
    /// <param name="lang">language:zh-CN, en-US</param>
    /// <param name="form">窗體實例</param>
    /// <param name="formType">窗體類型</param>
    public static void SetLang(string lang, Form form)
    {
      System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
      if (form != null)
      {
        System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(form.GetType());
        resources.ApplyResources(form, "$this");
        AppLang(form, resources);
      }
    }

    /// <summary>
    /// 遍歷窗體所有控件,針對其設置當前界面語言
    /// </summary>
    /// <param name="control"></param>
    /// <param name="resources"></param>
    private static void AppLang(Control control, System.ComponentModel.ComponentResourceManager resources)
    {
      if (control is MenuStrip)
      {
        //將資源應用與對應的屬性
        resources.ApplyResources(control, control.Name);
        MenuStrip ms = (MenuStrip)control;
        if (ms.Items.Count > 0)
        {
          foreach (ToolStripMenuItem c in ms.Items)
          {
            //調用 遍歷菜單 設置語言
            AppLang(c, resources);
          }
        }
      }

      foreach (Control c in control.Controls)
      {
        resources.ApplyResources(c, c.Name);
        AppLang(c, resources);
      }
    }
    /// <summary>
    /// 遍歷菜單
    /// </summary>
    /// <param name="item"></param>
    /// <param name="resources"></param>
    private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
    {
      if (item is ToolStripMenuItem)
      {
        resources.ApplyResources(item, item.Name);
        ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
        if (tsmi.DropDownItems.Count > 0)
        {
          foreach (ToolStripMenuItem c in tsmi.DropDownItems)
          {
            //if (tsmi != ToolStripSeparator)
            //{ }
            AppLang(c, resources);
          }
        }
      }
    }
  }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM