用于显示汉字的Struts 2 i18n本地化问题…
情况1:具有特殊字符的属性文件
属性文件存储用户名,密码和中文提交的消息。 此属性文件以UTF-8格式创建,但是内容未使用native2ascii进行编码。
让我们尝试通过几个UI标签显示汉字。 视图页面被声明为以带有HTML meta标签的UTF-8格式显示。
...
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
...
<s:form action="validateUser">
<s:textfield key="global.username" name="username"/>
<s:password key="global.password" name="password"/>
<s:submit key="global.submit" name="submit" />
<div>Testing 1 : <s:property value="getText('global.username')" /></div>
<div>Testing 2 : <s:text name="global.password" /></div></br/>
</s:form>
...
<s:url id="localezhCN" namespace="/" action="locale" >
<s:param name="request_locale" >zh_CN</s:param>
</s:url>
...
<s:a href="%{localezhCN}" >Chinese</s:a>
...
结果
令人惊讶的是,以下三个UI标签能够正确显示中文消息,
<s:textfield key="global.username" name="username"/>
<s:password key="global.password" name="password"/>
Testing 2 : <s:text name="global.password" />
但是,“ s:submit ”和“ getText() ”无法显示吗?
根据Java的i18n文档,为了正确显示资源包中的特殊字符,必须使用native2ascii工具对其进行处理。
深入研究TextProvider.getText()源代码后,它使用资源bundle.getString()从资源包中检索消息,因此错误消息是合理的。 但是,为什么“ s:text ”,“ s:textfield ”和“ s:password ”能够正确显示中文消息,为什么“ s:submit ”会失败? 我脑子里有太多问题,让我们看案例2…
情况2:具有特殊字符的属性文件(已编码)
这次,使用native2ascii工具处理属性文件,并正确编码了汉字。
结果
结果是完全相反的,现在“ s:submit ”和“ getText() ”可以正确显示,但是其他UI组件失败。 这是按预期方式工作的,因为Struts 2建议使用getText()来显示i18n或本地化消息。 问题是,为什么“ s:submit ”不同?
Struts2 ..怎么了?
我心中有一些问题……
- 为什么s:submit的执行方式如此不同?
- i18n应该非常简单,为什么Struts 2会出现这种问题? 还是我误解了Struts 2 i18n的工作原理?
- 为什么有这么多种方式显示资源束中的消息? 为什么不将其分组为一种方法呢? 在Struts 1中,只需使用“ bean:message”,为什么它在Struts 2中看起来如此复杂?
- Struts 2支持XML资源包吗? 我只是不喜欢使用native2ascii工具将数据编码为UTF-8格式,这会使属性文件不可读。 Apache Wicket在此问题上做得很好,也许Struts 2应该向它学习。
- 那么,如何在Struts 2中正确显示汉字呢?
<s:text name="global.username"/>
<s:property value="getText('global.username')"/>
但是,这仅适用于英语或某些“英语(欧洲)”字符,例如法国,德语。 但是对于中文或日文的“大方块”字符,这两种方法将返回完全不同的输出。 真的不知道如何对中文和日语进行Struts 2本地化。
更新…(16/6/2010)
从百度搜索引擎中寻找解决方案,在其中一篇中文文章中找到了间接解决方案– Struts 2国际化示例
解
问题出在HTML meta标签中,
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
在Struts 2中,meta标签不再起作用,我们应该在视图页面的第一行中放置<%@页面contentType =” text / html; charset = UTF-8”%>标签。 例如,
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
...
结果
所有中文消息均正确显示。
回答我以前的问题
- 为什么s:submit的执行方式如此不同?
答:对此暂无评论- i18n应该非常简单,为什么Struts 2会出现这种问题? 还是我误解了Struts 2 i18n的工作原理?
答:确保在视图页面的第一行中放入<%@页面contentType =” text / html; charset = UTF-8”%> ”。- 为什么有这么多种方式显示资源束中的消息? 为什么不将其分组为一种方法呢? 在Struts 1中,只需使用“ bean:message”,为什么它在Struts 2中看起来如此复杂?
答:s:text,key,getText(),name…都可以正确呈现中文或UTF-8编码的数据,只需确保在视图页面中放入正确的“字符集”即可。 我仍然更喜欢仅一种方法来控制消息束(如Struts 1),太多等效选项只会使开发人员感到困惑。- Struts 2支持XML资源包吗? 我只是不喜欢使用native2ascii工具将数据编码为UTF-8格式,这会使属性文件不可读。 Apache Wicket在此问题上做得很好,也许Struts 2应该向它学习。
答:Hope Struts 2可以在下一版本中支持XML资源包。- 那么,如何在Struts 2中正确显示汉字呢?
答:请参阅上面的解决方案。
参考
- http://www.mkyong.com/java/java-convert-chinese-character-to-unicode-with-native2ascii/
- http://forums.sun.com/thread.jspa?threadID=5185040
- http://www.mail-archive.com/user@struts.apache.org/msg85490.html
- http://www.coderanch.com/t/452139/Struts/applicationresources-properties-utf-characters#2013557
- http://struts.apache.org/2.1.8/docs/localization.html
- http://hxzon00.blog.163.com/blog/static/10489241620088121449163/
翻译自: https://mkyong.com/struts2/struts-2-chinese-localization-issue/