java liferay 框架_Liferay 6.1开发学习(六):国际化 | IT人生录

Liferay的开发不建议直接在代码中使用中文等内容,建议使用国际化的方式,从资源文件中读取语言等信息,Liferay在平台对封装了许多操作资源文件的类,我们只需要按照此规则既可方便的实现国际化。

一、Portlet属性的国际化

在前面创建的Portlet的时候,portlet的名称等都是英文的,在添加portlet的时候,显示的也是英文的,如何将这些信息显示成中文呢?如将下面Study显示成中文。

35884c7589f9c517eef1f013dc01e577.gif

1、检查portelt.xml的XML文件中的此portlet的信息,是否包含下面的代码,这个是关键,如果没有手动的添加到portlet-info标签的上面。如查在portlet的创建向导里面勾选了“Create resource bundle file”,则会自动生成。

content/Language

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的名称变成了中文。

注意:content/Language这里的内容定义了,我们存放语言文件的目录在content目录下面的Language文件,这里也可以定义成自己喜欢的,只要按照此规则即可。

二、内容的国际化

上面的国际化是portlet属性信息的国际化,如果是我们想在代码中使用这些国际化信息呢?比如提示语、按钮名称等等。这个地方的方法就和普通的java代码的国际化一样,在上面的语言文件中写入相应的key,在代码中读取即可。

1、如我们要将“参数名称”这个词国际化,则在Language_zh_CN.properties中写入:

propertyName=\u53c2\u6570\u540d\u79f0

后面的是参数名称的unicode码,我们在编辑器中直接写入中文,编辑器会自动转换,如果不能转换可以使用JDK的命令如:

native2ascii -encoding UTF-8 Language_zh_CN.properties.native Language_zh_CN.properties

进行中文编码的转换。

2、在代码中调用:

JSP中:LanguageUtil.get(pageContext,"propertyName")

JAVA代码中:LanguageUtil.get(portletRequest.getLocale(), "propertyName")。其中的第一个参数为Local,也可以使用Locale.CHINESE

三、Liferay Portlet属性国际化的修改

在一中提到的portlet属性的国际化存在一个问题,也就是我们一个语言文件中只能定义一个portlet的属性信息,如果我们在一个插件工程中需要国际化多个portlet的属性信息怎么办?在Liferay的官方论坛、Wiki里面也有不少人讨论此问题,但Liferay的解释就是不支持!在一个资源文件里面只能写一个portlet的属性信息。

个人觉得这一点非常不好,如我的一个插件工程中有十几个portlet,那么难道需要定义十几个语言资源文件或者拆分成十几个Portlet?如果支持下面这样:

javax.portlet.title.MyPortletTitle = My Portlet Title

如果是这样的才是很合理的,Liferay平台里面的Portlet的信息就是这样的形式国际化的,但是插件里面不支持。Liferay平台本身是使用的Strtus resource bundle,所以和我们的不太一样。

既然官方不支持,我们就自己动手改造了,好在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就发现,现在的国际化已经支持我们需要的形式了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值