我们有一个使用基本 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 过滤器注入(inject)它?我会说我对这两种选择都不太满意。有什么推荐的方法吗?
问题2)如果那里没有匹配的属性文件,如何指定默认语言?如果我输入
<fmt:setLocale>
,我已经在我的情况下进行了测试用法语进入JSP页面,页面仍然可以正确加载。这是否意味着英文版本始终是默认版本,或者仅仅是因为我的操作系统/浏览器是英文的?如果一个中文/日文用户打开我的页面并且我有英文和法文属性文件,会发生什么?
最佳答案
下面是使用 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.jsp 和 footer.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>
关于jsp - 用于国际化和本地化的 JSTL 资源包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12470928/