12

我们有一个使用基本 JSP/servlet 的应用程序,当前所有英文文本都硬编码在 JSP 页面中。我们正在考虑应用程序的国际化,因此我们需要某种方法将文本提取到属性文件中。

这是我到目前为止所做的:
1)创建一个名为的文件XXXXX-messages_en.properties,将键/值对添加到属性文件中,例如AAAAA = Hello World

2)将JSTL相关的taglibs加载到JSP页面中

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

3) 将前面的文字替换为

<fmt:message key="AAAAA" bundle="${XXXXX}"/>

4)在JSP页面中添加setBundle标签:

<fmt:setBundle basename="XXXXX-messages" var="XXXXX"/>

并重新启动服务器,一切都正确显示。

但是,关于 JSTL 国际化库的使用,我的问题是:

问题 1) 看来我必须在<fmt:setBundle>每个 JSP 页面中添加标签,这有点难看,如果将来需要更改(更改名称?)这将使生活更加困难。

我考虑过也许我可以创建一个单独的页面并将其放入<fmt:setBundle>其中,然后使用<jsp:include>. 或者我可以通过 servlet 过滤器注入它?我会说我对这两种选择都不太满意。

有什么推荐的方法吗?

问题2)如果那里没有匹配的属性文件,如何指定默认语言?我在我的情况下进行了测试,如果我<fmt:setLocale>用法语放入JSP页面,页面仍然可以正确加载。这是否意味着英文版本始终是默认版本,或者仅仅是因为我的操作系统/浏览器是英文的?

如果一个中文/日文用户打开我的页面并且我有英文和法文属性文件,会发生什么?

4

3 回答 3

8

好的,我找到了解决自己问题1的方法。基本上我需要做的就是将其放入web.xml中:

<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>XXXXX-messages</param-value>
</context-param>

通过这样做,我可以将 setBundle 的标签保存在每个 jsp 页面中。

于 2012-09-18T05:47:03.290 回答
7

您可以使用后备语言环境来解决您的第二个问题:

如果未找到匹配项,格式化操作会查找所谓的 fallback-locale 配置设置。配置设置是由应用程序的 web.xml 文件中的上下文参数或由 JSP 范围之一中的 JSTL 操作或 Java 代码设置的值。要在 web.xml 文件中设置后备语言环境,请包含以下元素:

<context-param>
  <param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
  <param-value>en</param-value>
</context-param>

http://onjava.com/onjava/2002/09/11/jstl2.html

于 2012-09-18T08:41:53.173 回答
3

下面是使用 JSTL 创建的 JSP 模板,可以帮助某人合并 JSTL 资源包以实现国际化和本地化。

模板标签

<%@tag description="UI Template" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>           
<%@attribute name="header" fragment="true"%>
<%@attribute name="footer" fragment="true"%>
<fmt:setLocale value="en" scope="session" />
<fmt:setBundle basename="resources.labels" var="label" scope="session" />
<fmt:setBundle basename="resources.messages" var="msg" scope="session" />
<html>
    <body>
        <div id="pageHeader">
            <jsp:invoke fragment="header"/>
        </div>
        <div id="body">            
            <jsp:doBody/>
        </div>
        <div id="pageFooter">            
            <jsp:invoke fragment="footer"/>
        </div>
    </body>
</html>


下面是home.jsp文件,显示了与正文一起包含的header.jspfooter.jsp 。

主页.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<t:template>
    <jsp:attribute name="header">
        <jsp:include page="../header.jsp" />
    </jsp:attribute>
    <jsp:attribute name="footer">
        <jsp:include page="../footer.jsp" />
    </jsp:attribute>
    <jsp:body>        
        <font style="font-family: Arial; font-size: 10pt; color: blue; font-weight: bold">
            <fmt:message bundle="${msg}" key="message.loginSuccess" />
        </font>
        <br/>
        <font style="font-family: Arial; font-size: 10pt; font-weight: bold">
            <fmt:message bundle="${label}" key="label.home" />
        </font>
    </jsp:body>
</t:template>


web.xml 文件

<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.labels</param-value>
    <param-value>resources.messages</param-value>
</context-param>
于 2013-03-28T16:10:21.243 回答