Struts2中的国际化分为三个级别:全局的、包级别的、类级别的。国际化的内容主要是页面上表单元素的国际化,出错提示信息的国际化。有了国际化的内容之后,只需要编写一套逻辑代码,就可以有多种不同的语言展现,如中文界面、英文界面等等,在各语言之间切换时不需要修改代码,只要修改一下本地浏览器的设置就可以了。
无论是全局的、包级别的,还是类级别的,它们的属性文件中的配置方式都一样,只是文件名和放置的位置不同而已。所谓的全局的国际化,就是说整个应用的国际化都可以使用的内容,而包级别的国际化属性文件,只有相应的包下的类才可以使用的内容,类级别国际化属性文件只有指定的类才能使用。Struts2寻找国际化属性文件的时候,首先从范围较小的开始,没有就寻找范围较大的,也就是说首先在类级别的国际化属性文件中寻找,如果没有找到,则去包级别的国际化属性文件中寻找。如果包级别的国际化属性文件中也没有找到,则去全局的国际化属性文件中寻找。在哪一级中找到,则使用找到的内容。
全局的国际化属性文件放在用用的classes目录中,文件的命名规则为basename_+语言代码+_+国家或地区的代码+.properties。basename是在struts.xml文件中配置的,在struts.xml文件中配置如下所示:
<constant name="struts.custom.i18n.resources" value="message"></constant>此处配置了一个常量,value属性值就是国际化属性文件的basename,这儿配置的是message,那么根据上边介绍的规则,该属性文件的名字就是message_zh_CN.properties,zh就是汉语的代码,CN就是中国的国家代码。英语的代码是en,美国的国家代码是US,那么美国的国际化属性文件的文件名就是message_en_US.properties。这种文件的命名方式是针对特定国家和语言的,还有一个不针对特定国家和语言的文件的命名规则就是basename.properties,按照这个规则以及struts.xml文件中的配置,我们的文件名就是message.properties。当在其它的属性文件中找不到时,就会来这个文件中找。这几个文件都放在应用的classes目录下。
上边说了国际化属性文件的命名规则及放置的位置,下边来说说这个属性文件中的内容。
属性文件中以键值对的方式存放内容,如有一个username字段,在英文界面中textfield前边的提示文字为“username”,那么在message_en_US.properties中的内容就是:
username=username在中文界面中的提示文字为“用户名”,那么在message_zh_CN.properties文件中内容就是
username=\u7528\u6237\u540d由于在properties文件中不能出现中文,所以需要将中文转化为UTF-8编码的格式放在文件中。在命令窗口中输入native2ascii命令,让后回车,输入要转换的中文内容,我们这儿输入“用户名” ,按回车键,它会将“用户名”三个字转化为UTF-8格式的编码,转换的结果就是“\u7528\u6237\u540d”。还有一种方法就是在Eclipse中安装一个叫propedit的插件,这样就可以直接在properties文件中输入中文,该插件会将中文自动转换为UTF-8格式的编码,而不需要我们使用native2ascii命令手动转换了。
属性文件配置好之后,就可以在java类和jsp页面中使用了。在java类中使用getText("Key")方法,输入key值就可以获得key对应的内容了。在jsp页面中使用标签的key属性获得,或者使用Struts2标签<s:text name="Key"></s:text>和<s:label key="Key"></s:label>来获得。
上边介绍了全局的属性文件,下边说一下包级别的属性文件。包级别和全局的属性文件的区别在于文件的名字是固定的,而不是struts文件配置的。包级别的属性文件的命名规则为package_语言代码_国家或地区代码.properties。按照这个规则,中文的属性文件的名字就是package_zh_CN.properties,英文的属性文件的名字就是package_en_US.properties。这些属性文件放在相应的包下即可。除过文件名和放置位置外,其它和全局属性文件相同。
类别的属性文件是针对于某个特定的类的,所以它的文件命名就是类名_语言代码_国家或地区代码.properties,和相应的类放在同一个目录下。如果我要配置一个针对于com.test.UserAction的属性文件,那么我在com.test包中建立一个名字为UserAction_zh_CN.properties的文件,这样就可以做中文国际化了。
希望我的介绍会对大家有所帮助。