Www.helper3.com
热门关键字: php net javascript java
Struts2基础 专题
专题目录
您的位置:java > Struts2基础专题 > Struts2中文本地化问题
Struts2中文本地化问题
作者:--    发布时间:2019-11-20 10:17:56
一个 struts2 的国际化定位的问题,用来显示中国汉字...


案例1:属性有特殊字符的文件

属性文件存储用户名,密码信息,并以中文字符提交。此属性文件以utf-8格式创建的,但内容不使用 native2ascii 编码。

struts2-localization-case1-1

让我们试着通过一些ui标签,来显示中国汉字。查看页面声明为utf-8格式的html元标记来显示。

...
<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的国际化文档,要使用资源包正确显示特殊字符,则必须用 native2ascii 工具进行处理。

深入到 textprovider.gettext()的源代码后,它使用的资源 bundle.getstring()来从资源包检索的消息,所以不正确的消息是合理的。但是,为什么“s:text“, “s:textfield” 和 “s:password” 能够正确显示了中文的消息,为什么“s:submit”会失败?在有太多的问题,让我们看看示例2...

案例2:有特殊字符的属性文件(编码)

这一次,属性文件使用native2ascii工具处理中国汉字的编码正确。

struts2-localization-case2-1

结果如下所示:

其结果是完全逆转,现在 “s:submit” 和 “gettext()” 是能够正确地显示它,但其他ui组件失败。 这里是按预期方式工作的,因为在struts 2推荐使用gettext(),以显示国际化或本地化的消息。问题是,为什么“s:submit”会不同呢?

struts2..哪里有问题?

这里有几个问题:

  1. 为什么 s:submit 有如此不同的效果?
  2. 对国际化应该是非常简单的,为什么在struts 2有这种问题? 或者我们误解了struts2 国际化如何工作了?
  3. 为什么有这么多的方式来显示来自资源包的消息?为什么不直接组织成一个方法? 在struts1,只需使用“bean:message”,为什么struts 2中它看起来很复杂?
  4. struts2的支持xml资源包? 我们可能不太喜欢用native2ascii工具对数据进行编码为utf-8格式,它使属性文件不可读。 apache wicket的在这个问题做了很好的工作,可能是在struts 2中吸取教训。
  5. 那么,如何正确地在 struts2 中显示中国汉字?
许多文章和教程使用以下方法来显示资源包的消息:
<s:text name="global.username"/>
<s:property value="gettext('global.username')"/> 

然而,这仅适用于英国或一些“英语状(欧洲)” 的字符,如法文,德文。但对中文或日文,这两种方法将返回完全不同的输出。真的不知道struts2的本地化该怎么办了。

解决办法

问题是在html meta标签,
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
在struts1,上述meta标签必须正确显示utf-8的数据,但这在 struts2 是有问题的。

在struts2,meta标签不起作用,我们应该把 <%@ page contenttype=”text/html;charset=utf-8″ %>标签放在页面的第一行。例如下面的代码片断:

<%@ page contenttype="text/html;charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
...

结果显示如下:

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

回答之前的问题

  1. 为什么 s:submit 有如此不同的效果?
    a: 暂无评论
  2. 对国际化应该是非常简单的,为什么在struts 2有这种问题? 或者我们误解了struts2 国际化如何工作了?
    a: 
    确保把
     <%@ page contenttype=”text/html;charset=utf-8″ %>” 放在页面的第一行。
  3. 为什么有这么多的方式来显示来自资源包的消息?为什么不直接组织成一个方法? 在struts1,只需使用“bean:message”,为什么struts 2中它看起来很复杂?
    a: s:text, key, gettext(), name… , 
    所有的都能够正确地显示中文或utf-8编码的数据,
    只要确保把正确的“字符集”放在视图页面中。
  4. struts2的支持xml资源包? 我们可能不太喜欢用native2ascii工具对数据进行编码为utf-8格式,它使属性文件不可读。 apache wicket的在这个问题做了很好的工作,可能是在struts 2中吸取教训。
    a:希望在struts2的下一版本可以支持在xml资源包。
  5. 那么,如何正确地在 struts2 中显示中国汉字?
    a: 看看上页的解决办法



滚动到顶部 滚动到底部
网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
QQ群:570078429
网站备案号:
粤ICP备17073857号