博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Seam的中文化支持
阅读量:6266 次
发布时间:2019-06-22

本文共 2955 字,大约阅读时间需要 9 分钟。

一、预备知识

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; 
 
同样键值还可以组件属性中使用,例如:
<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>
 
如果键值是带参数的,可以采取以下两种方式在中文资源包中定义:
    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,如需转载请自行联系原作者
你可能感兴趣的文章
26.Azure备份服务器(下)
查看>>
从“网上说的能信么”说开去---学习的思考
查看>>
DHCP 日志分析
查看>>
.NET Micro Framework动态调用C/C++底层代码(原理篇)
查看>>
Windows Server 2012正式版RDS系列⒃
查看>>
Shell脚本之awk篇
查看>>
微软发布Azure Stack硬件需求
查看>>
python socket编程详细介绍
查看>>
Windows Server 2016第三个技术预览版新技术
查看>>
Everything 本地磁盘文件搜索工具下载!
查看>>
Python dict(字典) 详细总结
查看>>
RPF(Reverse Path Forwarding 反向路径转发)技术
查看>>
2016年收到的第一件礼物,被评上微软全球最有价值专家MVP(一)
查看>>
2016中国VR开发者论坛第一期
查看>>
Hyper-V 2016 系列教程5 Hyper-V 服务器基本属性
查看>>
北京、天津工厂自动监测数据爬取
查看>>
第一个python程序简单加法计算器
查看>>
在CentOS下安装Tomcat8
查看>>
Weblogic classloader分析
查看>>
做技术做软件-----如何才能拿到上万的月薪
查看>>