顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2011年9月8日 星期四

完整的C#多國語言解決方案(二)- 字串多國語言

首先,為專案加入一個資源檔,如圖所示,選新增項目,然後選擇資源檔,要建立兩個檔案,注意檔名要相同,而檔名跟副檔名(.resx)之間要多一個語言次檔名,這個副檔名是有規則有規定的,請參照文化語言表。比方取名為LanguagePack.en.resx 跟LanguagePack.zh-TW.resx 就可以根據系統是中文還是英文,來取出對應的文字。












檔案增加好了之後程式怎麼撰寫?請看:
假設此專案的Namespace名稱為MultiLanguageTest
假設把語言包取名為LanguagePack
假設LanguagePack.en.resx裡面有新增一個StringTest001的字串。內容是:"我是中文的字串"
假設LanguagePack.zh-TW.resx裡面有新增一個StringTest001的字串。內容是:"I am English"


利用ResourceManager來取得對應文化的resx檔案,然後利用GetString()告訴ResourceManager你要取得那個字串,如此,就會根據你的OS來抓取正確的語言檔.resx


ResourceManager Rm = new ResourceManager( "MultiLanguageTest.LanguagePack", Assembly.GetExecutingAssembly( ) );
MessageBox.Show( Rm.GetString( "StringTest001" ) );




「這樣測試過後,只能看到中文的字串,因為我用的是中文的作業系統啊,怎麼知道這樣寫對不對?」在你的Program.cs 的main()裡加上這個Thread.CurrentThread.CurrentUICulture = new CultureInfo( "en" ); ,執行之後,你就可以讓程式強制在英文的語言文化來呈現了。


加上這行之後,編譯可能看到「Thread不存在目前內容中」、「CultureInfo不存在目前內容中」的錯誤訊息,Using引用進來就好了。

完整的C#多國語言解決方案(一)- 畫面多國語言

新增一個C#專案,並選擇 [ Windows Form應用程式 ],將原本預設的 Form1更改設定為FormMain,可看到畫面如下

 







為了測試,我們在Form上面放上四個原件,一個Lable,名稱為Lbl_Test,一個ListBox,名稱為LstBx_Test,一個PictureBox,名稱為PBox_Test,一個按鈕,名稱為Btn_Test。

將Form的Localizable改為True,此Form就會具有多國語言的特質,然後若把Language改為中文,並且更改視窗內任何原件的位置或Text,之後存檔,就會看到多了一個檔案:FormMain.zh-TW.resx,位置跟文字的資訊就會被儲存在這個語系檔中。如下圖




接下來再把Language改為英文,並且更改視窗內任何原件的位置或Text,之後存檔,就會看到多了一個檔案:FormMain.en.resx,位置跟文字的資訊就會被儲存在這個語系檔中。如下圖




如何能控制系統現在要顯示哪一種語系的應用程式外觀呢?可以不用設定,OS就會自動決定出了你的語系,比方你安裝台灣中文版的Windows通常你的語系跟使用地區就會是台灣,安裝過程也有讓你設定使用地區,這些就會決定了語系,當然,為了測試或特殊需求,你也可以在Program.cs當中撰寫以下幾行程式:

CultureInfo CI = new CultureInfo( "zh-TW" );
System.Threading.Thread.CurrentThread.CurrentUICulture = CI;

CultureInfo就是設定文化語系的Class,用他設定zh-TW或en即可決定要使用的語系國家,之後將此設定到CurrentThread即可將此程式指定為該語系了。經過以上的設定過後,專案將會有中文與英文兩個版面,而根據被指定要顯示中文或英文語系來顯示不同的Text String與物件位置(各國語言文字所需要的長寬不同的關係)。

那圖片的部分能不能透過以上的步驟來設定兩種以上語系的圖片,然後讓應用程式根據語系,來呈現不同的圖片呢?答案是不行。圖片的控制要自己來。這是最麻煩的地方,多語系如果要有不同的圖,就是要多花很多功夫。






而如果你有訊息要顯示在...比方對話框中,或者是其他跟Form、Panel無關的地方能不能透過這種設定方式,來讓不同語系之下,顯示不同的Text String呢?答案是不行。難道就這麼束手無策了嗎?也不是的,跟圖片不同的是,有特別的解決方法,請看以下的作法介紹: