1. 程式人生 > >WinForm中多國語言的實現

WinForm中多國語言的實現

--1.先設定好預設情況下的介面.然後將localizable改為True,選擇Language的某個語言,再設定該語言的介面.然後再改變 Language,設定相應的介面.此時,如果再將localizable改為False,將用當前選擇的Language語言介面覆寫預設介面資源文 件.

--2.程式開啟進會自動選擇當前系統的語言介面,如果沒有該語言,則顯示預設語言,如果在程式啟動後還想改變語言,則可以參考使用下面的程式碼: 

/// 取得作業系統的語言
public static string GetSystemLang()
{
InputLanguage currentLanguage = InputLanguage.DefaultInputLanguage;
CultureInfo cultureInfo = currentLanguage.Culture;
return cultureInfo.ToString();
}
/// 取得應用程式的介面語言
public static string GetLang()
{
return System.Threading.Thread.CurrentThread.CurrentUICulture.ToString();
}
/// 設定應用程式的介面語言
public static void SetLang(string lang)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
}
/// <summary>
/// 設定窗體的介面資源
/// </summary>
/// <param name="lang">language:zh-CN, en-US</param>
/// <param name="form">窗體例項,不能為null</param>
/// <param name="formType">窗體型別</param>
public static void SetLang(string lang, Form form, Type formType)
{
//設定窗體form的語言,使form的設定立即生效
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);
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)
{
//只改了控制元件的Name屬性
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)
{
AppLang(c, resources);
}
}
}
}

--3.在需要的地方呼叫以下程式碼:

//設定應用程式的語言
SetLang("en-CHS");
//設定窗體的資源
SetLang( this, this.GetType());

--4.生產語言資源的工具
Resourcer.exe
下載頁面:http://www.aisto.com/roeder/dotnet/

2.改變程式中資料的語言
程式中的資料一般儲存在資料庫中,為了支援多語言,資料庫的設計有以下幾個方案:
--1.在資料庫級別支援多語言:為每種語言建立獨立的資料庫,不同語言的使用者操作不同的資料庫。
由於資料庫中有大量的資訊(如標誌,編碼,數字等)是用於內部處理使用的,與語言無關的,因此在資料庫級別支援多語言會導致空間的極大浪費,這種方法一般 不使用.

--2.在表級別支援多語言:為每種語言建立獨立的表,不同語言的使用者操作不同的表,但是它們在同一個資料庫中。
因為並不是所有的表都需要支援多語言,對於與語言無關的表,不同語言的使用者共享一套,那些和語言相關的表根據支援語言的種類來建立,不同語言的使用者存取訪 問不同的表格。這樣使得維護簡單,節省了儲存空間,即使是擴充套件起來也比較方便,只要把需要支援多語言的表,多建立一套即可。
注意:
問題1:有些表中某些欄位是不同語言版本的表共享的(例如庫存量),由於各種語言的表之間的相對獨立性,使得資料共享有些困難。解決的方法有兩個:

--(1)不同語言的表的共享欄位同步:也就是說,只要修改了其中一個表的共享欄位,其它語言表中該欄位也作相應改變,實際上當不同語言的使用者同時訪問時 處理還是比較麻煩的,並且擴充新語言時修改工作比較大。

--(2)增加一個新的表:把所有語言共享的欄位(例如貨物編號,產地編碼等)全部放在這個表,支援多語言的表只存放與各種語言相關的欄位。不同語言的用 戶在使用資料庫時,需要操作兩個資料表。


問題2:不同的語言可能會要求同時顯示.這種情況一般只顯示兩種語言.如簡體中文-英文,繁體中文-英文,簡體中文-繁體中文,不知道有沒有一次顯示簡- 繁-英三種語言的.


--3.在欄位級別支援多語言:在同一個表中為每種語言建立獨立的欄位,不同語言的使用者操作不同的欄位,它們在同一個表中。
這種方法最大的問題是一旦需要支援新的語言,由於需要修改表結構,維護起來非常麻煩,可擴充套件性不好。


參考文獻:1.http://blog.csdn.net/tjvictor/archive/2006/12/27/1464284.aspx
2.http://www.cnbruce.com/blog/showlog.asp?log_id=691&cat_id=0
3.http://blog.csdn.net/leomaya/archive/2007/01/12/1481437.aspx
4.http://hi.baidu.com/mops/blog/item/954095ece7d0433f26979198.html
5.http://faq.csdn.net/read/170926.html
                  轉自:http://apps.hi.baidu.com/share/detail/18552608