OLAP.RU: Business intelligence - effective data mining & analysis

Разработка многоязычных портлетов в Rational Application Developer

IBM® WebSphere® Portal поддерживает более 30 языков. Различные международные организации предоставляют свои порталы для пользователей различных стран или регионов посредством многоязычных Web-сайтов. В этом контексте портал параллельно обслуживает запросы большого числа пользователей на предпочитаемых ими языках. WebSphere Portal поддерживает портлеты, отображаемые на разных языках. Если запрашиваемый язык не поддерживается, портал пытается подобрать соответствие языковым предпочтениям пользователя.

В этой статье рассматривается разработка многоязычных портлетов при помощи IBM® Rational® Application Developer for WebSphere Software v9 (для работы с приведенными примерами можно использовать версию v7.5 или выше). Ссылки на фрагменты исходного кода для многоязычных портлетов, использующих ResourceBundle, предоставлены в разделе Загрузки.

Предварительные условия

Для выполнения описанных ниже шагов необходимы:

  • IBM Rational Application Developer v7.5 и выше
    • Многоязычные портлеты можно разрабатывать в Rational Application Developer v7.5 и выше.
  • IBM WebSphere Portal v7 и выше
    • Основанные на ResourceBundle многоязычные портлеты поддерживаются в IBM WebSphere Portal v7.x, а также в новейших версиях (v8.x и v8.5.x).
  • Знакомство с Rational Application Developer, а также с разработкой портлетов и J2EE-приложений.

Как разработать многоязычный портлет

Многоязычный портлет можно легко разработать при помощи ResourceBundle. Класс ResourceBundle имеет абстрактный подкласс ListResourceBundle, который локализует ресурсы в виде удобного и простого в использовании списка. ListResourceBundle доступен в библиотеке java.util (java.util.ListResourceBundle).

Создание нового проекта портлета

Первым шагом является создание нового проекта портлета в Rational Application Developer.

  1. В Rational Application Developer выберите File > New > Other, как показано на рисунке 1.
Рисунок 1. Создание нового проекта портлета

Рисунок 1. Создание нового проекта портлета 

  1. В окне Select a wizard выберите Portlet Project (можно также выполнить поиск, используя текстовое поле ), а затем нажмите Next (см. рисунок 2).
Рисунок 2. Выбор проекта портлета в окне Select a wizard

Рисунок 2. Выбор проекта портлета в окне Select a wizard 

  1. Откроется окно New Portlet Project. В текстовом окне Project name введите Multilingual, укажите параметры портлета, такие как Portlet name, Target runtime и т.д., а затем нажмите Finish.
Рисунок 3. Создание проекта портлета с именем Multilingual

Рисунок 3. Создание проекта портлета с именем Multilingual 

Создание ResourceBundle

Для каждого класса конкретного языка необходим пакет. Для создания пакета в Rational Application Developer:

  1. Щелкните правой кнопкой мыши на папке src (расположена внутри Java Resources).
  2. Выберите New, а затем Package (см. рисунок 4).
Рисунок 4. Создание нового пакет

Рисунок 4. Создание нового пакет 

Откроется окно New Java Package.

  1. В текстовом поле Name введите com.teg.resources (см. рисунок 5).
  2. Нажмите Finish.
Рисунок 5. Создание нового пакета с именем com.teg.resource

Рисунок 5. Создание нового пакета с именем com.teg.resource 

Создание класса

Теперь создадим класс для языка по умолчанию. Для создания этого нового класса в Rational Application Developer щелкните правой кнопкой мыши на имени пакета и выберите New > Class (см. рисунок 6).

Рисунок 6. Создание нового класса в пакете com.teg.resources

Рисунок 6. Создание нового класса в пакете com.teg.resources 

Откроется окно Java Class. В текстовом поле Name введите MyProviderBundle (см. рисунок 7), а затем нажмите Finish.

Рисунок 7. Создание нового класса с именем MyProviderBundl

Рисунок 7. Создание нового класса с именем MyProviderBundl 

Теперь скопируйте фрагмент кода, приведенный в листинге 1, в MyProviderBundle.java.

Листинг 1. MyProviderBundle.java
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.teg.resources;
import java.util.ListResourceBundle;
public class MyProviderBundle extends ListResourceBundle {
public static String WELCOME_MSG = "MyPortletHelloMessage";
public static String INFO_MSG = "MyPortletInfoMessage";
public Object[][] getContents() {
    return contents;
    }
static private final Object[][] contents = {
{WELCOME_MSG, "Hello"},
{INFO_MSG, "This is demo for Multilingual Portlet using WebSphere Portal"}
    };
}

Примечание.
Класс MyProviderBundle должен расширять ListResourceBundle (java.util.ListResourceBundle), как показано в листинге 1.

Для хранения связанной с языком информации в классе MyProviderBundle используются переменные. В переменных WELCOME_MSG и INFO_MSG хранится информация, отображающаяся на экране портала (см. рисунок 8).

Рисунок 8. Класс набора ресурсов для языка, выбираемого по умолчанию

Рисунок 8. Класс набора ресурсов для языка, выбираемого по умолчанию 

Создание набора ресурсов для конкретного языка

Для создания набора ресурсов для конкретного языка необходимо создать класс аналогично тому, как это делалось ранее. Назовите этот класс MyProviderBundle_<lang>, где <lang> - это язык.

На рисунке 9 показан класс MyProviderBundle_fr, созданный для французского языка. Соответствующее содержимое для французского языка назначается переменным WELCOME_MSG и INFO_MSG.

Рисунок 9. Класс набора ресурсов для конкретного языка

Рисунок 9. Класс набора ресурсов для конкретного языка 

Исходный код MyProviderBundle_fr.java приведен в листинге 2.

Листинг 2. MyProviderBundle_fr.java
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.teg.resources;
 
import java.util.ListResourceBundle;
 
public class MyProviderBundle_fr extends ListResourceBundle {
public Object[][] getContents() {
    return contents;
    }
static private final Object[][] contents = {
{MyProviderBundle.WELCOME_MSG, "Bonjour"},
{MyProviderBundle.INFO_MSG, "C'estdémo pour portletmultilingueutilisant WebSphere Portal."}
    };
}

Можно создать классы ResourceBundle для всех языков, поддерживаемых портлетом. Язык, поддерживаемый WebSphere Portal по умолчанию, указывается в файле portlet.xml.

Структура пакета портлета в Rational Application Develop

На рисунке 10 показана структура пакета портлета в Rational Application Developer. Для просмотра созданных наборов ресурсов разверните пакет com.teg.resources.

Рисунок 10. Структура пакета портлета в Rational Application Developer

Рисунок 10. Структура пакета портлета в Rational Application Developer 

Использование ResourceBundle в JSP

После создания ResourceBundle для отображения в JSP (MultilingualView.jsp) содержимого на конкретном языке необходимо использовать переменные, объявленные в файлах классов (см. рисунок 11).

В JSP локаль определяется в renderRequestobject. Очередность использования локалей следующая:

  • Локаль, указанная в URL.
  • Локаль, указанная в предпочтениях пользователя.
  • Локаль, указанная в заголовке accept-language.
  • Локаль, указанная в настройках сервера по умолчанию.

Например , если при развертывании выбран испанский язык, то при отправке браузером информации о том, что языком пользователя является французский, содержимое все равно возвращается на испанском. Причина в том, что предпочтения пользователя имеют более высокий приоритет, чем информация браузера (accept-language).

Рисунок 11. Использование набора ресурсов в JSP

Рисунок 11. Использование набора ресурсов в JSP 

Исходный код MultiLingualPortletView.jsp приведен в листинге 3.

Листинг 3. MultilingualPortletView.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
<%@page session="false" contentType="text/html" pageEncoding="ISO-8859-1"
import="java.util.*,javax.portlet.*,com.teg.multilingual.*" %>
<%@ tagliburi="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<portlet:defineObjects/>
<DIV style="margin: 6px">
<h1>MultiLingualPortlet</h1>
<p>
<% ResourceBundlerb = ResourceBundle.getBundle("com.teg.resources.MyProviderBundle",
renderRequest.getLocale());%>
<b><%= rb.getString(com.teg.resources.MyProviderBundle.WELCOME_MSG) %></b
<%= rb.getString(com.teg.resources.MyProviderBundle.INFO_MSG) %>
</p>
</DIV>

Просмотр многоязычного портлета

После развертывания портлета на WebSphere Portal и добавления его на страницу (как для неподдерживаемого языка, так и для языка по умолчанию) содержимое в портлете отображается на языке по умолчанию (в данном примере на английском).

Рисунок 12. Портлет с содержимым на языке по умолчани

Рисунок 12. Портлет с содержимым на языке по умолчани 

Измените в предпочтениях пользователя язык браузера на французский и обновите страницу. На рисунке 13 показан портлет, отображающий содержимое на французском языке.

Рисунок 13. Содержимое портала на французском языке

Рисунок 13. Содержимое портала на французском языке 

Заключение

В статье описывалось использование IBM Rational Application Developer для разработки многоязычных портлетов для IBM WebSphere Portal. Я считаю, что на данный момент самым простым способом создания многоязычных порталов является ResourceBundle.

Благодарности

Автор благодарит руководителя подразделения IBM Social Business в Tata Consultancy Services Панкаджа Бозе (Pankaj Bose) и старшего разработчика Tata Consultancy Services Сушри Пухана (Sushree Puhan) за их рекомендации и поддержку при написании данной статьи.

Страница сайта http://www.olap.ru
Оригинал находится по адресу http://www.olap.ru/home.asp?artId=3136