Поддержка языка MUlti в JSP / Servlet - PullRequest
7 голосов
/ 02 февраля 2010

Как обеспечить многоязыковую поддержку через JSP / Servlet? Как включить статические данные разных языков во время выполнения на основе выбранного языка?

Ответы [ 3 ]

10 голосов
/ 02 февраля 2010

В простом ванильном приложении JSP / Servlet лучшим решением будет JSTL fmt taglib . (просто опустите jstl-1.2.jar в /WEB-INF/lib) Как его использовать, описано в Урок Oracle Java EE 5, часть II, глава 7 и в этом ответе: Как интернационализировать веб-приложение на Java? .

Если вы используете инфраструктуру MVC, такую ​​как Oracle JSF или Apache Struts, то вам нужно обратиться к ее конкретной документации, используя ключевые слова «интернационализация» (i18n) или «локализация» (l10n). В большинстве случаев они также предоставляют специальные теги для этого, такие как <f:loadBundle> в случае JSF, который, в свою очередь, рассматривается в учебное пособие по Oracle Java EE 5, часть II, глава 15 .

Эти теги i18n уже проверяют язык / локаль по умолчанию на ServletRequest#getLocale() (вам не нужно делать это «на низком уровне», проверяя заголовок, как предлагалось ранее - что потребует больше работы по синтаксическому анализу заголовка согласно HTTP-спецификации ). Вы можете позволить пользователю выбрать сам язык (выпадающий?) И сохранить его в области видимости сеанса и дать указание этим тегам использовать его. Вот пример с JSTL fmt taglib:

<fmt:setLocale value="${someSessionBean.locale}" />

.. где ${someSessionBean.locale} может вернуть en, en_US, en_UK и т. Д. Они, в свою очередь, используются API java.util.ResourceBundle для загрузки локализованного текста (вы не Не нужно создавать / загружать сам ResourceBundle, тэги уже делают это, просто прочитайте связанный javadoc, чтобы узнать немного больше о том, как он работает).

Если вы хотите, чтобы язык был доступен как первая часть URL-адреса pathinfo (например, http://example.com/en/, что лучше для SEO), то лучше всего использовать Filter для этого, который прослушивает /*, проверяет pathinfo , выделяет из него языковую часть, сохраняет / сравнивает его как / со значением сеанса и пересылает запрос без языковой части в pathinfo дальше на требуемый фронт-контроллер.

0 голосов
/ 02 ноября 2012

Мы можем создать свойства messages.properties, messages _ ?? ??. И поместить эти файлы в каталог / scr / java.(где ?? ?? - en_US, ru_RU и другие)

Примеры строк в messages.properties:

About = About
Buy = Buy
Company = Company
ContactUs = Contact Us 

Затем вставьте в файл jsp строки примера:

   Locale locale = Locale.getDefault(); 
   String lng = locale.getCountry(); 

   session.setAttribute( "language", lng);

   if (lng.equals( "UA"))
       locale = new Locale( "uk", "UA");
   else if (lng.equals( "RU"))
       locale = new Locale( "ru", "RU");
   else
       locale = Locale.US;

   ResourceBundle boundle = ResourceBundle.getBundle( "messages", locale);

   for (Enumeration e = boundle.getKeys(); e.hasMoreElements(); ) {
       String key = (String) e.nextElement();
       String s = boundle.getString(key);
       session.setAttribute( key, s);
   }

Теперь вы можете вставить $ {name} в следующий код jsp ($ {About}, $ {Buy}, ...).

0 голосов
/ 02 февраля 2010

Есть несколько важных аспектов этой проблемы. Первая часть определяет локаль каждого запроса. Вы можете использовать что-то вроде этого:

HttpServletRequest req ...;
String browserLocale = req.getHeader("Accept-Language"); // typically something like 'en'

Далее вам нужно решить, как управлять локализованным контентом сайта. Наиболее Java-подобный (не обязательно лучший) подход заключается в экстернализации всех сообщений с использованием ResourceBundle. Вы можете узнать об основных возможностях Java для I18N, G13N в их учебнике по локализации конкретных данных .

Использование только такого подхода, на мой взгляд, довольно плохо. Размер контента на разных языках различен, лучше соответствует разным макетам и т. Д. Таким образом, вы можете полностью исключить пакеты ресурсов (если у вас нет многоканальных данных) или дополнить подход с помощью XSLT или других шаблонов, которые являются локалью специфичны.

Один очень эффективный, но высокоразвитый подход состоит в использовании сервлет-фильтра для перенаправления трафика на специфичные для языка (или локали) подсайты. В этом случае любой, кто нажмет <a href="http://my.domain.fake/xyz" rel="nofollow noreferrer">http://my.domain.fake/xyz</a>, будет перенаправлен на <a href="http://my.domain.fake/" rel="nofollow noreferrer">http://my.domain.fake/</a><strong>en</strong>/xyz

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...