yan*_*isf 4 java jsp servlets jstl internationalization
通常,使用JSTL和fmt在JSP中加载和使用资源包,但这需要始终使用语法<fmt:message key=""/>来访问该值.
当要本地化的文本看起来
<a href="url" title="message">很尴尬(尽管写入有效):
<a href="url" title="<fmt:message key="key"/>">
Run Code Online (Sandbox Code Playgroud)
并且很难使用范围的语法
<fmt:message key="key" var="var">
<a href="url" title="${var}">
</fmt:message>
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?我正在寻找像这样的东西
<a href="url" title="${messages.key}">
Run Code Online (Sandbox Code Playgroud)
是的,下面是我的回答的副本.是否有<fmt:message key ="key"/>的简写?正如Bozho对你的问题的评论所述.但由于这个问题实际上是针对Spring的,我的答案并不完全适用于那里.但是,你的问题不是针对Spring的,而是针对普通的JSP/Servlet,因此不能像精确的dupe那样关闭.所以我认为这里的答案更好:
您可以创建一个类extendsResourceBundle,在Filter(基于请求路径?)的帮助下自己管理加载并将其存储在会话范围中.在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);
}
}
Run Code Online (Sandbox Code Playgroud)
(注意TEXT_BASE_NAME不变应参考资源包文件名,上面的例子假设您已经text.properties,text_en.properties等在com.example.i18n包)
的Filter:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Text.setFor((HttpServletRequest) request);
chain.doFilter(request, response);
}
Run Code Online (Sandbox Code Playgroud)
JSP:
<p>${text['home.paragraph']}</p>
Run Code Online (Sandbox Code Playgroud)
如果要从某个servlet或过滤器内部更改语言环境:
Text.getCurrentInstance(request).setLocale(newLocale);
Run Code Online (Sandbox Code Playgroud)
ResourceBundle#Control使用UTF-8读取文件ResourceBundle文件ResourceBundle| 归档时间: |
|
| 查看次数: |
8011 次 |
| 最近记录: |