找出和使用特定文化特性資源
更新: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 月 |
大規模修訂。 |
客戶回函。 |