共用方式為


找出和使用特定文化特性資源

更新:2010 年 5 月

Common Language Runtime 提供擷取特定文化特性資源的支援,該資源已封裝並在附屬組件中部署完成。 附屬組件只包含資源檔或鬆散資源,例如 .gif 檔案。 它們不包含任何可執行碼。

在附屬組件部署模型中,您以一個預設組件 (主要組件) 和數個附屬組件來建立應用程式。 觀念上,您應該將預設或中性文化特性的資源與主要組件一起封裝,並為您應用程式所支援的各個語言建立個別的附屬組件。 因為附屬組件不是主要組件的一部分,所以您可以輕易取代或更新對應至特定文化特性的資源,而不需取代應用程式的主要組件。

例如,在簡單的 "Hello world" 應用程式中,如果預設或中性文化特性為 "en" (英文),您可以建立名為 Greeting 的資源,並將它儲存在名為 HelloString 的單一字串中 (其值為 "Hello world!")。若要指示 "en" 為應用程式的預設文化特性,您也必須將下列 System.Resources.NeutralResourcesLanguageAttribute 屬性加入至應用程式的 AssemblyInfo 檔案,或是加入至將要編譯成應用程式主要組件的其中一個原始程式碼檔。

<Assembly: NeutralResourcesLanguageAttribute("en")>

然後您會在應用程式中加入其他文化特性的支援。 例如,您可以支援 "en-US"、"fr-FR" 和 "ru-RU" 文化特性,如下所示:

  • 若要支援 "en-US" 或英文 (美國) 文化特性,請建立名為 Greeting.en-US.resx 的資源檔,並將它儲存在名為 HelloString 的單一字串中 (其值為 "Hi world!")。

  • 若要支援 "fr-FR" 或法文 (法國) 文化特性,請建立名為 Greeting.fr-FR.resx 的資源檔,並將它儲存在名為 HelloString 的單一字串中 (其值為 "Salut tout le monde!")。

  • 若要支援 "ru-RU" 或俄文 (俄羅斯) 文化特性,請建立名為 Greeting.ru-RU.resx 的資源檔,並將它儲存在名為 HelloString 的單一字串中 (其值為 "Всем привет!")。

System.Resources.ResourceManager 類別提供在執行階段對特定文化特性資源的存取,並使用資源後援處理序來控制應用程式擷取資源的方式。 如需詳細資訊,請參閱封裝和部署資源主題中的<資源後援程序>章節。

ResourceManager 物件根據目前執行緒的 CultureInfo.CurrentUICulture 屬性來決定要擷取哪些資源。 例如,如果使用預設英文資源在主要組件中編譯應用程式,並使用法文 (法國) 和俄文 (俄羅斯) 資源在兩個附屬組件中編譯,而且 CurrentUICulture 屬性設為 "fr-FR",ResourceManager 物件將會擷取法文資源。

CurrentUICulture 屬性可以明確或隱含地設定。 這個屬性的設定方式會影響 ResourceManager 物件如何根據文化特性來擷取資源:

  • 如果應用程式在應用程式程式碼中明確將 CurrentUICulture 屬性設定為特定的文化特性,可確保不論使用者的瀏覽器或作業系統的語言為何,都會擷取該文化特性的資源。 假設應用程式使用預設英文資源及三個含有英文 (美國)、法文 (法國) 和俄文 (俄羅斯) 資源的附屬組件來編譯。 如果 CurrentUICulture 屬性設為 "fr-FR",即使使用者的作業系統語言不是法文,ResourceManager 物件仍會永遠擷取法文 (法國) 資源。 請在明確設定這個屬性之前,確認這是您要的行為。

    注意

    在 ASP.NET 應用程式中,您必須明確設定 CurrentUICulture 屬性,因為伺服器上的設定可能會與傳入的用戶端要求不相符。ASP.NET 應用程式可以明確將 CurrentUICulture 屬性設為使用者瀏覽器接受的語言。

  • 如果應用程式未明確設定 CurrentUICulture 屬性,則會由 Windows 2000 和 Windows XP 中的 GetUserDefaultUILanguage 函式隱含地設定。 此函式是由多語系使用者介面 (MUI) 提供,此介面可讓使用者設定預設語言。 如果使用者並未設定 UI 語言,則會預設為系統安裝的語言,也就是作業系統資源的語言。

下列範例會明確設定 CurrentUICulture 屬性。 它所定義的陣列包含了簡單 "Hello world" 應用程式支援的文化特性名稱。 然後它會隨機選取其中一個文化特性名稱、用它來具現化 CultureInfo 物件,並讓該文化特性成為目前執行緒的目前文化特性。 然後 MessageBox.Show 方法 (在 C# 範例中) 或 Interaction.MsgBox 函式 (在 Visual Basic 範例中) 的呼叫會顯示指派給 HelloString 資源的當地語系化字串。

Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Module1

   Sub Main()
      ' Create array of supported cultures
      Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU" }
      Dim rnd As New Random()
      Dim cultureNdx As Integer = rnd.Next(0, cultures.Length)
      Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture

      Try
         Dim newCulture As New CultureInfo(cultures(cultureNdx))
         Thread.CurrentThread.CurrentCulture = newCulture
         Thread.CurrentThread.CurrentUICulture = newCulture
         Dim greeting As String = String.Format("The current culture is {0}.{1}{2}",
                                                Thread.CurrentThread.CurrentUICulture.Name,
                                                vbCrLf, My.Resources.Greetings.HelloString)

         MsgBox(greeting)
      Catch e As CultureNotFoundException
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName)
      Finally
         Thread.CurrentThread.CurrentCulture = originalCulture
         Thread.CurrentThread.CurrentUICulture = originalCulture
      End Try
   End Sub
End Module
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;
using System.Windows.Forms;

class Program
{
   static void Main()
   {
      // Create array of supported cultures
      string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU"};
      Random rnd = new Random();
      int cultureNdx = rnd.Next(0, cultures.Length);
      CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;

      try {
         CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
         Thread.CurrentThread.CurrentCulture = newCulture;
         Thread.CurrentThread.CurrentUICulture = newCulture;
         ResourceManager rm = new ResourceManager("LocatingCS1.Greetings", Assembly.GetExecutingAssembly()); 
         string greeting = String.Format("The current culture is {0}.\n{1}",
                                         Thread.CurrentThread.CurrentUICulture.Name,
                                         rm.GetString("HelloString"));

         MessageBox.Show(greeting);
      }
      catch (CultureNotFoundException e) {
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
      }
      finally {
         Thread.CurrentThread.CurrentCulture = originalCulture;
         Thread.CurrentThread.CurrentUICulture = originalCulture;
      }
   }
}

請參閱

概念

應用程式中的資源

擷取附屬組件中的資源

Resources in ASP.NET Applications

其他資源

編碼和當地語系化

變更記錄

日期

記錄

原因

2010 年 5 月

大規模修訂。

客戶回函。