Vyhledání a použití prostředků pro konkrétní jazykovou verzi
Modul CLR (Common Language Runtime) poskytuje podporu pro načítání prostředků specifické jazyková verze, které jsou zabaleny a nasazeny v satelitní sestavení. Satelitní sestavení obsahují pouze soubory prostředků nebo volné prostředky, jako jsou například soubory GIF. Neobsahují žádný spustitelný kód.
V modelu nasazení satelitního sestavení je vytvářena aplikace s výchozím sestavením (hlavní sestavení) a několika satelitními sestaveními. Měli byste zabalit prostředky pro výchozí nebo neutrální jazykovou verzi s hlavním sestavením a vytvořit samostatné satelitní sestavení pro každý jazyk, který podporuje vaše aplikace. Vzhledem k tomu, že satelitní sestavení nejsou součástí hlavního sestavení, je možné snadno nahradit nebo aktualizovat prostředky, které odpovídají konkrétní jazykové verzi bez nahrazení hlavního sestavení aplikace.
Například v jednoduché aplikaci „Hello world“ je-li výchozí nebo neutrální jazyková verze „en“ (angličtina), můžete vytvořit prostředek s názvem Greeting a uložit do něj jediný řetězec s názvem HelloString, jehož hodnota je „Hello world!“ Pro účely označení, že „en“ je výchozí jazyková verze aplikace, musíte také přidat následující atribut System.Resources.NeutralResourcesLanguageAttribute do souboru AssemblyInfo aplikace nebo do jednoho ze souborů zdrojového kódu, které budou zkompilovány do hlavního sestavení aplikace.
<Assembly: NeutralResourcesLanguageAttribute("en")>
Pak přidáte podporu pro další jazykové verze k vaší aplikaci. Například jazykové verze „en-US“, „fr-FR“ a „ru-RU“ lze podporovat následujícím způsobem:
Aby byla podporována jazyková verze „en US“ nebo Angličtina (Spojené státy), vytvořte zdrojový soubor s názvem Greeting.en-US.resx a uložte do něj jeden řetězec s názvem HelloString, jehož hodnota je „Hi world!“.
Aby byla podporována jazyková verze „fr-FR“ nebo Francouzština (Francie), vytvořte zdrojový soubor s názvem Greeting.fr-FR.resx a uložte do něj jeden řetězec s názvem HelloString, jehož hodnota je „Salut tout le monde!“.
Aby byla podporována jazyková verze „ru-RU“ nebo Ruština (Rusko), vytvořte zdrojový soubor s názvem Greeting.ru-RU.resx a uložte do něj jeden řetězec s názvem HelloString, jehož hodnota je „Всем привет!“.
Třída System.Resources.ResourceManager poskytuje přístup k prostředkům specifické jazykové verze při běhu a řídí způsob, jakým aplikace načte prostředky pomocí nouzového procesu prostředků. Další informace naleznete v části Proces nouzového prostředku v tématu Balení a nasazení prostředků.
Objekt ResourceManager určuje, které prostředky získat na základě aktuálního vlákna vlastnosti CultureInfo.CurrentUICulture. Například v případě, že aplikace je kompilována s výchozími anglickými jazykovými prostředky v hlavním sestavení a francouzskými a ruskými jazykovými prostředky ve dvou satelitních sestaveních a vlastnost CurrentUICulture je nastavena na fr-FR, objekt ResourceManager načte francouzské prostředky.
Vlastnost CurrentUICulture lze nastavit explicitně nebo implicitně. Způsob, jakým je tato vlastnost nastavena, ovlivňuje způsob, jak objekt ResourceManager načte prostředky na základě jazyková verze:
Pokud aplikace nastaví vlastnost CurrentUICulture explicitně pro konkrétní jazykovou verzi v kódu aplikace, zaručuje, že prostředky pro tuto jazykovou verzi budou vždy načteny bez ohledu na jazyk prohlížeče nebo operačního systému uživatele. Zvažte aplikaci, která je kompilována s výchozími anglickými jazykovými prostředky a třemi satelitními sestaveními obsahujícími prostředky pro prostředky pro angličtinu (USA), francouzštinu (Francie) a ruštinu (Rusko). Pokud je vlastnost CurrentUICulture nastavena na hodnotu „fr-FR“, objekt ResourceManager vždy získá prostředky Francouzština (Francie), i v případě, že jazykem operačního systému uživatele není francouzština. Před explicitním nastavením této vlastnosti se ujistěte, zda je toto požadované chování.
Upozornění V aplikacích technologie ASP.NET je třeba nastavit vlastnost CurrentUICulture explicitně, protože je nepravděpodobné, že nastavení serveru se bude shodovat s příchozími žádostmi klientů.Aplikace ASP.NET může nastavit vlastnost CurrentUICulture explicitně na přijatý jazyk prohlížeče uživatele.
Pokud vlastnost CurrentUICulture není explicitně nastavena aplikací, je v systému Windows 2000 a Windows XP implicitně nastavena funkcí GetUserDefaultUILanguage. Tato funkce je poskytována rozhraním Multilingual User Interface (MUI), což umožňuje uživateli nastavit výchozí jazyk. Pokud není jazyk uživatelského rozhraní nastaven uživatelem, nastaví se ve výchozím nastavení na jazyk instalovaný systémem, což je jazyk prostředků operačního systému.
Následující příklad výslovně nastavuje vlastnost CurrentUICulture. Definuje pole, které obsahuje názvy podporovaných jazykových verzí pro jednoduchou aplikaci „Hello world“. Poté náhodně vybere jeden z názvů jazykových verzí a použije jej k doložení objektu CultureInfo a nastaví tuto jazykovou verzi jako aktuální jazykovou verzi vlákna. Volání metody MessageBox.Show (v příkladu C#) nebo funkce Interaction.MsgBox (v příkladu Visual Basic) pak zobrazí lokalizovaný řetězec přiřazený k prostředku 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;
}
}
}
Viz také
Koncepty
Načítání prostředků v satelitních sestaveních
Prostředky v aplikacích technologie ASP.NET
Další zdroje
Historie změn
Datum |
Historie |
Důvod |
---|---|---|
Květen 2010 |
Revidované rozsáhle. |
Názory zákazníků |