用于国际化和本地化的JSTL资源包



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

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

2) 将JSTL相关的标签库加载到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)似乎我必须在每个单独的JSP页面中添加<fmt:setBundle>标记,这有点难看,如果将来需要更改(名称更改?),这将使生活更加困难。

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

有什么推荐的方法吗?

问题2)如果没有匹配的属性文件,如何指定默认语言?在我的案例中,我已经测试过,如果我用法语将<fmt:setLocale>放入JSP页面,该页面仍然可以正确加载。这是否意味着英文版总是默认的,还是仅仅因为我的操作系统/浏览器是英文版?

如果一个中国/日本用户打开我的页面,而我在那里有英语和法语属性文件,会发生什么?

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

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

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

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

如果找不到匹配项,格式化操作将查找所谓的回退区域设置配置设置。配置设置是由应用程序的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

下面是使用JSTL创建的JSP模板,它可以帮助人们整合用于国际化和本地化的JSTL资源包。

template.tag

<%@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以及正文。

home.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>

最新更新