Java JSP和ResourceBundle
通常使用JSTL和fmt在JSP中加载和使用资源包,但这需要始终使用语法Java JSP和ResourceBundle,java,jsp,servlets,internationalization,jstl,Java,Jsp,Servlets,Internationalization,Jstl,通常使用JSTL和fmt在JSP中加载和使用资源包,但这需要始终使用语法来访问值 当要本地化的文本看起来像 这很尴尬(尽管写起来很有效): 而且使用作用域语法非常笨拙 <fmt:message key="key" var="var"> <a href="url" title="${var}"> </fmt:message> 有没有更简单的方法?我在找像这样的东西 <a href="url" title="${messages.key}">
来访问值
当要本地化的文本看起来像
这很尴尬(尽管写起来很有效):
而且使用作用域语法非常笨拙
<fmt:message key="key" var="var">
<a href="url" title="${var}">
</fmt:message>
有没有更简单的方法?我在找像这样的东西
<a href="url" title="${messages.key}">
要执行您想要的操作,您可能需要创建并注册您自己的。看看这个答案- 因此,您可以保留一个前缀,例如
MESSAGES
,并将其转换为ResourceBundle
查找
i、 e.${MESSAGES.key}
由您的ELResolver
作为bundle.getString(key)
处理。是的,下面是我的答案的副本,正如Bozho对您的问题的评论中提到的。但由于这个问题实际上是针对Spring的,所以我的答案在那里并不完全适用。然而,您的问题不是针对Spring的,而是针对普通JSP/Servlet的,因此不能完全重复。因此,我认为答案在这里更合适:
您可以创建一个
扩展的类
,通过过滤器(基于请求路径?)自行管理加载,并将其存储在会话范围中。ResourceBundle
可以通过通常的方式访问。您可以像访问地图一样访问它。该方法将在每次访问时调用
以下是一个启动示例:
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);
}
}
JSP:
相关/有兴趣了解:
嗯,我不知道为什么使用声音对你来说如此“尴尬”。如果您想要上面提到的格式,那么您可以定义自己的消息
bean并在其中处理本地化,这样您就可以从相应的资源包(根据用户的区域设置)返回值。相关:注意使用“new Text(request.getLocale())'您将丢失缓存功能,资源包将在每个请求中重新加载
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);
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Text.setFor((HttpServletRequest) request);
chain.doFilter(request, response);
}
<p>${text['home.paragraph']}</p>
Text.getCurrentInstance(request).setLocale(newLocale);