перевод i18n в пользовательский тег JSP - PullRequest
3 голосов
/ 15 сентября 2010

Можно ли написать собственный тег JSP, чтобы взять ключ сообщения i18n и вывести фразу перевода для данного запроса?

Обычно в JSP / JSTL я делаю:

<fmt:message key="${messageKey}"><fmt:param>arg1</fmt:param></fmt:message>

И я получаю перевод фразы. Теперь мне нужно сделать следующее (есть веская причина для этого):

<custom:translate key="${messageKey}" arg="arg1"/>

Но я не знаю, как посмотреть перевод в коде пользовательского тега. Базовый класс TagSupport предоставляет pageContext, из которого я могу получить ServletRequest, который имеет Locale ... но как мне тогда найти перевод ключа?

Я использую Spring 3.0, и в моем application-context.xml я определил ReloadableBundleMessageSource, чтобы я мог вызвать:

messageSource.getMessage(
    key, new Object[] {arg}, pageContext.getRequest().getLocale()
);

но я не думаю, что могу вставить messageSource в пользовательский тег, могу я? В противном случае я могу создать новый экземпляр, но будет ли он загружать мои десятки тысяч переводов для каждого вызова? Я не хочу прибегать к превращению messageSource в статический член статического класса.

Ответы [ 3 ]

2 голосов
/ 15 сентября 2010

Я не делаю Spring, но в «простой» JSP вы можете просто поместить экземпляр ResourceBundle в область действия сеанса с помощью Filter или Servlet

ResourceBundle bundle = ResourceBundle.getBundle(basename, request.getLocale());
request.getSession().setAttribute("bundle", bundle);

Иобрабатывать его в JSP как любой другой bean-компонент в EL.

${bundle[messageKey]}

Должна существовать возможность для Spring, чтобы поместить его как bean-компонент в область действия сеанса.

1 голос
/ 07 марта 2011

Весной есть утилита для доступа к контексту веб-приложения. Затем вы можете найти бин по его имени или типу. Чтобы получить доступ к вашему пакету ресурсов, вы можете сделать что-то вроде:

WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());
messageResource = springContext.getBean("messageResource");
0 голосов
/ 09 сентября 2015

Этот вопрос очень старый, но я думаю, что стоит поделиться другим способом его решения.

Чтобы получить доступ к источнику сообщений Spring в пользовательском теге, вам нужно только расширить класс org.springframework.web.servlet.tags.RequestContextAwareTag вместо TagSupport.

В этом случае вам нужно реализовать метод doStartTagInternal () вместо doStartTag (), но внутри этого метода у вас будет доступ к MessageSource через метод getRequestContext (). GetMessageSource ().

Следовательно, ваш класс будет выглядеть так:

public class CreateCustomFieldTag extends RequestContextAwareTag{
   //variables (key, arg...), getters and setters
   @Override
   protected int doStartTagInternal() throws Exception {
      getRequestContext().getMessageSource().getMessage(
          key, new Object[] {arg}, getRequestContext().getLocale());
   }
}
...