我正在尝试使用基于How to internationalize a Java web application?的JSTL 1.2来使我的网站国际化。这是JSP文件的开头:
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
<fmt:setBundle basename="com.bundle.test" />
<html lang="${language}">
以下是test.properties
文件:
login.label.username = Username
login.label.password = Password
login.button.submit = Sign in
login.label.direction = rlt
在正文中,我包括这些行:
<label for="username"><fmt:message key="login.label.username" /></label>
但是当我在浏览器中打开JSP页面时,它输出如下:
??? ??? login.label.username
我希望它输出值“Username”。
这是如何引起的?如何解决?
答案 0 :(得分:7)
格式???key???
的消息表示无法找到与密钥关联的消息。这可能意味着您输入密钥,或者捆绑文件中缺少密钥,或者甚至整个捆绑文件在运行时类路径中不作为资源。
鉴于密钥看起来很好,并且存在于捆绑文件中,这只能意味着webapp无法将捆绑文件作为类路径资源找到。
鉴于您正在使用Maven,您应该确保已将它们放在/src/main/resources
文件夹中。在您的特定情况下,包名称为com.bundle.test
,您应该在那里有一个/src/main/resources/com/bundle/test.properties
文件。
如果仍然无法正常工作,那么您的构建可能会变脏或损坏。清洁和重建,以确保。然后使用一些ZIP工具提取Maven生成的WAR文件并浏览其内容。它应该最终位于/WEB-INF/classes
文件夹中/WEB-INF/classes/com/bundle/test.properties
。
答案 1 :(得分:0)
在我的web.xml中添加此代码解决了我的问题
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>messages</param-value>
</context-param>
答案 2 :(得分:0)
万一这对任何人都有帮助,我就会在这个问题上陷入困境。
我的项目中带有属性文件的配置文件很多,而我的问题是我没有将密钥添加到所有配置文件中,因此,这给了我一个
??? message.key ???
错误。
将密钥添加到所有配置文件属性文件后,此问题已解决。
答案 3 :(得分:-1)
如果某个消息被 ???<key>???
替换,这意味着在配置的资源包中找不到消息密钥。
请务必在部署描述符 (web.xml) 中添加上下文初始化参数。这会建立一个资源包,可以从中加载本地化消息。
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>test</param-value>
</context-param>
然后将 test.properties 文件放在 IDE 项目的 source/production/resources 目录中。