Ресурсы в приложениях ASP.NET

Обновлен: Ноябрь 2007

Создав вспомогательные сборки для приложения ASP.NET, необходимо расположить их так, чтобы общая среда исполнения смогла их обнаружить и использовать. Структура каталогов для вспомогательных сборок в приложениях ASP.NET и элементах управления ASP.NET отличается от структуры каталогов вспомогательных сборок в приложениях Windows. Приложения ASP.NET могут включать сборки. Однако поскольку страницы ASP.NET преобразуются в сборки динамически, имя сборки заранее неизвестно, и стандартную конфигурацию вспомогательных сборок определить невозможно. В этом разделе описывается, как использовать ресурсы на страницах ASP.NET и в элементах управления ASP.NET.

1ztca10y.alert_note(ru-ru,VS.90).gifПримечание.

Процедуры создания и компиляции ресурсов для приложений ASP.NET не отличаются от процедур создания ресурсов для приложения Windows. Сведения об этом процессе см. в разделах Создание файлов ресурсов, Упаковка и развертывание ресурсов и Создание вспомогательных сборок.

Ресурсы на страницах ASP.NET

Чтобы использовать ресурсы на страницах ASP.NET, прежде всего следует создать параллельную основную сборку, в которой будут храниться ресурсы приложения. Эта сборка будет содержать стандартные или нейтральные ресурсы приложения. Затем необходимо создать вспомогательную сборку с локализованными ресурсами для каждого языка и региональных параметров, поддерживаемых приложением. Основную сборку следует поместить в каталог \bin приложения, а вспомогательные сборки – в соответствующие подкаталоги.

1ztca10y.alert_note(ru-ru,VS.90).gifПримечание.

Если ресурсы развертываются в приложениях ASP.NET с использованием этой модели, все сборки автоматически копируются в глобальный кэш сборок, что позволяет избежать возможных блокировок.

В следующем примере, использованном на странице ASP.NET, создается объект ResourceManager для извлечения необходимых ресурсов.

<%
    Dim a As Assembly = Assembly.Load("myApp")
    Dim rm As ResourceManager = New ResourceManager("myApp", a)
    Response.Write(rm.GetString("string"))
    %>
<%
    Assembly a = Assembly.Load("myApp");
    ResourceManager rm = new ResourceManager("myApp", a);
    Response.Write(rm.GetString("string"));
    %>

Можно явным образом задать язык и региональные параметры, используемые для извлечения ресурсов на странице an .aspx page; для этого предыдущий пример следует дополнить кодом, создающим объект CultureInfo на основе заданного языка и региональных параметров и использующим значение CultureInfo для инициализации свойства CurrentUICulture. В следующем примере каждый раз извлекаются немецкоязычные ресурсы, так как свойство CurrentUICulture указывает родительский немецкий язык.

Thread.CurrentThread.CurrentUICulture = new CultureInfo("de")
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");

Следует заметить, что в этом случае для создания объекта CultureInfo, используемого при инициализации свойства CurrentUICulture, можно задать нейтральный язык и региональные параметры, например "de", однако для инициализации свойства CurrentCulture необходимо указать конкретный язык и региональные параметры. В качестве значения свойства CurrentCulture предполагается конкретная культура, связанная одновременно с языком и страной, например "de-AT" для немецкого языка в Австрии. Нейтральная культура de не подойдет, так как она связана только с языком. Чтобы создать объект CultureInfo в формате, предполагаемом свойством CurrentCulture, следует использовать метод CultureInfo.CreateSpecificCulture. Этот метод создает объект CultureInfo, который представляет конкретный язык и региональные параметры, связанные с заданным нейтральным языком и региональными параметрами. В следующем примере с помощью метода CultureInfo.CreateSpecificCulture создается объект CultureInfo, который отражает определенный язык и региональные параметры, связанные с нейтральным языком "de", а затем этот объект используется для инициализации значения свойства CurrentCulture.

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de")
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de");

Рекомендуется явным образом задавать значения свойств CurrentUICulture и CurrentCulture на странице .aspx. В следующем примере свойству CurrentCulture присваивается значение "de", а затем значение CurrentCulture используется для инициализации свойства CurrentUICulture.

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de")

Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de");

Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

Метод CultureInfo.CreateSpecificCulture также позволяет использовать текущие настройки языка веб-обозревателя для инициализации свойства CurrentCulture на странице .aspx. В следующем примере свойство Request.User.Languages возвращает текущий язык веб-обозревателя в виде строки. Метод CultureInfo.CreateSpecificCulture анализирует эту строку и возвращает объект CultureInfo в формате, который может быть использован для инициализации значения свойства CurrentCulture.

' Set the CurrentCulture property to the culture associated with the Web
' browser's current language setting.
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0])

' It is good practice to explicitly set the CurrentUICulture property.
' Initialize the CurrentUICulture property
' with the CurrentCulture property.
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
// Set the CurrentCulture property to the culture associated with the Web
// browser's current language setting.
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);

// It is good practice to explicitly set the CurrentUICulture property.
// Initialize the CurrentUICulture property
// with the CurrentCulture property.
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

Дополнительные примеры работы с ресурсами в приложениях ASP.NET см. в учебном руководстве Практическое руководство. Извлечение значений ресурсов программными средствами и в разделе Примеры использования ASP.NET (примеры "Локализация приложений ASP.NET" и "Работа с файлами ресурсов").

Ресурсы в элементах управления ASP.NET

Если приложение ASP.NET разрабатывается с использованием элементов управления ASP.NET, можно использовать вышеописанную структуру каталогов. При создании элементов управления можно написать код, использующий ресурсы для представления различных наборов данных в интерфейсе пользователя. Так как элементы управления компилируются, для них создается сборка. В эту сборку можно включить набор стандартных ресурсов. Можно создать вспомогательные сборки для ресурсов, которые будут использоваться элементом управления, и поместить их в структуру каталогов, предназначенную для вспомогательных сборок. Дополнительные сведения см. в разделе Создание вспомогательных сборок. Элемент управления и его ресурсы следует разместить в каталоге \bin корневой папки приложения. На следующем рисунке приведен пример правильной структуры каталогов.

Приложение ASP.NET с каталогом элементов управления ASP.NET
Главная папка ASP.NET, заданная как AppRoot

На странице myPage.aspx можно разместить несколько экземпляров элемента управления myControl, показанного на рисунке. Эти экземпляры можно настроить так, чтобы они ссылались на разные записи файла ресурсов. Это показано в следующем примере кода ASP.NET.

<Loc:myControl runat="server" Text="entry1" />
<Loc:myControl runat="server" Text="entry2" />

В этом примере ResourceManager использует свойство CultureInfo.CurrentUICulture для определения извлекаемых ресурсов.

Следующий пример основан на использовании элемента управления Button. Переменная Text указывает на значение свойства, которое извлекается и затем заносится в элемент управления на странице .aspx. Это значение используется для определения имени записи, которую нужно извлечь. В данном примере это то же свойство, которое используется для возвращения результата пользователю.

Public Class myControl
Inherits Button

    Protected Overrides Sub Render(HtmlTextWriter writer)
        ' rm refers to the ResourceManager.
        Text = rm.GetString(Text)
        MyBase.Render(writer)
    End Sub
End Class
public class mycontrol : Button 
{
    protected override void Render(HtmlTextWriter writer) 
    {
        // rm refers to the ResourceManager.
        Text = rm.GetString(Text);      
        base.Render(writer);
    }
}

См. также

Основные понятия

Ресурсы в приложениях

Создание файлов ресурсов

Упаковка и развертывание ресурсов

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

Ссылки

System.Globalization.CultureInfo

Другие ресурсы

Создание веб-узлов ASP.NET