Интернационализация (i18n) в Struts

Last updated: March 7, 2002

Автор – Aaron Rustad

Перевод – Алексей Ковязин

 

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

В данном начальном документе я не собираюсь углубляться в многочисленные “как” и “почему” процесса интернационализации. Я могу расширить этот документ в будущем, если люди действительно захотят узнать больше или я снова устану от работы. В любом случае, не стесняйтесь задавать мне (emal внизу страницы) вопросы.

 

 

1.

Первым делом, прочтите и поймите базовое объяснение интернационализации сообщений в Struts, затем читайте дальше.

 

 

2.

Создайте альтернативный файл ApplicationResource.properties и сохраните его в том же каталоге, что и исходный. Например, мой исходный файл выглядит вот так (MyResources.properties), а вот так – русская версия(MyResources_ru.properties). Очень важно для Struts (точнее, для Java) указать правильный ISO код языка – в данном случае это “ru”.

 

 

3.

Преобразуйте ваш альтернативный файл ApplicationResources.properties в UTF. Чтобы сделать это, используйте инструмент native2ascii, который поставляется с вашим JDK. Он преобразует файл с символами национальной кодировки (не-Латинские и не-Unicode символы) в точно такой же файл с Unicode-символами.

Я пользовался следующей командой:

native2ascii -encoding UTF-8 MyResources_ru.properties MyResources_ru.propertiesX.

Взгляните на результат (output file), и увидите, что ваши слова преобразованы в Unicode (UTF-8) и теперь ваш браузер может их прочитать!

 

 

4.

В начале каждой JSP-страницы, на которой предполагается использование i18n-сообщений, включите следующую директиву:

<%@ page contentType="text/html; charset=UTF-8" %>

Это укажет браузеру, что для отображения данной страницы следует использовать UTF-8, и ваши Unicode-символы будут соответствующе показаны

 

 

5.

Проверьте работу i18n, используя браузер, который позволяет выбирать различные языки по умолчанию:

 

IE

"Tools" -> "Internet Options", и выберите кнопку "Language..." внизу диалога. Смените язык на тот, который вы желаете видеть. Обновите страницу и взгляните на результат.

NS 6.3

"Edit" -> "Preferences", раскройте в дереве "Navigator" и выберите "Languages". Добавьте языки, используя кнопку "Add..." и переместите желаемый язык в верх списка. Затем обновите страницу или перезапустите браузер.

 

 

 

Это все, что касается отображения сообщений на JSP. Однако, проблема возникает, когда вы посылаете (submit) интернационализованные символы через формы. Шаги, приведенные ниже, показывают простое решение данной проблемы.

 

7.

Добавьте этот фильтр к вашему web-приложению, это часть документации Tomcat, поставляемого нашими друзьями из Jakarta Project и Apache. Обычно этот фильтр говорит вашему ActionServlet'у, что все запросы приходят к нему из форм с кодировкой UTF-8, и что посланные атрибуты должны обрабатываться именно таким образом.

 

NOTE:

WebSphere AS 4 не позволяет такого решения, смотрите подробности здесь.

 

8.

Добавьте этот код в ваш web.xml deployment descriptor, он предполагает, что ваш ActionServlet ссылается на имя action (это принято по умолчанию в дистрибутиве Struts).

<!-- Example filter to set character encoding on each request -->
<filter>
 <filter-name>Set Character Encoding</filter-name>
 <filter-class>filters.SetCharacterEncodingFilter</filter-class>
 <init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
 </init-param>
</filter>

<!-- Define filter mappings for the defined filters -->
<filter-mapping>
 <filter-name>Set Character Encoding</filter-name>
 <servlet-name>action</servlet-name>
</filter-mapping>

 

 

9.

Перегрузите ваш app-сервер и протестируйте его... должно работать.

 

 

 

 

Динамический выбор языка

 

Было бы здорово позволять пользователю динамически менять язык приложения в веб-приложении. Все что вам нужно сделать – это создать новый объект java.util.Locale и положить его в сессию. Предположительно лучше это сделать в Action-классе. Вот пример кода:

 

 

 

java.util.Locale newLocale = new java.util.Locale( "ru" );

request.getSession().setAttribute( Action.LOCALE_KEY, newLocale );

 

 

 

Note: В классе Action есть метод setLocale( HttpServletRequest, Locale ) который ликвидирует необходимость руками устанавливать класть Locale в сессию.

 

 

Ресурсы

 

 

1.

Пример Applicaction War, и Source Jar использующих Кириллицу

 

(проверено на Tomcat 4.0.2 и Orion 1.5.4)

 

 

Если есть вопросы, пожелания, комментарии, пожалуйста отправляйте их на arustad@anassina.com и я попытаюсь помочь вам или изменить этот документ для вящей пользы всем остальным.

Aaron Rustad.

© 2002 Anassina Inc, All Rights Reserved