逐步解說:將 Windows Form 當地語系化
更新:2007 年 11 月
Visual Studio 專案系統對於 Windows Form 應用程式的當地語系化提供了相當程度的支援。有兩種方式可以使用 Visual Studio 開發環境產生資源檔:
讓專案系統針對可當地語系化的 UI 項目 (例如表單上的文字和影像) 產生資源檔。接著再將資源檔建置至附屬組件;這些稱為表單架構資源。
加入資源檔範本然後使用 XML 設計工具編輯範本。執行第二種方法的原因,是為了製作出現在對話方塊和錯誤訊息中的可當地語系化字串。在這個情況下,您必須撰寫程式碼以存取這些資源。這些稱為專案資源。
一般而言,對於 Windows Form 應用程式中表單的所有特定資源,您應該都使用表單架構資源。對於所有非表單架構的使用者介面字串和影像 (例如錯誤訊息),您應該都使用專案資源。
注意事項: |
---|
對於相同的屬性而言,維持一致性並使用表單架構資源或專案資源是非常重要的。許多影像屬性,例如 PictureBox 上的 Image 屬性,可讓您能夠從專案資源選取影像,或是將新的影像匯入為表單架構資源。如果您嘗試使用專案資源來設定預設影像,卻使用表單架構資源來設定影像的語言特定版本,該預設影像就絕對不會顯示。 |
這個逐步解說主題會用同一個 Windows 應用程式專案,來示範上述這兩個不同的程序。
您也可以將文字檔轉換成資源檔。如需詳細資訊,請參閱文字檔格式的資源和資源檔產生器 (Resgen.exe)。
若要由 Visual Studio 為您產生資源檔
建立命名為「WindowsApplication1」的新 Windows 應用程式。如需詳細資訊,請參閱 HOW TO:建立 Windows 應用程式專案。
在 [屬性] 視窗中,將表單的 Localizable 屬性設定為 true。
Language 屬性已經設為 [(預設值)]。
將 Button 控制項從 Windows Form 的 [工具箱] 索引標籤拖曳至表單,然後將該控制項的 Text 屬性設定為 Hello World。
將表單的 Language 屬性設定為 [德文 (德國)]。
將按鈕的 Text 屬性設定為 Hallo Welt。
將表單的 Language 屬性設定為 [法文 (法國)]。
將按鈕的 Text 屬性設定為 Bonjour le Monde。如有需要,您可以調整按鈕大小,以容納較長的字串。
儲存並建置方案。
在 [方案總管] 中,按一下 [顯示所有檔案] 按鈕。
資源檔會出現在 Form1.vb、Form1.cs 或 Form1.jsl 之下。Form1.resx 是內建到主要組件中的預設文化特性資源檔。Form1.de-DE.resx 是德國德文的資源檔。Form1.fr-FR.resx 是法國法文的資源檔。
除此之外,您將會看到命名為 Form1.de.resx 和 Form1.fr.resx 的檔案出現。Visual Studio 會自動建立這些檔案,以便在與儲存作業期間將新檔案加入專案相關的 Visual SourceSafe 限制下運作。.resx 檔案是空的,而且不包含任何資源。
按下 F5 鍵,或從 [偵錯] 功能表中選擇 [啟動]。
根據您作業系統的 UI 語言,現在您將會看到英文、法文或德文問候的對話方塊。
注意事項: 使用在 Windows 中的 UI 語言是 [CurrentUICulture] 設定的功能。如果您的 Windows 複本已安裝了「多語系使用者介面套件 (Multilingual User Interface Pack)」,便可以在 [控制台] 中變更 UI 語言。如需詳細資訊,請參閱 Windows Server 2003, Windows XP & Windows 2000 MUI (英文) 網站。如果沒有安裝 MUI,可以程式設計方式變更 UI 文化特性設定,如以下說明所示。
下列程序將說明如何設定 UI 文化特性,使應用程式顯示您的法文資源。在實際的應用程式中,您不會以這種方法將 UI 文化特性硬式編碼。UI 文化特性的設定將以使用者設定或應用程式設定為根據。
若要設定 UI 文化特性以檢視特定資源
在 [程式碼編輯器] 中,將下列程式碼加入至 Form1 宣告之前的模組起始處:
' Visual Basic Imports System.Globalization Imports System.Threading // C# using System.Globalization; using System.Threading; // Visual J# import System.Globalization.*; import System.Threading.*;
加入下列程式碼。在 Visual Basic 中,應該在 New 函式中加入這段程式碼,就在呼叫 InitializeComponent 函式之前。在 Visual C# 和 Visual J# 中,應該在 Form1 中加入這段程式碼,並且仍然是在呼叫 InitializeComponent 函式之前。
' Visual Basic ' Sets the UI culture to French (France). Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr-FR") // C# // Sets the UI culture to French (France). Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR"); // Visual J# // Sets the UI culture to French (France). System.Threading.Thread.get_CurrentThread().set_CurrentUICulture( new CultureInfo("fr-FR"));
儲存並建置方案。
按下 F5 鍵,或從 [偵錯] 功能表中選擇 [啟動]。
現在,表單將一律以法文顯示。如果您先前已更改按鈕大小以容納較長的法文字串,請注意法文資源檔中也保存了該按鈕的大小。
若要以手動方式將資源檔案加入至專案並加以編輯
在 [專案] 功能表上,按一下 [加入新項目]。
在 [範本] 方塊中,選取 [組件資源檔] 範本。在 [名稱] 方塊中,輸入檔案名稱 "WinFormStrings.resx"。檔案 WinFormStrings.resx 將會包含英文的原有資源。每當應用程式找不到更適合 UI 文化特性的資源,就會存取這些資源。
檔案將加入至 [方案總管] 中的專案,並以 [資料] 檢視在 XML 設計工具中自動開啟。
在 [資料表] 窗格中,選取 [資料]。
在 [資料] 窗格中按一下空白資料列,然後在 [名稱] 資料行中輸入 strMessage,在 [數值] 資料行中輸入 Hello World。
您不需要指定字串的型別或 mimetype,它們只使用於物件。這個類型規範會保留所儲存物件的資料型別。如果物件包含二進位資料,則 MIME 類型規範會保有所儲存二進位資訊的基底型別 (base64)。
在 [檔案] 功能表上按一下 [儲存 WinFormStrings.resx]。
再重複兩次步驟 1 到 5,使用下表中指定的字串資源建立另外兩個名為 WinFormStrings.de-DE.resx 和 WinFormStrings.fr-FR.resx 的資源檔。檔案 WinFormStrings.de-DE.resx 將包含德國德文特有的資源。檔案 WinFormStrings.fr-FR.resx 將包含法國法文特有的資源。
資源檔名稱
名稱
值
WinFormStrings.de-DE.resx
strMessage
Hallo Welt
WinFormStrings.fr-FR.resx
strMessage
Bonjour le Monde
若要存取以手動方式加入的資源
在 [程式碼編輯器] 中,於程式碼模組起始處匯入 System.Resources 命名空間。
' Visual Basic Imports System.Resources // C# using System.Resources; // Visual J# import System.Resources.*;
在 [設計] 檢視中,按兩下按鈕以顯示其 Click 事件處理常式的程式碼,並加入下列程式碼。ResourceManager 建構函式會取得兩個引數。第一個是資源的根名稱,也就是不含文化特性和 .resx 後置字元的資源檔名稱。第二個引數是主要組件。
在這個逐步解說中不會宣告任何命名空間,因此 ResourceManager 建構函式的第一個引數可以採用 ProjectName.ResourceFileRootName 的形式。然而,在實際應用程式中,您會設定 DefaultNamespace 屬性。在這種情況下,您就必須使用資源檔的完整根名稱 (包括它的命名空間) 來宣告資源管理員。例如,如果預設命名空間為 MyCompany.MyApplication.MyComponent,ResourceManager 建構函式的第一個引數就可能是 MyCompany.MyApplication.MyComponent.WinFormStrings。
' Visual Basic ' Declare a Resource Manager instance. Dim LocRM As New ResourceManager("WindowsApplication1.WinFormStrings", GetType(Form1).Assembly) ' Assign the string for the "strMessage" key to a message box. MessageBox.Show(LocRM.GetString("strMessage")) // C# // Declare a Resource Manager instance. ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings",typeof(Form1).Assembly); // Assign the string for the "strMessage" key to a message box. MessageBox.Show(LocRM.GetString("strMessage")); // Visual J# // Declare a Resource Manager instance. ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings", System.Type. GetType("WindowsApplication1.Form1").get_Assembly()); // Assign the string for the "strMessage" key to a message box. MessageBox.Show(LocRM.GetString("strMessage"));
注意事項: 根據預設,ResourceManager 物件會區分大小寫。如果您要進行不區分大小寫的查詢,使得 "TXTWELCOME" 與 "txtWelcome" 擷取相同的資源,可以將資源管理員的 IgnoreCase 屬性設定為 true。不過,為了能夠保持效能,最好一律指定資源名稱的正確大小寫。執行不區分大小寫的資源查詢可能會引起效能的問題。
建置並執行表單。按一下這個按鈕。
訊息方塊將會顯示適合 UI 文化特性設定的字串;或者,如果找不到 UI 文化特性的資源,它就會顯示原有資源中的字串。