Portlet名字的国际化
在前面创建的Portlet的时候,portlet的名称等都是英文的,在添加portlet的时候,显示的也是英文的,如何将这些信息显示成中文呢?
1、检查portelt.xml的XML文件中的此portlet的信息,是否包含下面的代码,这个是关键,如果没有手动的添加到portlet-info标签的上面。如查在portlet的创建向导里面勾选了“Create resource bundle file”,则会自动生成。
<resource-bundle>content.Language_zh_CN</resource-bundle>
2、工程的src目录下面找到content包,如果没有则创建,如果有则打开。在里面新建Language_zh_CN.properties文件,我们的portlet中文信息写在此文件里面。
3、在此文件中写入“javax.portlet.title=此处写相应的标题文字”,可以直接写中文,eclipse的properties编辑器,会自动的转换成unicode代码。一般我们只写title就可以,如果有特别需求,可以加上javax.portlet.keywords,javax.portlet.short-title等信息。
4、现在重新打包部署此工程,再次添加portlet,即可看到portlet的名称变成了中文。
注 :在一中提到的portlet属性的国际化存在一个问题,也就是我们一个语言文件中只能定义一个portlet的属性信息,如果我们在一个插件工程中需要国际化多个portlet的属性信息怎么办?在Liferay的官方论坛、Wiki里面也有不少人讨论此问题,但Liferay的解释就是不支持!在一个资源文件里面只能写一个portlet的属性信息。
个人觉得这一点非常不好,如我的一个插件工程中有十几个portlet,那么难道需要定义十几个语言资源文件或者拆分成十几个Portlet?如果支持下面这样:
javax.portlet.title.MyPortletTitle= My Portlet Title
如果是这样的才是很合理的,Liferay平台里面的Portlet的信息就是这样的形式国际化的,但是插件里面不支持。Liferay平台本身是使用的Strtus resource bundle,所以和我们的不太一样。
既然官方不支持,我们就自己动手改造了,好在Liferay是开源的,我们修改他的源码自己实现就可以了。
方法如下:
1、参考上一篇文章,http://www.huqiwen.com/2012/09/21/liferay-6-1-development-study-5-compile-debug-deploy/,如果编译部署关联Liferay的源码
2、在源码里面找到PortletResourceBundle.java这个类(小提示:可以在eclipse中使用快捷键ctrl+shift+r来快速定位此文件)。找到其中的handleGetObject方法,修改成如下,下面有注释,显示了哪里修改的:
@Override
protected Object handleGetObject(String key) {
if (key == null) {
throw new NullPointerException();
}
String value = null;
if (parent != null) {
try {
value = parent.getString(key);
}
catch (MissingResourceException mre) {
//hqw 2012.09.09 add begin
String titlekey =key.concat(StringPool.PERIOD).concat(_portletInfo.getTitle());
if (Validator.isNotNull(titlekey)) {
titlekey = titlekey.toLowerCase();
}
try {
value = parent.getString(titlekey);
} catch (MissingResourceException mre2) {
}
//end
}
}
if ((value == null) || (value== ResourceBundleUtil.NULL_VALUE)) {
value = _getJavaxPortletString(key);
}
if ((value == null)&& ResourceBundleThreadLocal.isReplace()) {
value = ResourceBundleUtil.NULL_VALUE;
}
return value;
}
在我debug时,发现liferay只是通过javax.portlet.tiltle这个key值寻找,那我们在给他加上具体的title值就可以了。现在修改后的不但兼容他原来的,而且又支持javax.portlet.title.MyPortletTitle = My Portlet Title。这样的多好
3、现在使用ant进行deploy源码,再次启动tomcat就发现,现在的国际化已经支持我们需要的形式了。