Liferay 7中ADTs本地化:如何调用自定义Portlet语言文件?
在Liferay 7 ADTs中调用自定义Portlet语言文件的解决方案
你提到的问题很常见——默认的<@liferay_ui["message"] />标签确实会优先使用Liferay全局的语言资源包,要调用自定义Portlet自己的语言文件,我们有几种可行的方案,而且不一定非要用JSP,下面详细说明:
方法1:给liferay-ui:message标签指定自定义资源包
默认标签不指定bundle属性时会用全局资源包,我们可以手动传入自定义Portlet的资源包对象:
首先,你需要知道自定义Portlet的Bundle-SymbolicName(这个配置在Portlet的bnd.bnd文件里,比如Bundle-SymbolicName: com.yourcompany.your-custom-portlet)。如果你的ADT允许嵌入少量JSP代码(大部分Liferay ADT都支持),可以先获取资源包:
<% // 替换成你的Portlet的Bundle-SymbolicName String portletBundleName = "com.yourcompany.your-custom-portlet"; ResourceBundle portletResourceBundle = ResourceBundleUtil.getBundle( "content.Language", locale, portletBundleName ); %>
之后在Freemarker部分直接使用这个资源包:
<@liferay_ui["message"] key="your-custom-language-key" bundle=portletResourceBundle />
方法2:直接用Liferay工具类获取语言值(无需JSP)
如果不想写JSP代码,也可以在纯Freemarker的ADT里直接调用ResourceBundleUtil的静态方法来获取自定义Portlet的语言值:
<#assign ResourceBundleUtil = com.liferay.portal.kernel.util.ResourceBundleUtil> <!-- 替换成你的Bundle-SymbolicName和语言键 --> ${ResourceBundleUtil.getString("content.Language", "custom-greeting", locale, "com.yourcompany.your-custom-portlet")}
这种方法完全不需要JSP,直接在Freemarker中完成调用,适合纯模板场景。
关键注意事项
- 确保你的自定义Portlet的语言文件放在正确路径:
src/main/resources/content/Language.properties(多语言文件比如Language_zh_CN.properties也要放在同一目录下)。 - 确认
bnd.bnd里的Bundle-SymbolicName配置正确,这是Liferay识别资源包的关键标识。 - ADT中的
locale变量是Liferay自动传入的,对应当前用户的语言环境,无需额外定义。
关于是否必须用JSP的问题
不需要。上面的方法2完全基于Freemarker实现,不需要依赖JSP;方法1虽然用到了一点JSP代码,但这是可选的——如果你更倾向纯模板写法,方法2是更好的选择。
内容的提问来源于stack exchange,提问作者halpdoge
相关产品推荐
相关产品推荐

