Использование сопутствующих ресурсов из ASP.NET AJAX

Другой способ локализации приложений ASP.NET заключается в использовании так называемых сопутствующих ресурсов (иногда их называют сопутствующими сборками). Под ними подразумеваются скомпилированные внешние файлы ресурсов, которые загружаются, только если это необходимо для текущей культуры. Платформа ASP.NET AJAX допускает возможность добавления файлов JavaScript (.js) в виде ресурсов в сопутствующие сборки, а платформа Ajax обеспечивает механизм использования данных из программного кода JavaScript.

В примере 9.4 используются возможности ASP.NET AJAX по локализации, заключенные в компонент ASP.NET, который может использоваться в веб-странице ASP.NET. На примере этого компонента иллюстрируется решение двух задач. Во-первых, загрузка корректной сопутствующей сборки с помощью ASP.NET AJAX. Во?вторых, доступ к корректным локализованным данным для вывода текста на языке пользователя броузера из сценария, размещенного в сборке.

Для создания компонентов необходимо иметь Visual Studio 2005, так как потребуется создавать скомпилированные сборки. Если вы пользуетесь Visual Web developer Express Edition, то эта среда разработки не поддерживает создание сборок. Однако вы можете установить Visual C# Express Edition (еще один бесплатный инструмент, доступный для загрузки) и пользоваться им.

Для начала создайте новый проект.


Дайте проекту имя LocalizedDate. Вообще это имя не является обязательным, но оно будет использоваться повсюду в этом примере, и поэтому вам предлагается использовать это имя, чтобы следовать за дальнейшим описанием.

Прежде всего, в проект необходимо добавить ссылки на System.Web и System.Web.Extensions. Затем добавить некоторые файлы ресурсов. Мы начнем с файла ресурсов английской локализации DateResources.resx, который одновременно будет использоваться как исходный.

Внутри файлы ресурсов содержат текст в формате XML. В примере 9.4 показана разметка XML для файла ресурсов с немецкой локализацией. Как можно заметить, применение инструмента с графическим интерфейсом облегчает работу и снижает вероятность появления ошибок. (Чтобы перейти в режим редактирования файла ресурсов в формате XML, перейдите в окно Visual Studio Solution Explorer (обозреватель решений), щелкните правой кнопкой мыши на файле и выберите пункт контекстного меню View Code (просмотр кода).) Создайте немецкую версию файла ресурсов и дайте ему имя DateResources.de.resx.

xmlns:msdata="urn:schemas?microsoft?com:xml?msdata">


















msdata:Ordinal="1" />
msdata:Ordinal="2" />


msdata:Ordinal="1" />
msdata:Ordinal="3" />
msdata:Ordinal="4" />





msdata:Ordinal="1" />








text/microsoft?resx

2.0

System.Resources.ResXResourceReader, System.Windows.Forms,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089


System.Resources.ResXResourceWriter, System.Windows.Forms,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089


ss, dd.mm.yyyy

["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag",
"Freitag", "Samstag"]


Lade Datum ...



Из этого XML?файла видно, какая информация помещается в файлы ресурсов:
dateformat
Формат представления даты с использованием символов-заполнителей
daynames
Локализованные названия дней недели
loading
Текст «Loading date...» (загрузка даты), переведенный на отдельные языки

Вам необходимо создать как минимум два файла ресурсов (для английского и немецкого языков).


По своему желанию вы можете добавить локализации и для других языков. Для определения названий дней недели используйте синтаксис массивов в формате JSON.
Будьте внимательны и старайтесь не допускать опечаток, так как приложения, состоящие из серверных и клиентских сценариев, а также ресурсов, очень сложно отлаживать.

В окне Solution Explorer (обозреватель решений) в текущем проекте откройте папку Properties (свойства). Внутри нее вы найдете файл AssemblyInfo.cs, в котором содержится дополнительная информация о проекте. Если вы не видите этот файл, щелкните на кнопке Show All Files (показать все файлы).

В конец файла AssemblyInfo.cs добавьте следующие строки:
[assembly: System.Web.UI.WebResource("LocalizedDate.Dayname.js",
"application/xjavascript")]
[assembly: System.Web.UI.ScriptResource("LocalizedDate.Dayname.js",
"LocalizedDate.DateResources", "LocData")]

Обратите внимание на значение LocData в последнем аргументе. Это имя позволит обращаться ко всем данным в файле ресурсов из программного кода JavaScript посредством объекта LocData. Имя может выбираться совершенно произвольно, но это имя будет использоваться в следующих примерах.

Остальные значения в предыдущем фрагменте содержат данные, имеющие отношение к приложению.


LocalizedDate – это имя проекта, Dayname.js – это файл JavaScript, который будет создан на следующем шаге, а DateResources будет использоваться позже для организации доступа к данным в файле ресурсов (из программного кода на C#).

Файл Dayname.js содержит программный код JavaScript, который определяет текущую дату и форматирует ее в соответствии с текущими региональными настройками. Как уже говорилось выше, объект LocData используется в JavaScript для доступа к информации из файла ресурсов. Свойство LocData.dateformat содержит строку формата даты, а свойство LocData.daynames – массив с названиями дней недели. Последнее значение хранится в формате JSON (глава 3), поэтому нам придется использовать функцию eval() для преобразования строки в объект JavaScript:
var daynames = eval("(" + LocData.daynames + ")");

Программный код в Dayname.js, подобный тому, что приводился в примере 9.3, будет замещать символы?заполнители в строке dateformat и отображать результат в окне броузера. Обратите внимание на односекундную задержку, которая была добавлена для того, чтобы сделать эффект более наглядным. В примере 9.5 приводится полный про?
граммный код файла JavaScript.


Добавьте его в свой проект.
Пример 9.5. Программный код JavaScript в библиотеке классов
Dayname.js
Sys.Application.add_load(function() {
var d = new Date();
var daynames = eval("(" + LocData.daynames + ")");
var datestring = LocData.dateformat.replace("ss", daynames[d.getDay()])
.replace("dd", d.getDate())
.replace("mm", d.getMonth() + 1)
.replace("yyyy", d.getFullYear());
setTimeout('$get("date").firstChild.nodeValue = "'
+ datestring + '"', 1000);
});

В заключение файл Dayname.js необходимо встроить в сборку. Щелкните на имени файла в окне Solution Explorer (обозреватель решений).

В окне Properties (свойства) установите параметр Build Action (действие по сборке) в значение Embedded Resource (встроенный ресурс). Это приведет к тому, что во время компиляции проекта файл JavaScript будет внедрен непосредственно в файл DLL библиотеки. В программном коде из Dayname.js вы можете заметить вызов функции $get() для доступа к еще не определенному элементу с именем "date".


Этот элемент будет объявлен как часть управляющего кода в файле с классом на C#.

В окне Solution Explorer (обозреватель решений) переименуйте файл Class1.cs в LocDateControl.cs (для этого нужно щелкнуть правой кнопкой мыши на имени файла и выбрать в контекстном меню пункт Rename (переименовать)) и выберите вариант обновления всех ссылок. В этом файле будет располагаться программный код компонента ASP.NET на языке C#. Этот компонент будет наследовать свойства и методы класса Sys.Web.UI.Control платформы .NET.

В классе LocDateControl мы переопределим метод CreateChildControls() базового класса и добавим свой собственный HTML?элемент – метку с именем "date":
hgc = new HtmlGenericControl();
hgc.TagName = "span";
hgc.ID = "date";

В элементе будет находиться текст «Loading date...» или тот, который задан для выбранного языка. Чтобы получить нужную строку, компонент должен обратиться к встроенным ресурсам. Эту операцию выполняет следующий фрагмент:

System.Resources.ResourceManager r = new System.Resources.ResourceManager(
"LocalizedDate.DateResources",
this.GetType().Assembly);
hgc.InnerHtml = r.GetString("loading");

И наконец, новый компонент с локализованным текстом добавляется на страницу:
Controls.Add(hgc);

В примере 9.6 приводится полный программный код для файла библиотеки классов.
Пример 9.6. Программный код для библиотеки классов
LocDateControl.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.HtmlControls;
namespace LocalizedDate
{
public class LocDateControl : Control
{
private HtmlGenericControl hgc;
protected override void CreateChildControls()
{
base.CreateChildControls();
hgc = new HtmlGenericControl();
hgc.TagName = "span";
hgc.ID = "date";
System.Resources.ResourceManager r = new
System.Resources.ResourceManager(
"LocalizedDate.DateResources",
this.GetType().Assembly);
hgc.InnerHtml = r.GetString("loading");
Controls.Add(hgc);
}
}
}

Теперь можно выполнить сборку проекта библиотеки классов. В результате будут созданы два файла. Файл LocalizedDate.dll, содержащий реализацию компонента в библиотеке классов, и файл сборки, содержащий файл ресурсов по умолчанию (из DateResources.resx). Для каждого дополнительного языка будет создаваться каталог с сопутствующей сборкой. Например, немецкий перевод будет находиться в каталоге de, содержащем сборку LocalizedDate.resources.dll.

При использовании Visual Studio 2005 новые сборки, как правило, сразу становятся доступны в приложениях ASP.NET AJAX (если это не так, добавьте явно ссылку на библиотеку классов в проекте веб-сайта).

Если вы используете Visual Web Developer, создайте каталог Bin в каталоге с приложением ASP.NET AJAX, а затем поместите в этот каталог копии обоих файлов LocalizedDate.dll и всех подкаталогов (de, ...).

Теперь можно импортировать компонент в любую страницу ASP.NET с помощью следующей директивы:
<%@ Register TagPrefix="OReilly" Assembly="LocalizedDate" Namespace="
LocalizedDate" %>

Поскольку этот компонент не объявляет никаких общедоступных свойств, он может быть включен в страницу с минимальными усилиями:


Компонент содержит весь программный код JavaScript, необходимый для отображения экранной заставки («Loading data...») и локализованной даты. Все, что осталось сделать для ASP.NET AJAX, – это загрузить сборку в элемент управления ScriptManager. В элементе ScriptReference должны быть указаны оба имени – имя сборки (localizedDate) и каноническое имя встроенного файла JavaScript (LocalizedDate.Dayname.js). Не забудьте установить атрибут EnableScriptLocalization элемента ScriptManager!

(asp:ScriptManager ID="ScriptManager1" runat="server"
EnableScriptLocalization="true")

(asp:ScriptReference Assembly="LocalizedDate"
Name="LocalizedDate.Dayname.js" /)

(/asp:ScriptManager)

Наконец, настроим страницу так, чтобы она автоматически определяла корректную культуру:
<%@ Page Language="C#" UICulture="auto" %>

В примере 9.7 приводится полный код страницы .aspx.
Пример 9.7. Использование сопутствующей сборки в ASP.NET AJAX Localization?Satellite.aspx
<%@ Page Language="C#" UICulture="auto" %>
<%@ Register TagPrefix="OReilly" Assembly="LocalizedDate" Namespace="
LocalizedDate" %>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd">
ASP.NET AJAX

(body)
(asp:ScriptManager ID="ScriptManager1" runat="server"
EnableScriptLocalization="true")

(asp:ScriptReference Assembly="LocalizedDate"
Name="LocalizedDate.Dayname.js" /)

(/asp:ScriptManager)




(/body)


Оцените статью: (0 голосов)
0 5 0

Статьи из раздела ASP.NET AJAX на эту тему:
Глобализация и интернационализация
Использование Control Toolkit
Использование пакета Control Toolkit
Локализация
Локализация сценариев