Подтвердить что ты не робот

Как установить языковой стандарт JSTL из кода Java?

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

Я думал, что настройка атрибута сеанса javax.servlet.jsp.jstl.fmt.locale на мой желаемый экземпляр Locale будет делать трюк, но он игнорируется: теги JSTL продолжают использовать локаль браузера.

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

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

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

4b9b3361

Ответ 1

вам нужно второе:

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

  • Установите действие JSTL - это позволяет специфицировать область видимости по атрибуту scope.

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

    import javax.servlet.jst.jstl.core.Config;
    (...)
    Config.set( session, Config.FMT_LOCALE, new java.util.Locale("en_US") )
    
  • Установить по параметрам инициализации контекста - указывает значение, используемое, если параметр не найден ни в одной из стандартных областей.

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

jstl-quick-reference (PDF)

Ответ 2

Вы можете просто использовать 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, тогда придерживайтесь его. Else использует локализованный пользователем язык в заголовке запроса.

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

См. также:

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", "ko-KR");