Как установить языковой стандарт JSTL из кода Java?
Я хочу установить локаль JSTL, которая используется <fmt:formatNumber>
и друзьями. Я знаю, что это возможно с помощью <fmt:setLocale>
, но мне нужно сделать это динамически (в зависимости от пользовательских данных, полученных из моего БД) и, если быть точным, предпочтет код Java - класс фильтра.
Я думал, что настройка атрибута сеанса javax.servlet.jsp.jstl.fmt.locale
на мой желаемый экземпляр Locale
будет делать трюк, но он игнорируется: теги JSTL продолжают использовать локаль браузера.
Я проверял, что нет контекста страницы или атрибутов запроса с тем же именем.
Так что я делаю неправильно? Или мне действительно нужно сделать это с JSP?
Считывая код JSTL, я нашел ссылки на LocalizationContext
и думаю, что мне нужно его установить. Я не мог точно понять, как он вписывается в картину или как ее установить.
Ответы
Ответ 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");