6

我已经看过这个问题,但它谈论的是生命射线速度,并且似乎可以访问我无法访问的这个“$portal”对象。

在速度模板中创建对象

具体来说,我正在尝试在模板中创建一个 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"))

但是我仍然很好奇是否有一种方法可以通过反射来实现这一点。

4

2 回答 2

1

你做得很好,但你应该使用$localeClass.getName()or$localeClass.name而不是$localeClass.getName. 请参阅 Velocity 用户指南中的属性查找规则

这个:

#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName()

为我正确输出字符串“java.util.Locale”。

于 2013-02-12T09:36:47.143 回答
0

据我了解,您也可以使用

$localeUtil.fromLanguageId("es_ES")

用于在 Velocity 模板中获取语言环境。

至于我,我最近也尝试使用反射来获取语言环境,但没有成功。所以我很好奇它是否也有可能。

于 2012-09-07T19:39:33.377 回答