Liferay 6.1开发学习(六):国际化
Liferay的开发不建议直接在代码中使用中文等内容,建议使用国际化的方式,从资源文件中读取语言等信息,Liferay在平台对封装了许多操作资源文件的类,我们只需要按照此规则既可方便的实现国际化。
一、Portlet属性的国际化
在前面创建的Portlet的时候,portlet的名称等都是英文的,在添加portlet的时候,显示的也是英文的,如何将这些信息显示成中文呢?如将下面Study显示成中文。
1、检查portelt.xml的XML文件中的此portlet的信息,是否包含下面的代码,这个是关键,如果没有手动的添加到portlet-info标签的上面。如查在portlet的创建向导里面勾选了“Create resource bundle file”,则会自动生成。
<resource-bundle>content/Language</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的名称变成了中文。
注意:<resource-bundle>content/Language</resource-bundle>这里的内容定义了,我们存放语言文件的目录在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是开源的,我们修改他的源码自己实现就可以了。
方法如下:
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就发现,现在的国际化已经支持我们需要的形式了。
我想请教个问题。我现在要求三种语言,Language_zh_CN.properties Language_zh_TW.properties Language_en.properties 。
在portlet.xml怎么添加呢??
content/Language_zh_CN
content/Language_zh_TW
content/Language_en,这样会报错啊
只需要添加content/Language就可以了,后面的这些是根据浏览器的local来自动切换的,如果要做多语言切换可以手动的设置一下local就可以了
还是不行额。系统自带的一个语言portlet。我改成了只有 en,CN,TW.
ssi
SSI
org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher
viewNamespace
/ssi
defaultViewAction
index
0
text/html
VIEW
content/Language
SSi
ssi
administrator
guest
power-user
user
Language_zh_CN.properties
javax.portlet.title.SSi=SSI测试
没看明白你写的这个是啥意思呀
我想请教个问题,关于portlet内容的国际化,我在language.properties中把portlet中的内容比如一个按钮的文字从英文改成中文,但是编译后只有title生效,而内容部分没有生效,是不是需要写一些函数调用?比如LanguageUtil.get(pageContext,”propertyName”);但是这个怎么用啊,麻烦详细讲下吧,十分感谢!
LanguageUtil.get(pageContext,”propertyName”)就可以这样用,propertyName是在language.properties里面写的key值,这个方法就是获取这个key值对应的内容
是不是这样用?比如我要改一个按钮从sunbit变为提交,在JSP中如下 ;在language.properties文件中将submit=提交,这样编译后按钮的内容直接显示为value中的内容了,应该是我使用的不对,主要问题出在哪呢?刚接触java,谢谢了
我是这样写的:
JSP中:input type=”submit” value=”LanguageUtil.get(pageContext,”send”)
Language.properties文件中:send=提交
嗯 是的,这样用就可以
可是这个按钮的值显示为:LanguageUtil.get(pagecontext,了,是不是JSP要引入什么? 任何在portlet中出现的文字都可以这样被汉化吗?
这个是java代码吧,应该在外围加上,然后再写LanguageUtil…这些东西
加上””这个东西
请教个问题。刚安装的liferay就是支持多语言的,我想知道它自带的语言文件在哪?我们也可以直接修改这个文件吧,然后就不用为每个portlet都创建语言文件了。但是没找到这个文件,在她的源码下面是有的。
这个文件是在web-inf/lib/portal-impl.jar包里面的
我们一直不直接修改这个语言文件,如果需要覆盖,一般是使用hook工程的方法,这样可以达到非侵入的目的
还是需要为相应的Portla工程建立相应的语言文件,这样耦合性降低,也方便迁移部署
1,
content/Language
2,/Test-portlet/docroot/WEB-INF/src/content/Language_zh_CN.properties
3,javax.portlet.title.Test=测试
4,
都有
。。。。
就是在页面布不能显示中文, 楼主 求救
lz说 只能修改title,所以这样子写显示不出来,要么javax.portlet.title=测试,要么写成Test=测试,第二种的需要在页面上用工具获得。
你好,我想问一下关于网页内容的,我创建了一个新的网页内容,但是显示的修改日期与我当前的本地时间不一致。portal设置那时区已经选择为中国。请问这是什么原因造成的?是liferay的BUG吗?
tomcat修改为GMT+08