Ресурсы проекта
"Для каждого предусмотрен его личный конец света."
Хенрик Ягодзиньский
Создание многоязычных web-сайтов имеет особенно большое значение в неанглоговорящих странах. Изначально ASP .NET настроена на английский язык, причем на его американскую разновидность. Причины этого очевидны. Но платформа .NET поддерживает концепцию информации о культуре, а строки хранятся в формате Unicode, что позволяет писать их на множестве языков. Глобализация — это создание приложений, способных работать в разных культурных средах. Локализация — создание ресурсов для работы с конкретной культурой. Ресурсы должны быть отделены от программного кода.
Классы для работы с информацией о культурах заключены в пространстве имен Globalization. Класс CultureInfo содержит свойство CurrentCulture, которое позволяет узнать все данные о текущей культуре — форматы отображения, календарь, кодовую страницу и другие.
Файлы ресурса содержат строки, которые могут быть написаны на разных языках для различных культурных сред. Формат этих файлов — XML, следующий специальной схеме Microsoft ResX. Файлы .resx автоматически включаются в сборку для использования на страницах. Кроме строк, файлы ресурса могут содержать картинки и другие файлы. Их можно использовать для создания многоязычных приложений. В отличие от предыдущих версий, ресурсы не нужно компилировать вручную в сборку-сателлит — ASP .NET 2.0 делает это сама.
В папке App_GlobalResources хранятся файлы ресурсов, названия которых соответствуют культурной схеме.
Например, ресурс для русской культуры называется Resource.ru-ru.resx, для финской — Resource.fi-FI.resx. Ресурс с нейтральной культурой называется просто Resource.resx. Ресурсы доступны для всех страниц и пользовательских элементов управления. Промежуточное расширение следует стандарту .NET на региональные стандарты — состоит из главного и вспомогательного тегов.
В папке \App_LocalResources хранятся локальные файлы ресурсов для конкретных страниц. Название файла ресурса формируется из имени страницы, кода культурной среды и расширения resx. Например, default.aspx.de.resx — это файл ресурса на немецком языке для страницы default.aspx.
Протокол HTTP позволяет браузерам посылать список предпочитаемых языков на сервер. В браузере можно настроить предпочтительные языки web-страниц. ASP .NET позволяет автоматически модифицировать культуру страницы в зависимости от первого языка в списке. Для этого атрибуту Culture директивы Page нужно присвоить значение auto. Так же обстоит дело у атрибута UICulture — он определяет культуру пользовательского интерфейса. Менеджер ресурсов ищет строки и другие ресурсы в файле с тем расширением, которое определено в атрибуте UICulture. Формат отображения дат, чисел и денежной информации определяется атрибутом Culture.
Если поместить на страницу элемент управления Calendar, он будет в том формате, который соответствует культурной информации, связанной с данным языком. Числа и денежные единицы тоже будут выводиться в формате этой культуры.
Свойства Culture и UICulture — страницы строковые и принимают значения в длинном формате, например, "English (United States)":
<%@ Page Language="C#"Culture="Auto" UICulture="Auto" %>
Если первый язык в списке соответствует культуре, которую поддерживает ASP .NET, в самом начале жизненного цикла страницы эта культура становится текущей. Если есть файлы ресурса на этом языке, с помощью класса Resource можно получить доступ к строкам файла ресурсов с соответствующим расширением, иначе ResourceManager будет читать из файлов ресурсов по умолчанию.
Загрузить строку из файла ресурсов можно по-разному. Первый способ — использовать класс Resource. Предварительно в App_Global Resources нужно создать файлы Resource.resx и Resource.ru-RU.resx со строками.
Resource.resx
Name | Value |
Answer | Good morning, |
PageTitle | Sample Globalization Page |
Question | What is your name? |
Name | Value |
Answer | Привет |
PageTitle | Пример глобализации ASP .NET |
Question | Как Вас зовут? |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server"> protected void Page_Load(object sender, System.EventArgs e) { Page.Title = Resources.Resource.PageTitle; }
protected void Button1_Click(object sender, System.EventArgs e) { Localize1.Text = Resources.Resource.Answer + ", " + Textbox1.Text;
} </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title></title> </head> <body> <form id="Form1" runat="server"> <p><%= Resources.Resource.Question %></p><br /> <asp:TextBox ID="Textbox1" Runat="server"></asp:TextBox><br /> <asp:Button ID="Button1" Runat="server" Text="Submit" OnClick="Button1_Click" /> <p> <asp:Localize ID="Localize1" runat="server"></asp:Localize>
</p> </form> </body> </html>
Второй способ позволяет статически выводить информацию из локальных файлов ресурсов:
<%@ Page Language="C#" AutoEventWireup="true" Culture="auto:en- US" meta:resourcekey="PageResource1" UICulture="auto:en-US" %>
<asp:Button ID="ConvertButton" runat="server" Text="Convert" OnClick="ConvertButton_Click" meta:resourcekey="ButtonResource1" />
В LocalizeImp_cs.aspx.resx содержится строка ButtonResource1.Text со значением Convert, в LocalizeImp_cs.aspx.de.resx со значением Konvertieren, в файлах ресурсов для других языков — перевод слова на эти языки.
Посмотрите пример полностью в QuickStart: C:\Program Files\ Microsoft Visual Studio 8\SDK\v2.0\QuickStart\aspnet\samples\localization\LocalizeImp_cs.