通常使用 JSTL 和 fmt 在 JSP 中加载和使用资源包,但这需要始终使用语法 <fmt:message key=""/>
访问该值。
当要本地化的文本看起来像
<a href="url" title="message">
这很尴尬(尽管写起来有效):
<a href="url" title="<fmt:message key="key"/>">
并且使用范围语法很笨拙
<fmt:message key="key" var="var">
<a href="url" title="${var}">
</fmt:message>
有没有更简单的方法来做到这一点?我正在寻找类似的东西
<a href="url" title="${messages.key}">
最佳答案
是的,下面是我在 Is there a shorthand for <fmt:message key="key" />? 上的回答的副本正如 Bozho 对你的问题的评论中提到的那样。但由于该问题实际上是针对 Spring 的,因此我的回答并不完全适用于此。然而,您的问题不是针对 Spring 的,而是针对普通的 JSP/Servlet 的,因此不能作为精确的欺骗来关闭。所以我认为这里的答案更好:
您可以创建一个类扩展
ResourceBundle
,在 Filter
(基于请求路径?)的帮助下自行管理加载并将其存储在 session 范围内。 ResourceBundle
可以通过通常的 JSP EL 方式访问。您可以像访问 Map
一样访问它。 handleGetObject()
方法将在每次访问时被调用。
这是一个启动示例:
package com.example.i18n;
import java.util.Enumeration;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
public class Text extends ResourceBundle {
private static final String TEXT_ATTRIBUTE_NAME = "text";
private static final String TEXT_BASE_NAME = "com.example.i18n.text";
private Text(Locale locale) {
setLocale(locale);
}
public static void setFor(HttpServletRequest request) {
if (request.getSession().getAttribute(TEXT_ATTRIBUTE_NAME) == null) {
request.getSession().setAttribute(TEXT_ATTRIBUTE_NAME, new Text(request.getLocale()));
}
}
public static Text getCurrentInstance(HttpServletRequest request) {
return (Text) request.getSession().getAttribute(TEXT_ATTRIBUTE_NAME);
}
public void setLocale(Locale locale) {
if (parent == null || !parent.getLocale().equals(locale)) {
setParent(getBundle(TEXT_BASE_NAME, locale));
}
}
@Override
public Enumeration<String> getKeys() {
return parent.getKeys();
}
@Override
protected Object handleGetObject(String key) {
return parent.getObject(key);
}
}
(注意 TEXT_BASE_NAME
常量应该指资源包文件的名称,上面的示例假定您有 text.properties
,
等)com.example.i18n
包中的 text_en.properties
过滤器
:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Text.setFor((HttpServletRequest) request);
chain.doFilter(request, response);
}
JSP:
<p>${text['home.paragraph']}</p>
如果你想从某些 servlet 或过滤器中更改语言环境:
Text.getCurrentInstance(request).setLocale(newLocale);
相关/有趣的知识:
关于java - JSP 和 ResourceBundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7469223/