Обнаружение и использование ресурсов для определенного языка и региональных параметров

Среда CLR поддерживает извлечение ресурсов, зависящих от языка и региональных параметров, упакованных и развертываемых во вспомогательных сборках. Вспомогательные сборки содержат только файлы ресурсов или неупакованные ресурсы, например GIF-файлы. Они не содержат никакого исполняемого кода.

В модели развертывания вспомогательных сборок создается приложение со сборкой по умолчанию (основной сборкой) и несколькими вспомогательными сборками. Ресурсы для языка и региональных параметров по умолчанию или нейтрального языка и региональных параметров упаковываются с основной сборкой, а для каждого языка, поддерживаемого приложением, создается отдельная вспомогательная сборка. Поскольку эти вспомогательные сборки не являются частью основной сборки, можно легко заменять или обновлять ресурсы, соответствующие определенному языку и региональным параметрам, не заменяя основную сборку для приложения.

Например, если в простом приложении "Hello world" язык и региональные параметры по умолчанию или нейтральный язык и региональные параметры — "en" (английский), можно создать ресурс с именем Greeting и сохранить в нем простую строку с именем HelloString, значение которой — "Hello world!". Чтобы указать, что язык и региональные параметры по умолчанию для приложения — "en", необходимо также добавить в файл AssemblyInfo приложения или в один из файлов исходного кода, которые будут скомпилированы в основную сборку приложения, следующий атрибут System.Resources.NeutralResourcesLanguageAttribute.

<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 не задано явно приложением, оно задается неявно функцией GetUserDefaultUILanguage в Windows 2000 и Windows XP. Эта функция предоставляется многоязыковым интерфейсом пользователя (MUI), который позволяет пользователю задать язык по умолчанию. Если пользователь не задал язык пользовательского интерфейса, по умолчанию будет установлен язык, заданный системой, то есть язык ресурсов операционной системы.

В следующем примере свойство 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

Значительно пересмотрено.

Обратная связь от клиента.