一、预备知识
Seam的中文化支持是通过资源包文件来实现的。资源包是Java属性元数据格式的一种应用,它以键/值对的形式保存元数据。这些键/值对按照一定的规则进行分组,并绑定到某个bundle名称下。Java将根据bundle名和指定的地域(即local)来查找属性文件。文件名由bundle组成,接着是以一条下划线(_)作为前缀的当前地域,最后是.properties的扩展名。如果找不到当前地域的文件,就会采用以"bundle名.properties"为名的文件。例如:如果bundle名是messages,且当前地域为US English,那么Seam就会按下列搜索顺序来查找资源包文件:
messages_en_US.properties
messages_en.properties
messages.properties
因此要想让Seam支持中文的话,那就必须要有中文资源包文件,根据Seam的搜索约定,必须要在下列文件之一中键值为中文:
messages_zh_CN.properties
messages_zh.properties
messages.properties
另:采用资源包文件不但有利于支持应用程序国际化,而且它还可以很方便地修改输出消息,而不需要在程序源代码中去查找和修改,有利于程序的后期维护和修改。
二、实现方式
一般来说,Seam在用户登录会话时会生成一个java.util.Locale实例,该实例会以"locale"组件的形式提供给应用程序,Seam会自动通过JSF来判定当前会话的locale。其判定流程按如下顺序进行:
如果HTTP请求中有关联locale(如:浏览器的locale),且该locale在faces-config.xml的支持列表中,那么其它会话也使用该locale;
否则使用在faces-config.xml文件中指定的默认locale;
否则使用服务器的默认locale。
因此,要想让Seam支持中文,首先需要在faces-config.xml文件(位于项目根目录下的resources/WEB-INF目录)中支持中文,如下所示:
<locale-config>
<default-locale>en</default-locale>
<supported-locale>bg</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>en</supported-locale>
<supported-locale>fr</supported-locale>
<supported-locale>it</supported-locale>
<supported-locale>tr</supported-locale>
<!-- 中文化支持 -->
<supported-locale>zh_CN</supported-locale>
</locale-config>
当然,如果稳妥起见,可以将default-locale标签中的en设置成zh_CN(将默认locale指定为简体中文),甚至可以把服务器的默认locale也设为zh_CN。
其次在中文资源包中(位于项目根目录下的resources目录)定义一个键/值对(为了方便描述,bundle名采用messages,这样中文资源包文件名就是messages_zh_CN.properties):
UserName=用户名
Welcome=欢迎
接着在JSF中声明引入messages资源包,JSF 通过使用 来支持用户界面标签和描述文本的国际化。这个方法同样可以用在Seam应用程序中。如下所示:
...
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
...
<f:loadBundle basename="messages" var="msgs"/>
然后,利用EL表达式引用即可:
#{msgs['UserName']} 或 #{msgs.UserName}
或者也可以直接利用Seam的 messages 组件用内嵌的EL表达式来显示资源包中键/值对的值。Seam提供了一个 java.util.ResourceBundle (以org.jboss.seam.core.resourceBundle 的名字提供给应用程序)。 你需要通过这个指定的资源包来使你的国际化标签可用。默认情况下,Seam 使用bundle名为messages的资源包, 你需要在 messages.properties、messages_en.properties、messages_zh_CN.properties 等文件中定义你的键/值对,而无需显示使用语句<f:loadBundle/>。
#{messages['UserName']}
键值还可以在代码中使用,例如:
@In ResourceBundle resourceBundle;
@In private Map messages;
@In("#{messages['Welcome']}") private String welcomeMessage;
@In("#{messages['Welcome']}") private String welcomeMessage;
同样键值还可以组件属性中使用,例如:
<component name=”registration”>
<property name=”specialtyTypes”>
<key>DRIVE</key><value>#{messages[’specialty.drive’]}</value>
<key>CHIP</key><value>#{messages[’specialty.drive’]}</value>
<key>PUTT</key><value>#{messages[’specialty.putt’]}</value>
<key>IRON</key><value>#{messages[’specialty.iron’]}</value>
<key>LOOKS</key><value>#{messages[’specialty.looks’]}</value>
</property>
</component>
<property name=”specialtyTypes”>
<key>DRIVE</key><value>#{messages[’specialty.drive’]}</value>
<key>CHIP</key><value>#{messages[’specialty.drive’]}</value>
<key>PUTT</key><value>#{messages[’specialty.putt’]}</value>
<key>IRON</key><value>#{messages[’specialty.iron’]}</value>
<key>LOOKS</key><value>#{messages[’specialty.looks’]}</value>
</property>
</component>
如果键值是带参数的,可以采取以下两种方式在中文资源包中定义:
login.welcome=欢迎您,#{newUser.name}!
login.welcome=欢迎您,{0}!
第一种定义方式,可以通过EL表达式#{msgs['Welcome']}来显示,第二种定义方式,可以在代码中通过FacesMessages组件来实现,如下面代码所示:
FacesMessages.addFromResourceBundle(“login.welcome”,newUser.getName());
本文转自 firehare 51CTO博客,原文链接:http://blog.51cto.com/firehare/586523,如需转载请自行联系原作者