Как установить локаль JSTL из кода Java? - PullRequest
17 голосов
/ 25 мая 2011

Я хочу установить язык JSTL, который используется <fmt:formatNumber> и друзьями.Я знаю, что это возможно с <fmt:setLocale>, но мне нужно делать это динамически (в зависимости от пользовательских данных, извлекаемых из моей БД), и я бы предпочел код Java - класс фильтра, если быть точным.атрибут сеанса javax.servlet.jsp.jstl.fmt.locale для моего желаемого экземпляра Locale сделает свое дело, но он игнорируется: теги JSTL продолжают использовать локаль браузера.

Я убедился, что нет контекста страницы или атрибутов запросато же имя.

Так, что я делаю не так?Или мне действительно нужно сделать это из JSP?

Читая код JSTL, я нашел ссылки на LocalizationContext и думаю, что мне нужно установить его.Однако я не мог точно понять, как он вписывается в картину или как ее установить.

Ответы [ 5 ]

28 голосов
/ 31 марта 2012

вам нужно 2:

3 способа установки локали JSTL: / а также пакет ресурсов приложения по умолчанию, часовой пояс и источник данных /

  1. Устанавливается действием JSTL - это позволяет задавать область действия с помощью атрибута области действия.

    <fmt:setLocale value="en_US" scope="session"/>
    
  2. Установить программно - позволяет указать область действия через Config API.

    import javax.servlet.jsp.jstl.core.Config;
    (...)
    Config.set( session, Config.FMT_LOCALE, new java.util.Locale("en", "US") )
    // or Locale.forLanguageTag("en-US") (java 1.7 and later)
    
  3. Устанавливается Контекст Параметры инициализации - указывает значение, используемое, если настройка не найдена ни в одной из стандартных областей.

    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
        <param-value>en_US</param-value>
    </context-param>
    

JSTL-краткий справочник (PDF)

12 голосов
/ 25 мая 2011

Вы можете просто использовать EL в <fmt:setLocale>.Это не должно быть жестко заданное значение или что-то в этом роде.

Вот пример:

<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />

Если язык был предоставлен в качестве параметра запроса с именем language, тогдазадавать.Иначе, если язык уже был ранее установлен в сеансе по имени атрибута language, тогда придерживайтесь его.В противном случае используйте предоставленный пользователем языковой стандарт в заголовке запроса.

Если вы введете session.setAttribute("language", language) в своем коде фильтра, он будет использоваться, если не задан параметр запроса.

См.также:

3 голосов
/ 21 октября 2011

Насколько я знаю, 'javax.servlet.jsp.jstl.fmt.locale' переопределяется локалью браузера. JSTL использует локаль браузера и, если она не найдена, использует запасную локаль. Таким образом, вы можете установить атрибут запроса, чтобы указать эту локаль. Добавьте эту строку в ваш контроллер

request.setAttribute("javax.servlet.jsp.jstl.fmt.fallbackLocale.request", "en-us");

Использование этого установит локаль, которую будет использовать JSTL. Обратите внимание на .request в имени атрибута. Если вы установите для этого атрибута какую-то другую область, вам придется использовать другой суффикс. Для HttpSession суффикс .session , для ServletContext суффикс .application

0 голосов
/ 03 ноября 2014

Есть другой способ.В сервлете вы можете установить языковой стандарт, создав атрибут сеанса, например:

request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", "ko-KR");
0 голосов
/ 25 мая 2011

Если вы зависите от данных из БД, возможно, есть лучший способ вставить эту логику в ваши 'router' или 'controller' (зависит от того, какую платформу вы используете). Просто увеличьте URL с помощью параметра ?lang='en'

Надеюсь, это поможет

...