package net.jhorstmann.i18n.jsp; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; import net.jhorstmann.i18n.I18N; import net.jhorstmann.i18n.LocaleProvider; import net.jhorstmann.i18n.ResourceBundleProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TranslationTag extends BodyTagSupport { private static final Logger log = LoggerFactory.getLogger(TranslationTag.class); private ResourceBundleProvider bundleProvider; private LocaleProvider localeProvider; private String context; private String message; private String plural; private Long num; private List params; @Override public void release() { super.release(); bundleProvider = null; localeProvider = null; } @Override public int doStartTag() throws JspException { params = new ArrayList(2); if (bundleProvider == null) { bundleProvider = RequestResourceBundleProviderFactory.newInstance().newResourceBundleProvider(); } if (localeProvider == null) { localeProvider = RequestLocaleProviderFactory.newInstance().newLocaleProvider(); } return EVAL_BODY_BUFFERED; } @Override public int doEndTag() throws JspException { String msgid = getMessage(); if (msgid == null) { BodyContent content = getBodyContent(); if (content != null) { msgid = content.getString().trim(); content.clearBody(); } } if (msgid == null) { throw new JspTagException("No message given in TranslationTag"); } Locale locale = localeProvider.getLocale(); ResourceBundle bundle = bundleProvider.getResourceBundle(locale); if (log.isTraceEnabled()) { log.trace("localeProvider is {}", localeProvider); log.trace("locale is {}", locale); log.trace("bundleProvider is {}", bundleProvider); log.trace("bundle is {}", bundle); log.trace("context is '{}'", context); log.trace("message is '{}'" + message); log.trace("msgid is '{}'", msgid); log.trace("plural is '{}'", plural); log.trace("num is {}", num); log.trace("params is {}", params); } Object[] paramsArray = params == null ? new Object[0] : params.toArray(); long n = num == null ? 0L : num.longValue(); String msg = I18N.translate(bundle, context, msgid, plural, n, paramsArray); try { pageContext.getOut().print(msg); } catch (IOException ex) { throw new JspException(ex); } context = null; message = null; plural = null; num = null; return EVAL_PAGE; } public void addParam(Object param) { params.add(param); } public String getContext() { return context; } public void setContext(String context) { this.context = context; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Long getNum() { return num; } public void setNum(Long num) { this.num = num; } public String getPlural() { return plural; } public void setPlural(String plural) { this.plural = plural; } }