Struts 2中文本地化问题

用于显示汉字的Struts 2 i18n本地化问题…

情况1:具有特殊字符的属性文件

属性文件存储用户名,密码和中文提交的消息。 此属性文件以UTF-8格式创建,但是内容未使用native2ascii进行编码。

struts2-localization-case1-1

让我们尝试通过几个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>
...

结果

struts2-localization-case1-2

令人惊讶的是,以下三个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工具处理属性文件,并正确编码了汉字。

struts2-localization-case2-1

结果

struts2-localization-case2-2

结果是完全相反的,现在“ s:submit ”和“ getText() ”可以正确显示,但是其他UI组件失败。 这是按预期方式工作的,因为Struts 2建议使用getText()来显示i18n或本地化消息。 问题是,为什么“ s:submit ”不同?

Struts2 ..怎么了?

我心中有一些问题……

  1. 为什么s:submit的执行方式如此不同?
  2. i18n应该非常简单,为什么Struts 2会出现这种问题? 还是我误解了Struts 2 i18n的工作原理?
  3. 为什么有这么多种方式显示资源束中的消息? 为什么不将其分组为一种方法呢? 在Struts 1中,只需使用“ bean:message”,为什么它在Struts 2中看起来如此复杂?
  4. Struts 2支持XML资源包吗? 我只是不喜欢使用native2ascii工具将数据编码为UTF-8格式,这会使属性文件不可读。 Apache Wicket在此问题上做得很好,也许Struts 2应该向它学习。
  5. 那么,如何在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 1中,需要上面的meta标签才能正确显示UTF-8数据,但是对于Struts 2则不是这样。

在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>
...

结果

struts2-localization-work

所有中文消息均正确显示。

回答我以前的问题

  1. 为什么s:submit的执行方式如此不同?
    答:对此暂无评论
  2. i18n应该非常简单,为什么Struts 2会出现这种问题? 还是我误解了Struts 2 i18n的工作原理?
    答:确保在视图页面的第一行中放入<%@页面contentType =” text / html; charset = UTF-8”%> ”。
  3. 为什么有这么多种方式显示资源束中的消息? 为什么不将其分组为一种方法呢? 在Struts 1中,只需使用“ bean:message”,为什么它在Struts 2中看起来如此复杂?
    答:s:text,key,getText(),name…都可以正确呈现中文或UTF-8编码的数据,只需确保在视图页面中放入正确的“字符集”即可。 我仍然更喜欢仅一种方法来控制消息束(如Struts 1),太多等效选项只会使开发人员感到困惑。
  4. Struts 2支持XML资源包吗? 我只是不喜欢使用native2ascii工具将数据编码为UTF-8格式,这会使属性文件不可读。 Apache Wicket在此问题上做得很好,也许Struts 2应该向它学习。
    答:Hope Struts 2可以在下一版本中支持XML资源包。
  5. 那么,如何在Struts 2中正确显示汉字呢?
    答:请参阅上面的解决方案。

下载它– Struts2-i18n-issue-示例

参考

  1. http://www.mkyong.com/java/java-convert-chinese-character-to-unicode-with-native2ascii/
  2. http://forums.sun.com/thread.jspa?threadID=5185040
  3. http://www.mail-archive.com/user@struts.apache.org/msg85490.html
  4. http://www.coderanch.com/t/452139/Struts/applicationresources-properties-utf-characters#2013557
  5. http://struts.apache.org/2.1.8/docs/localization.html
  6. http://hxzon00.blog.163.com/blog/static/10489241620088121449163/

翻译自: https://mkyong.com/struts2/struts-2-chinese-localization-issue/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值