我已经看过这个问题了,但它正在讨论liferay-velocity,似乎可以访问我无法访问的'$ portal'对象。
Create object in velocity template
具体来说,我正在尝试在模板中创建一个Locale对象,将其传递给$ dateTool.format调用以获取特定语言的输出。
我无法预先创建区域设置对象并将其传递给模板,因为该代码可以调用各种模板,每种模板都可以使用不同的语言。
我试过
#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName
但是只输出'$ localeClass.getName'(我不确定$ portal是否是一些神奇的预设变量或其他东西)。
我也试过
#set($localeClass = java.util.Locale.class)
$localeClass.getName
但是当我尝试处理模板时,这给了我一个运行时异常。
我在Velocity中看到了ClassTool,但这并不支持自动执行代码。我想我可以试试像$classTool.inspect("java.util.Locale").getType.getConstructor([$classTool.inspect("java.util.String"),$classTool.inspect("java.util.String")]).newInstance(["es","ES"])
这样的东西。
我会尝试一下,但与此同时我会看到是否有其他人有更好的主意。
修改
自发布以来,我意识到velocity有一个ConversionTool(未在GenericTool概述页面上列出),它有一个我可以调用的toLocale函数。所以我可以使用
$dateTool.format('dd-MMM-yyyy', $date, $conversionTool.toLocale("es_ES"))
但我仍然很好奇是否有办法通过反思来实现这一点。
答案 0 :(得分:1)
您做得很好,但您应该使用$localeClass.getName()
或$localeClass.name
代替$localeClass.getName
。请参阅Velocity用户指南中的Property Lookup Rules。
此:
#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName()
为我正确输出字符串“java.util.Locale”。
答案 1 :(得分:0)
据我了解,您也可以使用
$localeUtil.fromLanguageId("es_ES")
用于在Velocity模板中获取区域设置。
至于我,我最近也尝试使用反射来获取语言环境,但没有成功。所以我很好奇是否有可能。