2014年6月18日 星期三

製作可自動切換語言的 Windows Form 應用程式

在開發一個跨國性產品時,將遇到動態切換使用者介面(UI)文字語言的需求,.Net 的 Windows Form 應用程式早已具備當地語系化的架構,只要依循己設計妥當的開發方式,十分容易就能完成一個能表示多國語言的應用程式,並且能隨時動態切換顯示文字。

我們須具備一個觀念:應用程式的文字都是一種資源,切換顯示文字只不過是在切換資源。所以,在多語言應用程式的開發上,要注意的是以下幾點:

  1. 不同的語言內容,定義在各自的資源檔中。
  2. 程式中使用索引鍵 (Key) 取用文字。
  3. 設定系統作用中的語系,讓系統自動取得正確的文字語言。

以下文章已詳細說明基本的使用過程:

MSDN: 逐步解說:將 Windows Form 當地語系化
http://msdn.microsoft.com/zh-tw/library/y99d1cd3(v=vs.110).aspx

不過文中所說明的方法,只能在程式啟動時,決定一種要顯示的語言,如果我們必須在執行時期即時切換語言的話,要怎麼作呢?

範例:按下按鈕,即時變更顯示語言。



程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void BtnChinese_Click(object sender, EventArgs e)
        {
            ChangeLanguage("zh-TW");
        }

        private void BtnEnglish_Click(object sender, EventArgs e)
        {
            ChangeLanguage("en-US");
        }


        private void ChangeLanguage(string lang)
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
            ComponentResourceManager res = new ComponentResourceManager(typeof(Form1));
            ChangeLanguage(this, res);
        }

        private void ChangeLanguage(Control ctrl, ComponentResourceManager res)
        {
            res.ApplyResources(ctrl, ctrl.Name, Thread.CurrentThread.CurrentUICulture);
            foreach (Control c in ctrl.Controls)
            {
                ChangeLanguage(c, res);
            }
        }
    }
}