共用方式為


逐步解說:將 Windows Form 當地語系化

Visual Studio 專案系統對於 Windows Form 應用程式的當地語系化提供了相當程度的支援。有兩種方式可以使用 Visual Studio 開發環境產生資源檔:

  • 讓專案系統針對可當地語系化的 UI 項目 (例如表單上的文字和影像) 產生資源檔。接著再將資源檔建置至附屬組件;這些稱為表單架構資源。

  • 加入資源檔範本然後使用 XML 設計工具編輯範本。執行第二種方法的原因,是為了製作出現在對話方塊和錯誤訊息中的可當地語系化字串。在這個情況下,您必須撰寫程式碼以存取這些資源。這些稱為專案資源。

  • 一般而言,對於 Windows Form 應用程式中表單的所有特定資源,您應該都使用表單架構資源。對於所有非表單架構的使用者介面字串和影像 (例如錯誤訊息),您應該都使用專案資源。

Note注意事項

對於相同的屬性而言,維持一致性並使用表單架構資源或專案資源是非常重要的。許多影像屬性,例如 PictureBox 上的 Image 屬性,可讓您能夠從專案資源選取影像,或是將新的影像匯入為表單架構資源。如果您嘗試使用專案資源來設定預設影像,卻使用表單架構資源來設定影像的語言特定版本,該預設影像就絕對不會顯示。

這個逐步解說主題會用同一個 Windows 應用程式專案,來示範上述這兩個不同的程序。

您也可以將文字檔轉換成資源檔。如需詳細資訊,請參閱文字檔格式的資源資源檔產生器 (Resgen.exe)

若要由 Visual Studio 為您產生資源檔

  1. 建立命名為「WindowsApplication1」的新 Windows 應用程式。如需詳細資訊,請參閱 HOW TO:建立 Windows 應用程式專案

  2. 在 [屬性] 視窗中,將表單的 Localizable 屬性設定為 true

    Language 屬性已經設為 [(預設值)]。

  3. Button 控制項從 Windows Form 的 [工具箱] 索引標籤拖曳至表單,然後將該控制項的 Text 屬性設定為 Hello World

  4. 將表單的 Language 屬性設定為 [德文 (德國)]。

  5. 將按鈕的 Text 屬性設定為 Hallo Welt

  6. 將表單的 Language 屬性設定為 [法文 (法國)]。

  7. 將按鈕的 Text 屬性設定為 Bonjour le Monde。如有需要,您可以調整按鈕大小,以容納較長的字串。

  8. 儲存並建置方案。

  9. 在 [方案總管] 中,按一下 [顯示所有檔案] 按鈕。

    資源檔會出現在 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 檔案是空的,而且不包含任何資源。

  10. 按下 F5 鍵,或從 [偵錯] 功能表中選擇 [啟動]。

    根據您作業系統的 UI 語言,現在您將會看到英文、法文或德文問候的對話方塊。

    Note注意事項

    使用在 Windows 中的 UI 語言是 [CurrentUICulture] 設定的功能。如果您的 Windows 複本已安裝了「多語系使用者介面套件 (Multilingual User Interface Pack)」,便可以在 [控制台] 中變更 UI 語言。如需詳細資訊,請參閱 Windows Server 2003, Windows XP & Windows 2000 MUI 站台。如果沒有安裝 MUI,可以程式設計方式變更 UI 文化特性設定,如以下說明所示。

    下列程序將說明如何設定 UI 文化特性,使應用程式顯示您的法文資源。在實際的應用程式中,您不會以這種方法將 UI 文化特性硬式編碼。UI 文化特性的設定將以使用者設定或應用程式設定為根據。

若要設定 UI 文化特性以檢視特定資源

  1. 在 [程式碼編輯器] 中,將下列程式碼加入至 Form1 宣告之前的模組起始處:

    ' Visual Basic
    Imports System.Globalization
    Imports System.Threading
    
    // C#
    using System.Globalization;
    using System.Threading;
    
    // Visual J#
    import System.Globalization.*;
    import System.Threading.*;
    
  2. 加入下列程式碼。在 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"));
    
  3. 儲存並建置方案。

  4. 按下 F5 鍵,或從 [偵錯] 功能表中選擇 [啟動]。

    現在,表單將一律以法文顯示。如果您先前已更改按鈕大小以容納較長的法文字串,請注意法文資源檔中也保存了該按鈕的大小。

若要以手動方式將資源檔案加入至專案並加以編輯

  1. 在 [專案] 功能表上按一下 [加入新項目]。

  2. 在 [範本] 方塊中,選取 [組件資源檔] 範本。在 [名稱] 方塊中,輸入檔案名稱 "WinFormStrings.resx"。檔案 WinFormStrings.resx 將會包含英文的原有資源。每當應用程式找不到更適合 UI 文化特性的資源,就會存取這些資源。

    檔案將加入至 [方案總管] 中的專案,並以 [資料] 檢視在 XML 設計工具中自動開啟。

  3. 在 [資料表] 窗格中,選取 [資料]。

  4. 在 [資料] 窗格中按一下空白資料列,然後在 [名稱] 資料行中輸入 strMessage,在 [數值] 資料行中輸入 Hello World

    您不需要指定字串的型別或 mimetype,它們只使用於物件。這個類型規範會保留所儲存物件的資料型別。如果物件包含二進位資料,則 MIME 類型規範會保有所儲存二進位資訊的基底型別 (base64)。

  5. 在 [檔案] 功能表上按一下 [儲存 WinFormStrings.resx]。

  6. 再重複兩次步驟 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

若要存取以手動方式加入的資源

  1. 在 [程式碼編輯器] 中,於程式碼模組起始處匯入 System.Resources 命名空間。

    ' Visual Basic
    Imports System.Resources
    
    // C#
    using System.Resources;
    
    // Visual J#
    import System.Resources.*;
    
  2. 在 [設計] 檢視中,按兩下按鈕以顯示其 Click 事件處理常式的程式碼,並加入下列程式碼。ResourceManager 建構函式會取得兩個引數。第一個是資源的根名稱,也就是不含文化特性和 .resx 後置字元的資源檔名稱。第二個引數是主要組件。

    在這個逐步解說中不會宣告任何命名空間,因此 ResourceManager 建構函式的第一個引數可以採用 ProjectName.ResourceFileRootName 的形式。然而,在實際應用程式中,您會設定 DefaultNamespace 屬性。在這種情況下,您就必須使用資源檔的完整根名稱 (包括它的命名空間) 來宣告資源管理員。例如,如果預設命名空間為 MyCompany.MyApplication.MyComponentResourceManager 建構函式的第一個引數就可能是 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"));
    
    Note注意事項

    根據預設,ResourceManager 物件會區分大小寫。如果您要進行不區分大小寫的查詢,使得 "TXTWELCOME" 與 "txtWelcome" 擷取相同的資源,可以將資源管理員的 IgnoreCase 屬性設定為 true。不過,為了能夠保持效能,最好一律指定資源名稱的正確大小寫。執行不區分大小寫的資源查詢可能會引起效能的問題。

  3. 建置並執行表單。按一下這個按鈕。

    訊息方塊將會顯示適合 UI 文化特性設定的字串;或者,如果找不到 UI 文化特性的資源,它就會顯示原有資源中的字串。

請參閱

工作

HOW TO:設定 Windows Form 全球化的文化特性和 UI 文化特性