Hi, Michael,
Thanks for sharing information.
If my understanding is correct, the solution you mentioned is for changing locale
during a session. I have tried to use
your code, but can't test it out since one more class is needed to get it running.
I use the lastest JSTL build as Jan suggests and the two problems are resolved. (~/
Have you encountered any situation that messages come from the server? If so, do you
create another set of resource
bundle?
BTW, where is a good site to find out the mapping between Chinese character and
unicode?
Best regards,
Vernon
5/23/2002 2:44:17 AM, "Michael Zhou" <[EMAIL PROTECTED]> wrote:
>Regarding your second question, in our project we have <%@ page
>contentType="text/html; charset=UTF-8" %> at
the top of
>each jsp page. We also enable page buffering, ie, <%@ page buffer="256kb"
>autoflush="true" %>. Then we define a
custom
>tag to dynamically set content type and character encoding based on request.
><i18n:setContentType /> should
appear
>relatively early in the page, because otherwise the response would already be
>commited otherwise. The source code
for
>the setContentType tag is as follows.
>
>import java.util.Locale;
>import java.util.ResourceBundle;
>import java.util.MissingResourceException;
>import javax.servlet.jsp.JspException;
>import javax.servlet.http.HttpServletRequest;
>import javax.servlet.http.HttpServletResponse;
>import javax.servlet.jsp.tagext.TagSupport;
>
>/** Tag to set content type based on request. */
>public class I18nSetContentTypeTag extends TagSupport {
> public int doStartTag() throws JspException {
> HttpServletRequest req = (HttpServletRequest) pageContext.getRequest ();
> HttpServletResponse res = (HttpServletResponse) pageContext.getResponse ();
> String charset = req.getCharacterEncoding ();
> if (charset != null) {
> res.setContentType ("text/html; charset=" + charset);
> }
> else {
> Locale locale = req.getLocale ();
> try {
> // set character encoding
> // MainProps is a class we define to retrieve application level
>properties
> // Here we define character encoding mappings in our properties file
> String enc = MainProps.getValue ("CharEncoding." + locale.toString
>(), null);
> if (enc != null)
> res.setContentType ("text/html; charset=" + enc);
> else // default to utf-8
> res.setContentType ("text/html; charset=utf-8");
> }
> catch (Throwable t) {
> t.printStackTrace ();
> }
> }
> return SKIP_BODY;
> }
>}
>
>--
>Michael
>
>-----Original Message-----
>From: Vernon Wu [mailto:[EMAIL PROTECTED]]
>Sent: Tuesday, May 21, 2002 5:22 PM
>To: Jan Luehe
>Cc: [EMAIL PROTECTED]
>Subject: Re: Usage of i18n in JSTL
>
>
>Thanks Jan for your detailed explanation. I think I finally find the right document
>which is under the standard-doc of
>the
>taglib.
>
>1)
>I follow the instruction and insert the line:
><%@ taglib uri="http://java.sun.com/jstl/ea/fmt" prefix="fmt" %>
>in a JSP file, and the lines:
>
> <context-param>
> <param-name>javax.servlet.jsp.jstl.i18n.basename</param-name>
> <param-value>mm</param-value>
> </context-param>
>in the web.xml file.
>
>I also have three resource files in place: mm.properties, mm_en.properties, and
>mm_zh.properties.
>
>I get an exception when I try to bring up the jsp page (see the error message on the
>bottom).
>
>After I replace the format tag lib of JSTL with the followings:
>
><%@ taglib uri="http://jakarta.apache.org/taglibs/i18n-1.0" prefix="i18n" %>
>
><i18n:bundle baseName="mm"
> id="bundle"/>
>
>The English version displays properly under the browser language setting with ?en?
>higher than ?zh?.
>
>To my understanding, the code base of i18n and fmt tag libraries are the same (You
>wrote it). I guess the problem is
the
>setting. Would you please point out where I did wrong.
>
>2)
>When 'zh' is higher than 'en' in the browser's language setting, all messages in the
>resource file are displayed as ???.
>And I find out the locale and character setting on the page is en_US and ISP-8859-1
>respectively. All jsp files have
the
>character set as UTF-8 since each jsp file started with <%@ page
>contentType='text/html; charset=UTF-8' %>. All JSP
>file is formed from several regions: banner, side bar, footer, and body.
>
>How can I have the right locale and character set in the JSP file?
>
>Thanks very much for your kindly help.
>
>Vernon
>
>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
>2002-05-22 04:41:41 ApplicationDispatcher[/mm] Servlet.service() for servlet jsp
>threw exception
>javax.servlet.ServletException: org/mozilla/javascript/JavaScriptException
> at
>org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:463)
> at org.apache.jsp.content$jsp._jspService(content$jsp.java:346)
> at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
> at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:683)
> at
>org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)
> at
>org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497)
> at
>org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:819)
> at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:391)
> at com.vernonwu.waf.view.template.Section.render(Section.java:41)
> at com.vernonwu.waf.view.template.tags.RenderTag.doEndTag(RenderTag.java:57)
> at org.apache.jsp.hscf02$jsp._jspService(hscf02$jsp.java:137)
> at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
> at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:683)
> at
>org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)
> at
>org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497)
> at
>org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:819)
> at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:391)
> at com.vernonwu.waf.view.template.Region.render(Region.java:35)
> at com.vernonwu.waf.view.template.tags.RenderTag.doEndTag(RenderTag.java:61)
> at org.apache.jsp.page$jsp._jspService(page$jsp.java:1480)
> at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
> at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
> at
>org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
> at
>org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
>org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
> at
>org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
> at
>org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
> at
>org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
> at
>org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
> at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
>org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
>org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1017)
> at
>org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1115)
> at java.lang.Thread.run(Thread.java:536)
>----- Root Cause -----
>java.lang.NoClassDefFoundError: org/mozilla/javascript/JavaScriptException
> at java.lang.Class.forName0(Native Method)
> at java.lang.Class.forName(Class.java:130)
> at
>org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager.getEvaluatorByName
>(ExpressionEvaluatorManager.java:219)
> at org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager.evaluate
>(ExpressionEvaluatorManager.java:183)
> at
>org.apache.taglibs.standard.tag.el.core.ExpressionUtil.evalNotNull(ExpressionUtil.java:85)
> at
>org.apache.taglibs.standard.tag.el.fmt.MessageTag.evaluateExpressions(MessageTag.java:159)
> at
>org.apache.taglibs.standard.tag.el.fmt.MessageTag.doStartTag(MessageTag.java:108)
> at org.apache.jsp.content$jsp._jspService(content$jsp.java:192)
> at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
> at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:683)
> at
>org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)
> at
>org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497)
> at
>org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:819)
> at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:391)
> at com.vernonwu.waf.view.template.Section.render(Section.java:41)
> at com.vernonwu.waf.view.template.tags.RenderTag.doEndTag(RenderTag.java:57)
> at org.apache.jsp.hscf02$jsp._jspService(hscf02$jsp.java:137)
> at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
> at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:683)
> at
>org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)
> at
>org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497)
> at
>org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:819)
> at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:391)
> at com.vernonwu.waf.view.template.Region.render(Region.java:35)
> at com.vernonwu.waf.view.template.tags.RenderTag.doEndTag(RenderTag.java:61)
> at org.apache.jsp.page$jsp._jspService(page$jsp.java:1480)
> at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
> at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
>org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
> at
>org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
> at
>org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
>org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
> at
>org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
> at
>org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
> at
>org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
> at
>org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
> at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
>org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
> at
>org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> at
>org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1017)
> at
>org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1115)
> at java.lang.Thread.run(Thread.java:536)
>
>5/18/2002 5:57:35 AM, Jan Luehe <[EMAIL PROTECTED]> wrote:
>
>>Vernon:
>>
>>> To my understanding, when I use the i18n tags from JSTL, I don't
>>> need to write any class to get locale information stored. Only task
>>> is to configure the locale information file. Please point it out if
>>> I am wrong. If I need to use the PropertyResourceBundle class as
>>> the followings (this class, according to the JDK document, can't be
>>> subclassed by the way):
>>
>>I never suggested you subclass PropertyResourceBundle. I said that
>>JSTL's I18N tags work with any subclass of java.util.ResourceBundle,
>>and the JDK happens to provide two subclasses: ListResourceBundle and
>>PropertyResourceBundle. I mentioned that only in the unlikely case
>>that neither of these fit your needs would you have to provide your
>>own subclass of ResourceBundle (not PropertyResourceBundle).
>>
>>When using PropertyResourceBundle, all you need to provide is a
>>properties file containing key/value pairs. PropertyResourceBundle has
>>a constructor which takes an InputStream from which the properties
>>file is read.
>>
>>For example, if you had this JSP fragment:
>>
>> <fmt:setLocale value="en-US" />
>> <fmt:setBundle basename="com.acme.resources.Resources" />
>> <fmt:message key="greeting" />
>>
>>you would need to provide the following resource with your web application:
>>
>> com/acme/resources/Resources_en_US.properties
>>
>>with these contents:
>>
>> greeting=Hi
>>
>>You can also take a look at the standard-examples web application that
>>ships with the JSTL reference implementation. It contains example
>>pages that have been internationalized into German and Italian, and bundles
>>the corresponding properties files containing the German and Italian
>>localized messages.
>>
>>> At this point, I am very frustrated by the fact of lacking JSTL
>>> documentation. I have searched all possible places and not much
>>> helpful information available. The document comes with JSTL doesn't
>>> help much. And the jwsdp document mentions JSTL, but still not much
>>> on i18n. I guess that I shall use i18n tags other than
>>> JSTL.
>>
>>Please note that JSTL leverages the I18N support provided by the JDK.
>>on which there is a good tutorial at:
>>
>> http://java.sun.com/docs/books/tutorial/i18n/
>>
>>Also, 3 books (that I am aware of) covering JSTL will be out shortly.
>>
>>
>>Jan
>>
>>
>>
>>
>
>
>
>
>--
>To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
>For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>
>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>