对于各种不同的
Java
应用,国际化的问题总会给我们非英文用户带来一些麻烦,在
JSF
中也一样,在实践中碰到了一系列不容易解决的问题,最终解决的大部分的问题,也完成了一个可以运行的小项目,我把我的一些经验拿出来和大家分享一下,希望能让大家在这些地方少走一些弯路。
Java
中的国际化是由
java.util.Locale
类支持的,中文对应的代码是“
zh
”,所以我们要在
JSF
中使用中文的话,需要在我们的
faces-config.xml
中做一些简单的配置了,加入对中文的支持,当然如果需要支持更多的语言的话,多加几个
<supported-locale>
就可以了。
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
这里定义了一个
<message-bundle>resource</message-bundle>
指的是资源文件所在的位置和文件名,这里我们把资源文件放在
source
根目录下名称为
resource.properties
,这个是英文的资源文件,另外一个存放中文信息的资源文件名为
resource_zh.properties
。
接下来,我们可以在这些资源文件中加入我们需要的资源信息。推荐大家一个
Eclipse
的插件来写我们的资源文件,这个插件叫做
Eclipse ResourceBundle Editor Plugin
,我们可以很方便的在里面写中文信息,它会自动的转换为
UTF-8
编码的信息,大家可以到这个地方去下载这个插件
http://resourcebundleeditor.com/ess/rbe/home.do
。使用起来很简单,这里就不再多说了。
在
JSP
文件中使用这些资源之前,需要加入一下这些东西:
<%@ page contentType="text/html;charset=utf-8"%>
在
HTML
的
head
中加入:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
下面,我们就可以在我们的页面中绑定并使用这些资源信息:
使用之前要加载一下资源文件,使用这个
Tag
:
<f:loadBundle basename="resource" var="messages"/>
我在这里给消息起了个别名
messages
,以后就可以通过这个别名来使用资源文件。
比如我使用
<h:outputText>
来引用资源信息
schedule.label.starttime
可以这么用。
<h:outputText value="#{messages['schedule.label.starttime']}"/>
是不是可以用了呢?不过别急,用是能用,如果你在
JSF
中使用了
Tiles
的话,就会出现一些问题了,我们如果使用了
<h:inputText>
这样的输入框的话,当你输入中文并提交,你就会发现,你输入的文字变成这样的了“
/u5DF2/u5B8C/u6210
”,曾经为了这个问题,找解决方案花了我三周的时间。首先把问题定位到
Tiles
上,因为如果不使用
Tiles
的话,是没有这个问题的,但是
Tiles
又不能不用的,最后发现其实很容易的,只要在
<f:view>
中加上
locale=”zh”
就可以了,如果需要的话,可以把这个属性动态化,满足国际化的需要,就像这样
<f:view locale="#{userProfile.locale}">
。
这样的话,一切都正常了,使用
Tiles
也没有问题的。
今天有朋友问了我关于
JavaScript
中的中文乱码问题,我在我的
JSP
中找了一段代码拿出来看看:
<h:commandLink id="delete" action=".." οnclick="if (!confirm('#{messages['system.msg.confirmdel']}')) return false;">
这样的话,里面的中文是可以正常显示的,下面我给大家一些建议吧,希望对大家有一些帮助。
1.
所有文字信息全部写在资源文件中,通过引用其别名来使用这些信息;
2.
所有的中文要转换成
UTF-8
编码,可以使用
Eclipse ResourceBundle Editor Plugin
来解决;
3.
页面编码方式定义成
UTF-8
,不要使用其默认值。
当然,这只是我在使用中积累的一点小小的经验了,希望能对大家有一点帮助,如果大家发现有什么不正确就请赐教,如果更好的解决方案,也拿出来和大家分享吧,因为我们的分享可能会给大家节省更多的时间。