В простом ванильном приложении 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 дальше на требуемый фронт-контроллер.