2012-04-30 3 views
0

В настоящее время мое J2EE приложение поддерживает эти ниже страныКак установить Locale значения в зависимости от страны пользователя принадлежит

MessagesBundle_en_GB.properties (United Kingdom) 
MessagesBundle_en_US.properties (United States) 
MessagesBundle_it_IT.properties (Italy) 
MessagesBundle_pt_BR.properties (Brazil) 
MessagesBundle_sv_SE .properties (Sweden) 

Так я сделал свойство файлы для всех этих стран выше и определен ключевыми пары значений в Это . Я использую Resource Bundle для этой концепции.

И так я буду получать доступ к имени ключа этот путь

bundle.getString("userName")); 
bundle.getString("Mobile")); 

Теперь мой вопрос,

Как я могу установить значение локали внутри JSP страницы, так как пользователь может принадлежать любой страны, как уже упоминалось выше

Пожалуйста, дайте мне знать, спасибо большое

// Это один жёстко, как я могу установить это динамически ??

ResourceBundle bundle = ResourceBundle.getBundle("MessagesBundle", Locale.UK); 

ответ

0

Самый простой способ сделать это - реализовать HttpFilter. Назовите его, например, LocaleHttpFilter . It should be mapped to/* `в вашем web.xml, поэтому он будет вызываться каждый раз, когда запрос поступает в ваше приложение.

Фильтр обнаружит ваш запрос и решит, какой должна быть текущая локаль. Она может основывать свое решение о параметрах URL, HTTP заголовки, GeoIP поиска и т.д. После того, как было принято решение о местности он должен вызвать:

Locale.setDefault(locale)

Затем вы можете использовать

ResourceBundle.getBundle("MessageBundle").getString("hello");

в любой место в вашем коде. Эта строка вернет значение строки "hello" в соответствии с текущей локалью, которая была установлена ​​в фильтр.

+0

Как я уже упоминал, пользователь может принадлежать к любой из упомянутых выше стран, например, если лицо Италии открывается, мне нужно отобразить Италию Содержание? так как я могу, если мне нужно установить значение Locale для Италии в этом случае? Я не уверен, должен ли я использовать HttPServletRequest.getLocale(), чтобы получить значение Local? Благодарю . – user1253847

1

ResourceBundle.getBundle(BUNDLE_NAME).getString(key); для доступа к строкам.

при обновлении стандарта по умолчанию, например. через Locale.setDefault(<REQUIRED_LOCALE>); очистить кэш Resourcebundle: ResourceBundle.clearCache();

следующий вызов ResourceBundle.getBundle(BUNDLE_NAME).getString(key); должен возвращать локализованную строку выбранного локали.

+0

Спасибо за ответ, но как я могу установить динамическое значение языка? Для пользователя Италии мне нужно установить его в Locale.IT динамически, и в случае, если для американского пользователя мне нужно установить его в Locale.US динамически? так как это может быть динамическим в зависимости от местоположения пользователя? – user1253847

0

Первое первый: вы можете использовать ResourceBundle.getBundle(Locale) в коде фоновым. Тем не менее, вы должны никогда используйте это прямо на странице JSP. Вместо этого вы должны useJSTL. Теперь давайте вдаваться в подробности.

Есть две причины, по которым нет необходимости использовать ResourceBundle напрямую. Один из них связан с этим:

<% 
try { 
    ResourceBundle rb = ResourceBundle.getBundle("messages", locale); 
} catch (MissingResourceException mre) { 
    // LOG THIS! 
} 
%> 

Это выглядит довольно уродливо, не так ли? Это потому, что вы должны остерегаться MissingResourceException, которые будут выброшены, если нет базового имени, которое вы ищете.В довершение, то же самое может произойти исключение, если нет ключа в данном сценарии:

rb.getString("key"); 

Таким образом, вы также должны принять это во внимание:

<% 
try { 
    rb.getString("key"); 
} catch (MissingResourceException mre) { 
    // LOG THIS! 
} 
%> 

Как это выглядит?
Конечно, вы можете извлечь из ResourceBundle и заместить эти методы, чтобы они не сгенерирует исключение, но это значительно больше работы, чем просто так:

<fmt:setLocale value="fr_CA" scope="session"/> 
<fmt:bundle basename="com.taglib.weblog.Greeting"> 
<fmt:message key="com.taglib.weblog.Greeting.greeting"> 

Это причина, вы должны использовать JSTL с JSP. Подробнее о том, как использовать JSTL для i18n в this article.

Теперь ваш первоначальный вопрос касался переговоров по языку (термин W3C) или обнаружения локали, если вы предпочитаете. Как это сделать в JSP-приложении?
Самый простой и типичный сценарий - прочитать содержимое заголовка Accept-Language HTTP. В мире Java Servlet это означает вызов метода ServletRequest'sgetLocale() или getLocales() и назначение переменной в объекте HttpSession, доступ к которому можно получить на странице JSP. Если вам интересно, как получить доступ к HttpSession на стороне сервлета, существует метод getSession().

Это работает, если у вас есть прямой доступ к Servlet. Если вам нет, вам нужно создать (или назначить существующий) фильтр Locale, который сделает все это для вас. Как вы можете себе представить, это довольно распространенный сценарий. Вот почему люди уже писали (давно) необходимые классы. Вы можете найти в нескольких рамках, позвольте мне отметить Spring Framework.
Я знаю, это может показаться странным, но если вы ищете простое решение, изучение и использование общих веб-фреймворков (т. Е. Spring MVC) лучше, чем повторное изобретательство колеса. Я знаю, что кривая обучения может быть немного крутой, но она того стоит.

Смежные вопросы