Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Locale в JSF


Автор: oson 21.2.2008, 17:22
Господа!
Объясните пожалуйста, как определяет JSF Locale на клиентском компе.
Я получаю Locale таким образом
Код

public static Locale getLocale()
{
   return  ((HttpServletRequest)getFacesContext().getExternalContext().getRequest()).getLocale();
}

Но например если у операционной системы стоит русская локаль, а в самом браузере в настройках "Языки" - турецкая, то этот код определяет турецкую локаль.
Если у операционной системы стоит русская локаль, а в самом браузере в настройках "Языки" - вообще ничего, то этот код определяет ту локаль, которая не на клиенте, а на сервере.
То есть я не могу понять
1-Какую собственно локаль должен читать этот код - ту что у Виндоус выставлена?
Или же этот метод должен вернуть локаль, ориентируясь по выбранному языку в браузере?
2-Как вообще они зависят друг от друга - локаль на компьютере и язык в настройках браузера ?


Автор: Kangaroo 21.2.2008, 17:40
JavaDoc
Цитата

getLocale() 
Returns the preferred Locale that the client will accept content in, based on the Accept-Language header.



Цитата(oson @  21.2.2008,  16:22 Найти цитируемый пост)
2-Как вообще они зависят друг от друга - локаль на компьютере и язык в настройках браузера ?

Я думаю нет, язык определяется настройками браузера и бразуер добавляет хедер эксепт-лангуаге 

Цитата(oson @  21.2.2008,  16:22 Найти цитируемый пост)
Если у операционной системы стоит русская локаль, а в самом браузере в настройках "Языки" - вообще ничего, то этот код определяет ту локаль, которая не на клиенте, а на сервере.

Дефолтную юзает.

Автор: Maksym 21.2.2008, 17:56
http://java.sun.com/javaee/5/docs/api/javax/faces/component/UIViewRoot.html#getLocale()

Автор: Kangaroo 21.2.2008, 18:12
Maksym, 
так вроде это метод другой. 
Есть же разница FacesContext.getInstance() и getFacesContext().getExternalContext() ?

Автор: Maksym 21.2.2008, 19:08
Цитата(Kangaroo @  21.2.2008,  17:12 Найти цитируемый пост)
Есть же разница FacesContext.getInstance() и getFacesContext().getExternalContext() ? 

Как минимум, они возвращают экземпляры разных классов http://java.sun.com/javaee/5/docs/api/javax/faces/context/FacesContext.html и http://java.sun.com/javaee/5/docs/api/javax/faces/context/ExternalContext.html   smile Да и вообще это смотря откуда взялся и что возвращает метод getFacesContext() указанный oson'ом...  smile 

(В нормально практике, экземпляр FacesContext в любом случае будет один и тот же откуда бы к нему не доступались (в рамках потока обрабатывающего запрос пользователя, конечно).  Он создается jsf'ами через FacesContextFactory на базе текущего request'а и глобального состояния веб-приложения. --- но это все jsf детали которые к вопросу прямого отношения не имеют)

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

Автор: oson 22.2.2008, 12:31
Попробовал оба метода.
Код

1) FacesContext.getCurrentInstance().getViewRoot().getLocale()
2) (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getLocale()

Первый все время  выдает en, какие бы настройки ни были в Винде или браузере.
Второй выдает настройки языка в браузере, а если их нет вообще никаких, то то винды.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)